Android P预览版导致UiAutomator测试出现API兼容性错误
嘿,这个问题我太熟了!在Android P预览版刚推出那会儿,好多用UiAutomator做插桩测试的开发者都踩过这个坑。本质原因是Android P开始严格限制非SDK接口的调用,而UiAutomator的底层实现刚好用到了一些被系统标记为“受限”的非SDK接口,直接触发了这个兼容性警告弹窗。
下面给你几个实用的解决方案,按优先级排序:
1. 升级UiAutomator依赖版本
Google在后续的UiAutomator更新中已经针对Android P的限制做了适配,如果你还在用旧版本的库,赶紧升级试试。在Module级的build.gradle里更新依赖:
androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.2.0' // 也可以直接用最新稳定版,比如2.3.0+
升级后重新编译测试,大概率能直接解决问题——新版本已经替换了那些受限的接口调用,从根源避免了警告触发。
2. 临时关闭非SDK接口检测(仅测试环境用)
如果升级依赖后还是有问题,或者你暂时没法升级,可以用adb命令临时关闭系统的非SDK接口检测警告。在终端执行:
adb shell settings put global hidden_api_policy 1
这个命令会让系统忽略非SDK接口的调用警告,不过重启设备后会失效,只适合测试场景使用,绝对不要在生产设备上执行。
3. 提前处理兼容性弹窗(兜底方案)
如果上面两种方法都不适用,你可以在测试代码里先判断并关闭这个弹窗,再执行原本的操作。示例代码如下:
// 获取UiDevice实例 UiDevice device = UiDevice.getInstance(getInstrumentation()); // 定位兼容性提示弹窗 UiObjectCompat alertDialog = device.findObject(new UiSelector().textContains("Detected problems with API compatibility")); // 如果弹窗存在,点击确认按钮(根据实际按钮文本调整) if (alertDialog.exists() && alertDialog.isEnabled()) { UiObject okBtn = alertDialog.findObject(new UiSelector().text("OK")); if (okBtn.exists()) { okBtn.click(); } } // 再执行原本的按钮点击操作 onView(withId(R.id.button_activity_login)).perform(click());
注意:这个方案比较“粗暴”,如果系统弹窗的文本有变化,代码就会失效,所以只作为兜底选项。
4. 优先用Espresso替代UiAutomator(针对应用内操作)
看你的代码用了onView(withId(...)),这其实是Espresso的写法~如果你的测试只是针对自己应用内的控件操作,完全可以用Espresso替代UiAutomator的相关逻辑。Espresso是基于Instrumentation的,更贴近应用层,不会触发底层的非SDK接口调用,自然也就不会弹出这个警告了。
内容的提问来源于stack exchange,提问作者CoderSpinoza

