【问题标题】:Android : Create a file in /data/local/tmp from an automated testAndroid : 在 /data/local/tmp 中通过自动化测试创建一个文件
【发布时间】:2016-04-19 18:24:31
【问题描述】:

目标: 在设备上进行自动测试期间截取屏幕截图。测试完成后使用 adb 拉取屏幕截图文件。

上下文:

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

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

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

使用adb,我创建了文件并将所有权限设置给所有用户。

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。 我尝试使用 createNewFile 直接从 Java 创建文件。

try {
     file.createNewFile();
} catch (IOException e) {
     e.printStackTrace();
}

但我得到一个 IOException

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

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

我应该把它发到superuser 上吗?

编辑

目录/data有这些权限

drwxrwx--x system   system            2016-01-14 14:03 data

我无法列出/data 的内容,这让我相信用户“shell”不属于“system”组。我也无法列出 /data/local 的内容。

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

drwxrwx--x shell    shell             2016-01-14 12:20 . (tmp)

/data/local/tmp 向所有用户授予 +x 权限。

最后,“screenshots”目录属于权限为777的shell。

drwxrwxrwx shell    shell             2016-01-14 11:46 screenshots

据我了解,任何用户都应该能够访问 /data/local/tmp/screenshots

【问题讨论】:

  • 我认为您不应该创建一个稍后将被快照图像覆盖的空文件。您只需要确保您为输出指定的目录可被进程写入。
  • 谢谢。我不是 Linux 专家。我认为将目录权限设置为 777 足以让用户向其中添加文件。不正确吗?您知道允许用户在目录中创建文件所需的所有条件吗?
  • 没错,但您创建了文件。我认为你应该 chmod 目录。但是您还需要确保所有父目录也有 r+x 供用户使用。 /data /data/local /data/local/tmp /data/local/tmp/screenshots
  • 我编辑了我的帖子以便为您提供更多信息。谢谢你的回答。
  • 你能再尝试一件事吗:我猜你想运行的代码不在用户 shell 下运行。让我们试着弄清楚。假设在 shomewhere(不知道在哪里)创建一个空文件,然后用 ls 查看它。

标签: android linux file-permissions android-uiautomator


【解决方案1】:

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

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

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

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

编辑:

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

最后,我有 3 个清单:

  • 发布清单(无外部读/写权限)
  • 调试清单(具有外部读/写权限)
  • AndroidTest 清单用于

工具:overrideLibrary="android.support.test.uiautomator.v18"

【讨论】:

  • 只能在调试清单中添加这两行:src/debug/AndroidManifest.xml
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-18
  • 1970-01-01
  • 2011-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多