如何为Android已认证私有页面生成Baseline Profile?
如何在Macrobenchmark中访问已登录后的私有页面以生成Baseline Profile?
要针对已登录后的私有页面生成Baseline Profile,核心是在基准测试流程中完成登录状态的初始化或UI交互,确保测试覆盖到私有页面的代码路径。以下是具体实现方案:
1. 预初始化登录状态
利用Firebase Auth的登录状态持久化特性,在测试的setupBlock中提前完成登录操作,确保后续测试启动应用时直接处于已登录状态:
@LargeTest @RunWith(AndroidJUnit4::class) class SampleStartupBenchmark { @get:Rule val benchmarkRule = MacrobenchmarkRule() private val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) private const val TEST_USER = "your_test_account" private const val TEST_PASS = "your_test_password" @Test fun privateScreenBenchmark() = benchmarkRule.measureRepeated( packageName = TARGET_PACKAGE, metrics = listOf(StartupTimingMetric(), BaselineProfileMetric()), // 加入BaselineProfileMetric iterations = DEFAULT_ITERATIONS, setupBlock = { pressHome() // 提前完成登录并返回桌面 loginIfNeeded() } ) { startActivityAndWait() // 验证私有页面已加载 device.wait(Until.hasObject(By.res(TARGET_PACKAGE, "private_page_root_layout")), 5000) // 执行私有页面的关键交互,覆盖核心代码路径 device.findObject(By.res(TARGET_PACKAGE, "private_page_action_btn")).click() device.findObject(By.res(TARGET_PACKAGE, "private_page_list")).scrollForward() } private fun loginIfNeeded() { startActivityAndWait() // 检查是否已在私有页面,否则执行登录 if (device.findObject(By.res(TARGET_PACKAGE, "private_page_root_layout")) == null) { // 定位登录控件并输入信息 device.findObject(By.res(TARGET_PACKAGE, "et_username")).apply { clearTextField() text = TEST_USER } device.findObject(By.res(TARGET_PACKAGE, "et_password")).apply { clearTextField() text = TEST_PASS } // 点击登录按钮并等待页面跳转 device.findObject(By.res(TARGET_PACKAGE, "btn_login")).click() device.wait(Until.hasObject(By.res(TARGET_PACKAGE, "private_page_root_layout")), 8000) } // 返回桌面,准备下一次测试启动 pressHome() } }
2. 依赖配置
确保在模块的build.gradle中添加UiAutomator依赖,用于UI元素定位与交互:
androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.2.0'
关键注意事项
- 控件定位优先用资源ID:避免使用文本或坐标定位,提升测试稳定性,尤其是多语言环境下。
- 等待页面加载:使用
device.wait()配合Until条件,确保页面或控件加载完成后再执行下一步操作,避免测试失败。 - 覆盖核心路径:在私有页面中模拟用户常用操作(如点击按钮、滚动列表等),让Baseline Profile包含这些高频路径的预编译优化信息。
- 状态隔离:如果测试需要在每次迭代前重置状态,可在
setupBlock中添加清除应用数据的逻辑(需注意权限)。
内容的提问来源于stack exchange,提问作者Binh Ho
相关产品推荐
相关产品推荐

