如何在仪器测试中将关键事件发送到无头模拟器?

时间:2010-07-09 16:15:55

标签: android testing build-automation emulation instrumentation

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

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

  

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

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

  

不授予android.permission.INJECT_EVENTS权限以封装com.qype.radar(protectionLevel = 2 flags = 0x6644)

这是否意味着此权限无用?

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

这是否意味着目前无法在无头模拟器上运行包含关键事件的乐器,或者我们是否遗漏了某些东西?

2 个答案:

答案 0 :(得分:17)

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

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

不幸的是,在注入UI事件之前解锁屏幕仍然是一个问题,但通过自动运行这样的命令(类似于this other answer you've seen)(hackily)解决了这个问题:
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。

答案 1 :(得分:1)

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

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