android - 如何在仪器测试中将关键事件发送到 headless 模拟器?

标签 android testing build-automation emulation instrumentation

我们目前正在开发一个在我们的构建服务器上运行的仪器测试套件,但是当测试在使用普通 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 中启动模拟器。

更准确地说,我得到了 XvncAndroid 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/

相关文章:

android - 保存一张花了很长时间的照片

python - 如何在远程服务器上启动一个进程,断开连接,然后收集输出?

python - 是否有用于 python 的数据库测试工具(如 sqlunit)?

sharepoint - 如何让 teamcity 在每次成功构建时运行 .bat 文件?

android fragment 在列表中显示sqlite数据

android - 实时图像也在离线(无互联网)模式下显示 - Ionic 3 App

build-automation - 使用 CruiseControl.NET 指定目标平台

build-automation - 有希望的替代方案吗?

android - 在 Android 中使用 AlarmManager 启动日常服务?

c# - 测试使用 Windows 身份验证的 Intranet 站点