我们目前正在开发一个在我们的构建服务器上运行的仪器测试套件,但是当测试在使用普通 Android 模拟器的开发机器上通过时,构建在构建服务器上失败,因为我们只运行一个 headless 模拟器-no-window
标志。
尝试调用 InstrumentationTestCase.sendKeys()
方法以编程方式打开选项菜单时发生故障。错误是:
Permission denied: injecting key event from pid 646 uid 10026 to window Window{43d55100 paused=false} owned by uid 1000
然后我们发现有一个 INJECT_EVENTS
权限,但是在 list 中设置它没有任何效果。事实上,在日志中我们看到了这个输出:
Not granting permission android.permission.INJECT_EVENTS to package com.qype.radar (protectionLevel=2 flags=0x6644)
这是否意味着该权限没有用?
我们还尝试使用android:sharedUserId
让instrumentation测试app和被测app共享同一个Linux用户ID,并在同一个进程中运行(android:process
-- 我们不确定是否已经是这种情况),但仍然没有运气。
这是否意味着目前无法在 headless 模拟器上运行包含关键事件的检测,或者我们是否遗漏了什么?
最佳答案
我在 headless 机器上运行没有-no-window
的模拟器,方法是首先运行一个 Xvnc 实例(即假 X 服务器),然后在那个 DISPLAY
中启动模拟器。
更准确地说,我得到了 Xvnc和 Android Emulator Jenkins 插件为我做这件事。
不幸的是,在注入(inject) UI 事件之前解锁屏幕仍然是一个问题,但这可以通过自动运行这样的命令(类似于 this other answer you've seen)来(巧妙地)解决:
echo "事件发送 EV_KEY:KEY_MENU:1 EV_KEY:KEY_MENU:0"| nc -q1 本地主机 5554
编辑:
我发现这个方法更可靠:
adb shell 输入keyevent 82
Some info关于键码 82。
关于android - 如何在仪器测试中将关键事件发送到 headless 模拟器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3214531/