Android:通过自动测试在/data/local/tmp中创建一个文件

Android:通过自动测试在/data/local/tmp中创建一个文件,android,linux,file-permissions,android-uiautomator,Android,Linux,File Permissions,Android Uiautomator,目标: 在设备上进行自动测试时拍摄屏幕截图。测试完成后,使用adb提取屏幕截图文件 上下文: 我目前正在尝试编写自动测试来拍摄设备屏幕的快照。使用导航,我想在测试的中间截图。UiDevice有一个方法,当我想拍摄快照时调用该方法 经过一些调查,我意识到负责将图像写入文件的类捕获了一个异常: java.io.FileNotFoundException: /data/local/tmp/screenshots/screen2.png:打开失败:EACCES (拒绝许可) 使用,我创建了该文件并将所有

目标: 在设备上进行自动测试时拍摄屏幕截图。测试完成后,使用adb提取屏幕截图文件

上下文:

我目前正在尝试编写自动测试来拍摄设备屏幕的快照。使用导航,我想在测试的中间截图。UiDevice有一个方法,当我想拍摄快照时调用该方法

经过一些调查,我意识到负责将图像写入文件的类捕获了一个异常:

java.io.FileNotFoundException: /data/local/tmp/screenshots/screen2.png:打开失败:EACCES (拒绝许可)

使用,我创建了该文件并将所有权限设置为所有用户

adb shell touch /data/local/tmp/screenshots/screen1.png
adb shell chmod 777 /data/local/tmp/screenshots
完成后,我可以使用以下内容拍摄屏幕截图:

@Test
public void takeSnapShot() {
    String filename = "/data/local/tmp/screenshots/screen1.png";
    File file = new File(filename);
    assertEquals(true, mDevice.takeScreenshot(file));
}
问题:

我希望能够在测试执行时直接创建一个文件,而无需使用adb。 我尝试使用Java直接创建一个文件

但我有个例外

java.io.IOException:打开失败:EACCES(权限被拒绝)

有人知道发生了什么事吗?我对Linux还很陌生,所以即使您觉得很明显,也不要犹豫,提出一些建议;)

我应该把这个贴上去吗

编辑

目录/数据具有以下权限

drwxrwx--x system   system            2016-01-14 14:03 data
我无法列出/data的内容,这让我相信用户“shell”不属于“system”组。我也不能列出/data/local的内容

但是,/data/local/tmp归“shell”所有

/data/local/tmp为所有用户提供+x权限

最后,目录“屏幕截图”属于拥有777权限的shell

drwxrwxrwx shell    shell             2016-01-14 11:46 screenshots
据我所知,任何用户都应该能够访问/data/local/tmp/screenshots

而不是保存在/data/local/tmp/下,使用
Environment.getExternalStorageDirectory()
。 您需要具有读/写权限才能执行此操作。您必须将这两行添加到应用程序的清单中!(我试图将这些行添加到/androidTest/Manifest.xml文件中,但没有效果)


虽然它解决了寻找一个公共目录来保存/读取屏幕截图的问题,但它也带来了一个新的目录

如果您已经拥有这两个权限,那么必须添加这两个权限并不是什么大问题。但是,如果您不想向用户请求这些权限,那么每次测试/签署应用程序时都必须添加/删除这些行,这远远不够理想

编辑:

在中,有人提议利用构建差异(调试、发布)来拥有两个不同的清单

最后,我有3个清单:

  • 发布清单(无外部读/写权限)
  • 调试清单(具有外部读/写权限)
  • 的AndroidTest清单
工具:overrideLibrary=“android.support.test.uiautomator.v18”


我认为您不应该创建稍后将被快照映像覆盖的空文件。您只需确保为输出指定的目录可由进程写入即可。谢谢。我不是Linux专家。我认为将目录权限设置为777足以允许用户向其中添加文件。不对吗?您知道允许用户在目录中创建文件所需的所有条件吗?这是正确的,但文件是您创建的。我想你应该把目录改成chmod。但是,您还需要确保所有父目录也为用户提供了r+x/data/data/local/data/local/tmp/data/local/tmp/screenshot我编辑了我的帖子,为您提供更多信息。谢谢你的回答。你能再试一件事吗:我想你想运行的代码不是在用户shell下运行的。让我们试着弄清楚。假设创建一个空文件shomewhere(不知道在哪里)并用ls查看它
drwxrwx--x shell    shell             2016-01-14 12:20 . (tmp)
drwxrwxrwx shell    shell             2016-01-14 11:46 screenshots
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />