You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 10:52:14