我正在开发一个基于JUnit的远程自动化Android测试框架(测试在Android外部运行,与其内部代码交互)。它一切正常,但有一个问题,当我自动启动一个新模拟器时,屏幕会一开始就被锁定。这似乎影响了我的测试能否运行,而且我想观察测试运行的情况(按钮点击、文本输入等)。如果我手动启动模拟器并解锁它的屏幕,一切都正常。
有没有办法在Android上以编程方式解锁屏幕?使用Java API、命令行或Shell命令等方法都可以。除此之外,也许有一种方法可以启动一个已解锁的模拟器吗?
我正在开发一个基于JUnit的远程自动化Android测试框架(测试在Android外部运行,与其内部代码交互)。它一切正常,但有一个问题,当我自动启动一个新模拟器时,屏幕会一开始就被锁定。这似乎影响了我的测试能否运行,而且我想观察测试运行的情况(按钮点击、文本输入等)。如果我手动启动模拟器并解锁它的屏幕,一切都正常。
有没有办法在Android上以编程方式解锁屏幕?使用Java API、命令行或Shell命令等方法都可以。除此之外,也许有一种方法可以启动一个已解锁的模拟器吗?
您可以通过其控制台接口与模拟器进行交互。
如果您曾经想知道为什么您的模拟器以像5554这样的数字开头 - 那是因为那是模拟器正在侦听的端口。
您可以使用adb devices
命令查找运行模拟器的端口。它将输出类似于此的内容:
C:\>adb devices
List of devices attached
emulator-5554 device
所以你可以使用类似以下命令连接到模拟器:
telnet localhost 5554
如果成功连接,您将获得一个“OK”提示符,并可以开始输入命令。
有各种各样的命令,但我们感兴趣的是用event
来模拟硬件事件。我们可以通过按下菜单键来解锁屏幕,使用以下命令进行模拟:event send EV_KEY:KEY_MENU:1 EV_KEY:KEY_MENU:0
EV_KEY:KEY_MENU:1
表示按下菜单键,EV_KEY:KEY_MENU:0
表示对应的松开按键事件。请确保两者都有否则菜单键会一直被按下。
我知道编写这个脚本并不容易,但这是我能想到的解决方法。
编辑:我认为 event send EV_KEY:KEY_MENU:1 EV_KEY:KEY_MENU:0
并不能模拟 Menu 键,但如果我在启动模拟器后立即运行该命令,则可以解锁它。不确定原因,但我想这是一个开始。
在使用 Android SDK r18 和 r20 连接到一个 4.0.3 (API 15) 模拟器时,对我有效的一行代码:
adb shell input keyevent 82
试试这个脚本:
echo "event send EV_KEY:KEY_SOFT1:1" | nc -q1 localhost 5554
sleep 0.1
echo "event send EV_KEY:KEY_SOFT1:0" | nc -q1 localhost 5554
sleep 0.1
echo "event send EV_KEY:KEY_SOFT1:1" | nc -q1 localhost 5554
sleep 0.1
echo "event send EV_KEY:KEY_SOFT1:0" | nc -q1 localhost 5554
sleep 0.1
如果屏幕没有密码,最简单的解锁方式是通过传递一个KEYCODE_MENU事件; 但是,如果屏幕已经解锁,这实际上会打开一个菜单,这可能不是您要查找的功能。
如果您想要一种简单的方法来确保屏幕被解锁而不会意外打开菜单,您应该首先传入一个KEYCODE_POWER事件。这将确保设备处于锁定状态,因此菜单事件只会解锁屏幕。
adb shell input keyevent KEYCODE_POWER; adb shell input keyevent KEYCODE_MENU
我使用shell完成了这个操作:
adb shell
#input keyevent 82
您可以通过在命令提示符中运行此命令来锁定您的模拟器设备
adb shell input keyevent 26
adb shell input keyevent 82
运行解锁命令后,您可能需要等待几分钟。 当您没有任何安全锁时,上述解锁命令将起作用。
event
命令:未找到命令:event
。 - Drew Stephens