|
起因:想将测试log和截图保存到SD卡中,最近使用UIAutomator 2.0 写的测试脚本,在Android 6.0 以上手机上执行的时候会有权限问题。例如想在SD卡上创建一个文件来存储测试过程中产生的中间数据,这时6.0的android系统就会提示读写权限的问题。当然如果想读取手机内部信息也同样会面临着这样权限的提示。同类的问题解决方法如下。
问题分析:
从 Android 6.0(API 23)开始,用户开始在应用运行时向其授予权限,而不是在应用安装时授予。这种权限机制可以让用户更好的管理应用的权限,保障用户隐私。
问题解决:
首先要在manifest里进行权限申请,
思路一:测试apk装的时候用-g参数,这样默认所有权限直接授权,不用动态申请了。
思路二:不用到M/N/O的特性的话,指定编译的sdk为L也可以绕过。
思路三:执行adb 命令:(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { getInstrumentation().getUiAutomation().executeShellCommand( "pm grant " + getTargetContext().getPackageName() + " android.permission.WRITE_EXTERNAL_STORAGE"); getInstrumentation().getUiAutomation().executeShellCommand( "pm grant " + getTargetContext().getPackageName() + " android.permission.READ_EXTERNAL_STORAGE"); }
最终选择思路三。
思路一,在6.0以下的手机上安装会提示Error: Unknown option: -g。
思路二,公司的手机版本大多是L以上的。
1. 如果uiautomator脚本是写在被测试App源代码代码的test目录中,那么我们就直接把所需要的权限加到被测试App的AndroidManifest.xml文件中即可。 2. 往往我们的测试都是黑盒的,并不会把测试脚本与被测试App写在一起,这时使用AS开发的时候源代码里面就不会包含AndroidManifest.xml这个问题,那么我们需要在工程的main目录下创建一个这样的文件
我们创建的这个AndroidManifest.xml文件内容只需要写上我们想要申请的权限即可
在AndroidManifest.xml中加完了权限后,还需要做如下操作才能真正的解决这个问题。
uiautomator虽然单独做为一个工程,但是当我们查看测试代码工程编译的结果会发现实际上是两个apk文件
这两个apk一个是包含了我们测试脚本的测试apk,另一个apk就是包含了我们刚刚添加了各种权限打包而成的,通过命令将这个apk手动安装到手机里面,这里关键是要加上-g这个参数的意义是授予应用程序清单中列出的所有权限(仅限Android 6.0)。这样我们再执行测试脚本就不会出现前面提到的权限问题了。 3. 简单说一下我理解的这么做的原理
使用uiautomator1.0的时候我们没有遇到这样的问题(使用Eclipse开发环境)。uiautomator1.0的脚本最后是打包成为了一个可执行的jar文件,我理解这个jar文件凌驾于apk之上,所以可以操作其他apk的任何界面。不过到6.0之后的版本是不是会有权限问题,这个还没有经过验证
当切换成了Android Studio编译环境,相应的runner也进化配置成为了“AndroidJUnitRunner”,这是我们发现打包后的uiautomator不再是原来的jar而是变成了一个testapk。刚刚提到打包文件夹里面有两个apk,一个是我们的testapk,一个是源程序apk,如果我们不是把测试脚本放在源代码中那么就是个是空的apk,这个空的apk就是测试apk依托的一个假的工程文件。我们把权限写在AndroidManifest.xml 里面就是通过这个依托的apk来简介获得到权限。
|
|