【问题标题】:How to send key events to a headless emulator in an instrumentation test?如何在仪器测试中将关键事件发送到无头模拟器?
【发布时间】:2010-07-09 16:15:55
【问题描述】:

我们目前正在开发在我们的构建服务器上运行的仪器测试套件,但是当测试在使用普通 Android 模拟器的开发机器上通过时,构建服务器上的构建失败,因为我们只运行一个无头模拟器-no-window 标志。

尝试调用InstrumentationTestCase.sendKeys() 方法以编程方式打开选项菜单时发生故障。错误是:

权限被拒绝:将关键事件从 pid 646 uid 10026 注入到 uid 1000 拥有的窗口 Window{43d55100 paused=false}

然后我们发现有一个INJECT_EVENTS 权限,但是在清单中设置它没有效果。事实上在日志中我们看到了这样的输出:

未授予 android.permission.INJECT_EVENTS 包 com.qype.radar 的权限(protectionLevel=2 flags=0x6644)

这是否意味着这个权限没用?

我们还尝试让仪器测试应用和被测应用使用android:sharedUserId 共享相同的 Linux 用户 ID 并在同一进程中运行(android:process - 我们不确定是否已经如此),但仍然没有运气。

这是否意味着目前无法在无头模拟器上运行包含关键事件的工具,还是我们遗漏了什么?

【问题讨论】:

  • INJECT_EVENTS 是一个完全有效的权限,但只能由固件持有,而不能由 SDK 应用程序持有。
  • 无赖。那么我们最好的选择是什么? Google 没有考虑过在构建服务器上运行测试吗?
  • 我刚刚使用 -wipe-data 标志重新启动了模拟器,然后构建通过了一次,然后模拟器崩溃了,再次重新启动它,现在构建再次失败......这一切都太不稳定了:-(

标签: android testing build-automation emulation instrumentation


【解决方案1】:

我在无头机器上运行没有-no-window 的模拟器,首先运行一个Xvnc 实例(即假X 服务器),然后在那个DISPLAY 中启动模拟器。

更准确地说,我得到了 XvncAndroid Emulator Jenkins 插件来为我做这件事。

不幸的是,在注入 UI 事件之前解锁屏幕仍然是一个问题,但通过自动运行这样的命令(类似于this other answer you've seen)(类似于this other answer you've seen)解决了这个问题:
echo "event send EV_KEY:KEY_MENU:1 EV_KEY:KEY_MENU:0" | nc -q1 localhost 5554


编辑:
我发现这种方法更可靠:
adb shell input keyevent 82

Some info 关于密钥代码 82。

【讨论】:

  • 听起来很有趣,我们会检查一下,谢谢!
【解决方案2】:

我在 Hudson 服务器上的测试遇到了类似的问题。就我而言,我通过 Android SDK 的建议解决了这个问题: http://developer.android.com/guide/topics/testing/testing_android.html#UITestTroubleshooting

重要的是我也必须启用主应用程序的权限。

【讨论】:

  • 嘿,太好了,我们怎么能错过呢?我们认为问题实际上是 keyguard —— 它阻止 sendKeys() 正常工作。
  • 解决方案是什么?该部分已从该页面中删除:(
  • 如果我没记错的话,解决方案是以编程方式禁用键盘保护,因为它会在每次模拟器/手机启动后激活。看看这个 sn-p:pastebin.com/v0deQGpT 当然,您会希望从生产应用程序中删除此代码;它会永久禁用键盘保护,直到下次启动。
  • 只是为了记录,克里斯托弗的答案是更好的答案,因为它不需要这个黑客。据我所知,Hudson/Jenkins 的 Android 插件也会自动为你禁用键盘保护。
猜你喜欢
  • 2022-11-02
  • 1970-01-01
  • 1970-01-01
  • 2017-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-23
相关资源
最近更新 更多