Android Emulator运行后如何获取其序列号或ID?
如果我在一台机器上运行多个带-无窗口选项的模拟器。命令“adb设备”显示: 然而,根据这个输出,我根本无法区分每个模拟器设备之间的区别。我需要知道哪个模拟器在哪个AVD上运行,然后我可以安装APK或向模拟器发送命令Android Emulator运行后如何获取其序列号或ID?,android,emulation,Android,Emulation,如果我在一台机器上运行多个带-无窗口选项的模拟器。命令“adb设备”显示: 然而,根据这个输出,我根本无法区分每个模拟器设备之间的区别。我需要知道哪个模拟器在哪个AVD上运行,然后我可以安装APK或向模拟器发送命令 如何识别每个仿真器设备或在其运行后获取仿真器的序列号?仿真器窗口的标题栏中显示相同的字符串(例如,emulator-5554)。始终在相同的端口上启动相同的AVD,不要让仿真器决定。 使用 然后,序列号将是emulator-X,并且您的avd_X将始终位于端口X,Y,因此您可以使用此
如何识别每个仿真器设备或在其运行后获取仿真器的序列号?仿真器窗口的标题栏中显示相同的字符串(例如,
emulator-5554
)。始终在相同的端口上启动相同的AVD,不要让仿真器决定。
使用
然后,序列号将是emulator-X,并且您的avd_X将始终位于端口X,Y,因此您可以使用此序列号运行命令,例如
$ adb -s emulator-X shell cmd
要终止模拟器运行,请执行以下操作
$ adb -s emulator-X emu kill
我知道有两种方法可以执行从序列号到AVD名称的反向查找 Telnet选项-丑陋的方式 正如本文所指出的。。。您可以使用Telnet反向查找每个序列号的AVD名称。这有点弱,因为您所做的只是查找给定特定AVD名称启动的仿真器的实例。它不会唯一标识您要使用的模拟器。它还需要使用telnet并解析出每个模拟器的端口号 首先获取当前运行的序列号
adb devices
然后将telnet连接到每个设备的端口号
telnet localhost 5554
并发出命令
avd name
它将返回该仿真器的AVD名称
UUID选项-正确的方法
我最初在一个名为的项目中看到了这一点。生成UUIDuuidgen
,并在启动时在模拟器上设置属性!我的示例启动一个模拟器,对需要在目标上运行代码以确定类型信息的库执行一些编译时检查
emulator -avd nexus19-arm -no-window -no-boot-anim -noaudio -prop emu.uuid=7a6f8701-43c2-4e16-988a-8b4992c0bf8d >/dev/null </dev/null 2>&1 &
在循环中:
for SERIAL_NUMBER in `adb devices| grep emulator| cut -f1`; do
UUID=`adb -s ${SERIAL_NUMBER} shell getprop emu.uuid | tr -d '\r\n'`
echo ${SERIAL_NUMBER} ${UUID}
done
跟踪整个仿真器生命周期
adb-s${SERIAL\u NUMBER},等待设备
,这样你就知道什么时候可以和模拟器通话了sys.boot\u completed
adb-s${SERIAL\u NUMBER}emu kill杀死模拟器
谢谢你的回复。我必须在没有窗口选项的情况下运行所有模拟器。因此,没有窗口标题栏。请解释一下,您是如何进行Android应用程序开发的,这种开发方式要求您运行多个模拟器,每个模拟器都带有-no-window选项。我尝试在同一台服务器上同时自动运行多个项目的测试用例。为了不干扰测试结果,我认为最好为每个项目创建一个AVD。因此,我必须识别每个模拟器,以便使用shell脚本安装正确的APK并发送正确的命令。如果没有更好的方法获得模拟器的序列号,我将在启动模拟器之前和之后区分“adb设备”命令的输出以确定序列号。首先,这是一个非常酷的设置。但是,是的,我怀疑diff或其他东西可能是获取仿真器ID的最佳选择。我没有使用-没有窗口-我假设它没有将仿真器ID转储到stdout或其他东西,作为执行命令的一部分。@dtmilano-注意OP对此有一个问题,3年多后仍然是一个很好的答案。稍微简化(至少从emulator 22.0.5.0开始):使用
-port
而不是-port
只允许指定一个端口号;e、 g.$emulator-port 5556@avd_X
;请注意,在这种情况下,端口号必须是介于5554和5584之间的偶数(奇怪的是,使用-ports
不会施加此范围限制)。@mklement0如果您喜欢这个答案,您会喜欢我的答案。@CameronLowellPalmer,不同的是,在这种情况下,你事先知道哪个模拟器是哪个,在另一种情况下,你必须搜索才能找到它。在另一种情况下,你永远不会知道。您只知道哪个AVD用于启动仿真器。如果有10个模拟器在运行,你将永远不知道哪一个是你正在寻找的,而不使用某种唯一的标识符启动它。从技术上讲,这些是序列号。你想要的是反向查找AVD名称。这看起来是一个很好的解决方案,但我只能以“丑陋的方式”工作。我无法读取启动仿真器时设置的属性。我得到的只是一个空行。这个“正确的方式”选项是否中断了,或者是否有其他一些技巧可以让它工作?显然,最多有247个属性,较新的AVD使用默认属性达到这个最大值,这会阻止您添加自己的属性。我想这意味着“丑陋的方式”是目前唯一有效的方式。
emulator -avd nexus19-arm -no-window -no-boot-anim -noaudio -prop emu.uuid=7a6f8701-43c2-4e16-988a-8b4992c0bf8d >/dev/null </dev/null 2>&1 &
adb -s emulator-5556 shell getprop emu.uuid
for SERIAL_NUMBER in `adb devices| grep emulator| cut -f1`; do
UUID=`adb -s ${SERIAL_NUMBER} shell getprop emu.uuid | tr -d '\r\n'`
echo ${SERIAL_NUMBER} ${UUID}
done