运行后如何获取Android模拟器的序列号或ID?

pap*_*agi 11 android emulation

如果我在一台机器上使用-no-window选项运行多个模拟器.命令"adb devices"显示:

List of devices attached
emulator-5554  device
emulator-5556  device
emulator-5558  device
...
Run Code Online (Sandbox Code Playgroud)

但是,根据这个输出,我根本无法区分每个仿真器设备.我需要知道哪个模拟器在AVD上运行,然后我可以安装APK或向模拟器发送命令.

如何在运行后识别每个仿真器设备或获取仿真器的序列号?

Die*_*ano 25

始终在相同的端口上启动相同的AVD,不要让模拟器决定.使用

$ emulator -ports X,Y @avd_X
Run Code Online (Sandbox Code Playgroud)

然后,序列号将是emulator-X,您的avd_X将始终位于端口X,Y上,因此您可以使用此序列号运行命令,例如

$ adb -s emulator-X shell cmd
Run Code Online (Sandbox Code Playgroud)

杀死模拟器运行

$ adb -s emulator-X emu kill
Run Code Online (Sandbox Code Playgroud)

  • 3 年后仍然是一个很好的答案。稍微简化(至少从模拟器 22.0.5.0 开始):使用 `-port` 而不是 `-ports` 允许您仅指定一个 _single_ 端口号;例如`$ emulator -port 5556 @avd_X`;请注意,在这种情况下,端口号必须是 5554 和 5584 之间的**偶数**(奇怪的是,使用 `-ports` 不会强加此范围限制)。 (3认同)
  • 好吧,在其他情况下,您永远不会知道。您只知道使用哪个AVD启动仿真器。如果有10个仿真器在运行,您将不会知道它是哪一个,而不用某种唯一的标识符启动它 (2认同)

Cam*_*mer 5

我知道有两种方法可以执行反向序列号到 AVD 名称查找

Telnet 选项 - 丑陋的方式

正如this SO answer中指出的那样......您可以使用Telnet反向查找每个序列号的AVD名称。这有点弱,因为您所做的只是找到一个给定特定 AVD 名称启动的模拟器实例。它不会唯一标识您要使用的模拟器。它还需要使用 telnet 并解析每个模拟器的端口号。

首先获取当前运行的序列号

adb devices
Run Code Online (Sandbox Code Playgroud)

然后 telnet 到每个设备的端口号

telnet localhost 5554
Run Code Online (Sandbox Code Playgroud)

并发出命令

avd name
Run Code Online (Sandbox Code Playgroud)

这将返回该模拟器的 AVD 名称。

UUID 选项 - 正确的方法

我最初在一个名为DCMTK的项目中看到了这一点。生成一个 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 &
Run Code Online (Sandbox Code Playgroud)

然后,当您想找到模拟器的特定实例时,您只需滚动浏览所有正在运行的模拟器并查找该 UUID。

adb -s emulator-5556 shell getprop emu.uuid
Run Code Online (Sandbox Code Playgroud)

在一个循环中:

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
Run Code Online (Sandbox Code Playgroud)

跟踪整个模拟器生命周期

  1. 使用 UUID 属性启动模拟器
  2. 然后启动一个循环,检查每个设备是否在线和/或具有匹配的 UUID
  3. 接到匹配电话后adb -s ${SERIAL_NUMBER} wait-for-device,您就知道何时可以与模拟器通话
  4. 如果您需要系统完全在线检查属性 sys.boot_completed
  5. 完成后,只需使用以下命令杀死模拟器 adb -s ${SERIAL_NUMBER} emu kill

  • 谢谢您的回答,我使用以下命令循环查找 AVD 名称: ``` NAME=`adb -s "${SERIAL_NUMBER}" emu avd name | tr -d '确定\r\n'` ``` (2认同)