【问题标题】:How to Get Serial Number or ID of Android Emulator After it Runs?Android模拟器运行后如何获取序列号或ID?
【发布时间】:2010-02-06 19:23:01
【问题描述】:

如果我在一台机器上运行多个带有 -no-window 选项的模拟器。 “adb devices”命令显示:

List of devices attached
emulator-5554  device
emulator-5556  device
emulator-5558  device
...

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

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

【问题讨论】:

  • 从技术上讲,这些是序列号。您想要的是反向查找 AVD 名称。

标签: android emulation


【解决方案1】:

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

$ emulator -ports X,Y @avd_X

那么,序列号将是 emulator-X 并且您的 avd_X 将始终位于端口 X,Y 上,因此您可以运行带有此序列号的命令,例如

$ adb -s emulator-X shell cmd

杀死模拟器运行

$ adb -s emulator-X emu kill

【讨论】:

  • @dtmilano - 注意 OP 对此有疑问
  • 3 年后仍然是一个很好的答案。略微简化(至少从模拟器 22.0.5.0 开始):使用 -port 而不是 -ports 允许您仅指定 single 端口号;例如$ emulator -port 5556 @avd_X;请注意,在这种情况下,端口号必须是介于 5554 和 5584 之间的 偶数(奇怪的是,使用 -ports 不会施加此范围限制)。
  • @mklement0 如果你喜欢这个答案,你会喜欢我的答案。
  • @CameronLowellPalmer 好吧,不同之处在于,在这种情况下,您事先知道哪个模拟器是哪个,而在另一种情况下,您必须搜索才能找到它
  • 好吧,在另一种情况下,你永远不会知道。您只知道使用哪个 AVD 来启动模拟器。如果有 10 个模拟器在运行,如果不使用某种唯一标识符启动它,您将永远不知道哪个是您正在寻找的模拟器
【解决方案2】:

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

Telnet 选项 - 丑陋的方式

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

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

adb devices

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

telnet localhost 5554

并发出命令

avd name

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

UUID 选项 - 正确的方式

我最初在一个名为 DCMTK 的项目中看到了这一点。生成一个 UUID uuidgen 并在启动时在模拟器上设置一个属性!我的示例启动了一个模拟器,以对需要在目标上运行代码以确定类型信息的库执行一些编译时检查。

emulator -avd nexus19-arm -no-window -no-boot-anim -noaudio -prop emu.uuid=7a6f8701-43c2-4e16-988a-8b4992c0bf8d >/dev/null </dev/null 2>&1 &

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

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

跟踪整个模拟器生命周期

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

【讨论】:

  • 这看起来是一个很好的解决方案,但我只能让“丑陋的方式”工作。我无法读取启动模拟器时设置的属性。我得到的只是一个空行。这个“正确的方式”选项是否中断或是否有其他提示可以让它发挥作用?
  • 显然最多有 247 个属性,而较新的 avds 使用默认属性达到了这个最大值,这会阻止您添加自己的属性。我想这意味着“丑陋的方式”是目前唯一可行的方式。
【解决方案3】:

相同的字符串(例如,emulator-5554)显示在模拟器窗口的标题栏中。

【讨论】:

  • 感谢您的回复。我必须使用 -no-window 选项运行所有模拟器。所以,没有窗口标题栏。
  • 请说明您如何以需要运行多个模拟器的方式进行 Android 应用程序开发,每个模拟器都带有 -no-window 选项。
  • 我尝试在同一台服务器上同时自动运行多个项目的测试用例。为了不干扰测试结果,我认为最好为每个项目创建一个 AVD。所以我必须识别每个模拟器来安装正确的 APK 并使用 shell 脚本发送正确的命令。如果没有更好的方法来获取模拟器的序列号,我会在启动模拟器之前和之后比较“​​adb devices”命令的输出以确定序列号。
  • 首先,这是一个非常酷的设置。但是,是的,我怀疑差异或其他东西可能是您获得模拟器 ID 的最佳选择。我没有使用-no-window——我认为它没有将模拟器ID转储到标准输出或作为执行命令的一部分。
猜你喜欢
  • 2012-05-21
  • 1970-01-01
  • 1970-01-01
  • 2020-02-12
  • 2011-01-30
  • 1970-01-01
  • 2018-05-02
  • 2019-01-15
  • 1970-01-01
相关资源
最近更新 更多