我们目前正在开发一个在我们的构建服务器上运行的检测测试套件,但是当测试使用普通的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
- 我们不确定是否已经是这样了,但仍然没有运气。
这是否意味着目前无法在无头模拟器上运行包含关键事件的乐器,或者我们是否遗漏了某些东西?
答案 0 :(得分:17)
我在无头机器上运行没有-no-window
的模拟器,首先运行一个Xvnc实例(即伪X服务器),然后在DISPLAY
中启动模拟器。
更准确地说,我得到了Xvnc和Android 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
重要的是我必须为主应用程序启用权限。