如何在仪器testing中将关键事件发送给无头模拟器?

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

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

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

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

不授予权限android.permission.INJECT_EVENTS包com.qype.radar(protectionLevel = 2标志= 0x6644)

这是否意味着这个许可是无用的?

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

这是否意味着目前无法在无头模拟器上运行包含关键事件的乐器,或者我们错过了什么?

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

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

我通过首先运行一个Xvnc实例(即假的X服务器),然后在该DISPLAY启动该模拟器,在无头机器上运行模拟器而不使用无-no-window

更准确地说,我得到了Xvnc和Android模拟器 Jenkins插件为我做这个。

不幸的是,在注入UI事件之前,解锁屏幕仍然是一个需要注意的事情,但是通过自动运行一个像这样的命令来解决这个问题(类似于你已经看到的其他答案 ):
echo "event send EV_KEY:KEY_MENU:1 EV_KEY:KEY_MENU:0" | nc -q1 localhost 5554


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

有关键码82的一些信息 。