我很久以前就添加了带有
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"))
}
)
如果使用
StartupMode.COLD
,应用程序进程将在
执行 setupBlock
和 measureBlock
以允许应用程序准备
无需启动该过程。
如果您需要进程保持活动状态,请使用
StartupMode.WARM
,重新启动活动而不重新启动进程,或者
将 startupMode
设置为 null
并在 killProcess()
内调用 setupBlock
。
您可以订阅b/278214396以获取有关此内容的更多更新。