Macrobenchmark测试中如何模拟TV遥控器的按键事件(点击与长按)?
在Macrobenchmark中模拟TV遥控器按键操作
核心逻辑说明
在Macrobenchmark的profileBlock中,通过BenchmarkScope提供的instrumentation实例发送按键事件,实现遥控器点击、长按的模拟。系统默认的sendKeyDownUpSync方法对应普通点击,长按则需要拆分按下、延迟、抬起三个步骤。
1. 模拟普通点击按键
直接使用sendKeyDownUpSync方法,该方法会自动发送按键按下和抬起的完整事件,适用于Dpad方向键、确认键等常规点击操作。
示例代码:
// 模拟Dpad DOWN点击 scope.instrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_DOWN) // 模拟确认键(OK键)点击 scope.instrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_ENTER)
2. 模拟长按按键
长按需要手动拆分事件:先发送按键按下事件,等待一段符合系统长按阈值的时间(通常500ms以上),再发送按键抬起事件。
示例代码(长按Dpad UP):
// 发送Dpad UP按下事件 scope.instrumentation.sendKeySync(KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_UP)) // 模拟长按延迟(可根据应用响应调整,示例为600ms) Thread.sleep(600) // 发送Dpad UP抬起事件 scope.instrumentation.sendKeySync(KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DPAD_UP))
完整测试示例
结合启动应用、点击、长按操作的完整Macrobenchmark测试:
@Macrobenchmark fun tvRemoteControlPerformanceTest() = benchmarkRule.measureRepeated( packageName = "com.your.tv.app.package", metrics = listOf(FrameTimingMetric(), StartupTimingMetric()), iterations = 5, startupMode = StartupMode.COLD ) { scope -> // 回到Home页,冷启动应用 scope.pressHome() scope.startActivityAndWait() // 等待应用初始化完成 Thread.sleep(1000) // 模拟Dpad RIGHT点击,切换焦点 scope.instrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_RIGHT) Thread.sleep(300) // 长按Dpad DOWN,触发批量操作(如列表快速滚动) scope.instrumentation.sendKeySync(KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_DOWN)) Thread.sleep(800) scope.instrumentation.sendKeySync(KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DPAD_DOWN)) Thread.sleep(500) // 点击确认键 scope.instrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_ENTER) }
注意事项
- 延迟时间(
Thread.sleep)需根据应用实际响应速度调整,避免操作过快导致UI未完成响应。 - 确保测试时应用处于前台,
scope.startActivityAndWait()已确保应用启动并处于活跃状态。 - 按键KeyCode需匹配TV遥控器的实际按键,常用KeyCode包括:
KEYCODE_DPAD_UP/DOWN/LEFT/RIGHT、KEYCODE_ENTER、KEYCODE_BACK等。
内容的提问来源于stack exchange,提问作者Rahul Rawat
相关产品推荐
相关产品推荐

