UiAutomation injectInputEvent注入屏幕点击事件

参考链接


How to inject click event with Android UiAutomation.injectInputEvent

Android跳转权限设置页面

最近项目上有个需求,读取通讯录。当用户点了拒绝访问通讯录或者其他权限,导致无法使用,这时候我想重新打开权限设置,但是对于很多小白用户不知道怎么设置,这就会导致用户体验不友好的一面。

之前已经有人写过类似的文章,不过都比较分散,经实测将这些方法总结了一下。

要跳转的权限设置界面如图:目前手上只有华为和小米作为测试

继续阅读Android跳转权限设置页面

国产手机Android R(Android 11)系统执行Espresso UI(AndroidX)遇到的问题总结

最近在 Android R(Android 11)系统上执行以前写的Espresso UI(AndroidX)单元测试用例的时候,发现在 联想拯救者电竞手机Pro(128GB) 系统版本 12.5.225上,如果测试用例申请了通讯录写入权限,如下:

那么测试用例执行的时候,会报告如下错误:

详细的logcat日志如下:

目前测试发现,即使通过GrantPermissionRule授予权限,也是没用的,代码根本来不及执行,应用就一下被系统杀死了。

目前只能是不测试这部分功能。

OPPO/VIVO/小米等手机上,需要手工开启 后台弹出界面权限 才能执行单元测试。有个思路是通过UI Automator来自动开启这个权限,暂时还需要测试一下。

参考链接


Android R(11) ContentResolver报错java.lang.IllegalArgumentException: Invalid token limit

Android 11执行如下代码:

会出现如下错误:

原因为 Android 11 上使用 ContentResolver 的时候,已经不允许进行 SQL语句拼接,主要是为了防止 SQL注入攻击。

代码参考如下:

参考链接


limiting number of rows in a ContentResolver.query() function

Robolectric/PowerMock测试AIDL相关类

在编写单元测试用例的时候,如果被测试类是与AIDL相关的类,不管是直接调用,还是被测试类继承了AIDL生成的类,由于AIDL类是在编译期间动态生成的,并且每次构建都会重新生成一次(类名相同,但是Hash可能会变,文件修改日期必然变更)。

然而,由于PowerMock调用Objenesis库为了加快编译速度,会缓存同名的类,这样导致在运行时进行类型转换的时候无法通过校验,报告如下错误:

解决方法就是阻止Objenesis的缓存功能。在测试用例的根目录下新建文件,如下:

参考链接


Android与JavaScript交互数据上限(Base64图片传输问题)

使用webview.loadUrlJavaScriptBase64格式的较大图片时,有的Android版本上不反馈任何错误信息,只是页面接收不到任何信息,传入的脚本不执行任何操作。

有的则报错,如下:

继续阅读Android与JavaScript交互数据上限(Base64图片传输问题)

Missing essential plugin: org.jetbrains.android

今天升级到 Android Studio Arctic Fox | 2020.3.1 出现了如下错误:

继续阅读Missing essential plugin: org.jetbrains.android

Android Studio项目使用命令行运行测试

使用 Gradle 运行单元测试

借助 Android Plugin for Gradle,您可以通过命令行在 Gradle 项目中运行单元测试。如需详细了解如何为应用构建单元测试,请参阅构建有效的单元测试

下表总结了如何使用 Gradle 运行单元测试:

单元测试类型 要运行的命令 测试结果所在的位置
本地单元测试 调用test任务:

HTML 测试结果文件:path_to_your_project/module_name/build/reports/tests/目录。

XML 测试结果文件:path_to_your_project/module_name/build/test-results/目录。

插桩单元测试 调用 connectedAndroidTest 任务:

HTML 测试结果文件:path_to_your_project/module_name/build/reports/androidTests/connected/目录。

XML 测试结果文件:path_to_your_project/module_name/build/outputs/androidTest-results/connected/目录。

参考链接


使用命令行运行测试

修复Robolectric 4.6.x报错Failed to transform bcprov-jdk15on-1.68.jar

参照 Android Studio 3.6.3/4.0/4.1/4.2配置Robolectric-4.5.1,Powermock-1.6.6单元测试环境 配置执行单元测试。

项目使用 Android Studio 4.1.3 ,Android Gradle构建工具(AGP)版本

单元测试使用的 Robolectric4.5.x 升级到 4.6.x ,编译时产生如下报错:

问题排查了一下,发现 Robolectric 4.6.x 引入了 bcprov-jdk15on-1.68.jar ,这个库是使用 Java 15 编译的。

如果项目在 gradle.properties 中配置了 android.enableJetifier=true (目的是转换第三方不支持 AndroidX 的依赖,用以使整个工程升级到 AndroidX ), 当 Jetifier 小于等于 Jetifier 1.0.0-beta10时,无法反编译高于 Java 13 编译的代码库,进而引起上面的报错。

目前(2021/07/22)最新的 Android Studio 4.2.2 ,Android Gradle构建工具(AGP)版本

依旧没有完成适配工作。

官方回复是 Android Gradle构建工具(AGP) 7.x版本修复,估计要到Android Studio 4.3 版本了。

目前的解决方法是在 gradle.properties 中配置 Jetifier 忽略 bcprov 库。比较庆幸的是 bcprov 库跟 AndroidX 没什么关系,因此忽略这个库是安全的。

如下:

参考链接


关于Android Studio单元测试中“Method d in android.util.Log not mocked.”问题的解决

关于Android Studio单元测试中“Method d in android.util.Log not mocked.”问题的解决。

一般发生在 Robolectric 3.x 版本上,比如 Robolectric 3.8

解决方案:

打开对应模块的build.gradle文件

参考链接


关于Android Studio单元测试中“Method d in android.util.Log not mocked.”问题的解决。