Android Macrobenchmark 1.2.4:StartupMode.COLD 打破了基准测试。在测量块 UiAutomator 内找不到任何对象

问题描述 投票:0回答:1

我很久以前就添加了带有

StartupTimingMetric
FrameTimingMetric
指标的宏基准模块,并且我的设置运行良好。从那时起,由于某些原因,我没有运行基准测试。最近,有时间回去更新用户流程并再次运行基准测试。但我的
FrameTimingMetric
基准测试在运行
measureBlock
的步骤中开始失败。
UiAutomator
无法通过
measureBlock
内的资源 ID 找到任何对象,但可以在
setupBlock
中看到所有对象。我正在使用 Compose,并且添加了必要的可组合项
testTag

一年前,当我最初添加基准时,它工作得很好,但现在它们停止了。最后我设法通过删除

startupMode = StartupMode.COLD
解决了这个问题。我不知道为什么这个标志只影响
measureBlock
中可组合项的可见性,而
setupBlock
则工作得很好。

有人可以帮助我理解为什么会发生这种情况吗?

// NOT working case

        rule.measureRepeated(
            packageName = InstrumentationRegistry.getArguments().getString("targetAppId")
                ?: throw Exception("targetAppId not passed as instrumentation runner arg"),
            metrics = listOf(FrameTimingMetric()),
            compilationMode = compilationMode,
            startupMode = StartupMode.COLD,
            iterations = 10,
            setupBlock = {
                pressHome()
                startActivityAndWait()
                // other setup methods
                // "MyList" is visible here and list var is NOT null
                // val list = device.findObject(By.res("MyList"))
            },
            measureBlock = {
                // "MyList" is NOT visible here and list var IS null
                val list = device.findObject(By.res("MyList"))
            }
        )
// Working case

        rule.measureRepeated(
            packageName = InstrumentationRegistry.getArguments().getString("targetAppId")
                ?: throw Exception("targetAppId not passed as instrumentation runner arg"),
            metrics = listOf(FrameTimingMetric()),
            compilationMode = compilationMode,
            // startupMode = StartupMode.COLD,      // <- REMOVE this line
            iterations = 10,
            setupBlock = {
                pressHome()
                startActivityAndWait()
                // other setup methods
                // "MyList" is visible here and list var is NOT null
                // val list = device.findObject(By.res("MyList"))
            },
            measureBlock = {
                // "MyList" is visible here and list var is NOT null
                val list = device.findObject(By.res("MyList"))
            }
        )
android android-uiautomator macrobenchmark
1个回答
0
投票

如果使用

StartupMode.COLD
,应用程序进程将在 执行
setupBlock
measureBlock
以允许应用程序准备 无需启动该过程。

如果您需要进程保持活动状态,请使用

StartupMode.WARM
,重新启动活动而不重新启动进程,或者 将
startupMode
设置为
null
并在
killProcess()
内调用
setupBlock

您可以订阅b/278214396以获取有关此内容的更多更新。

© www.soinside.com 2019 - 2024. All rights reserved.