Android UI测试中ActivityScenarioRule运行速度远慢于ActivityScenario问题咨询
问题原因
你看到的卡顿界面是系统等待Activity启动就绪的加载界面,触发该问题的核心原因有3个:
- 测试依赖库版本缺陷:
androidx.test:core和androidx.test:rules1.3.0及以下版本存在已知的ActivityScenarioRule性能问题,规则内部的应用空闲状态等待逻辑超时阈值设置不合理,会导致每次启动Activity时无意义等待30秒以上。 - 系统动画未关闭:模拟器默认开启窗口动画、过渡动画、动画程序时长缩放,
ActivityScenarioRule的空闲检测逻辑会等待所有动画执行完成才会标记测试就绪,进一步拉长了等待时间。 - 默认启动参数冗余:
ActivityScenarioRule默认启动Activity时会携带清空任务栈的FLAG,相比直接调用ActivityScenario.launch()的默认配置,额外触发了系统任务栈清理的逻辑,老旧模拟器上该操作耗时极长。
解决方法
1. 升级测试依赖库
将测试相关依赖升级到1.4.0及以上稳定版本,修复官方已知的性能缺陷:
androidTestImplementation 'androidx.test:core:1.5.0' androidTestImplementation 'androidx.test:rules:1.5.0'
2. 关闭模拟器系统动画
执行以下adb命令关闭所有系统动画,避免空闲检测等待动画执行:
adb shell settings put global window_animation_scale 0 adb shell settings put global transition_animation_scale 0 adb shell settings put global animator_duration_scale 0
也可以手动在模拟器的「开发者选项」中找到这三个动画设置项,全部调整为「关闭」。
3. 自定义ActivityScenarioRule启动参数
如果升级依赖后仍存在卡顿,可以自定义规则,修改启动Activity的Intent配置,跳过不必要的任务栈清理逻辑:
@Rule public ActivityScenarioRule<MyActivity> rule = new ActivityScenarioRule<>( new Intent(Intent.ACTION_MAIN).setClass(ApplicationProvider.getApplicationContext(), MyActivity.class) .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) );
4. 可选:懒加载启动Activity
如果部分测试不需要启动Activity,可以使用懒加载规则,只在需要的时候才启动Activity,进一步节省时间:
@Rule public ActivityScenarioRule<MyActivity> rule = ActivityScenarioRule.<MyActivity>builder() .setLaunchActivity(false) .build(); @Test public void testNeedActivity() { ActivityScenario<MyActivity> scenario = rule.getScenario(); scenario.launchActivity(null); // 测试逻辑 }
内容的提问来源于stack exchange,提问作者Gtomika
相关产品推荐
相关产品推荐

