Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Emulator运行后如何获取其序列号或ID?_Android_Emulation - Fatal编程技术网

Android Emulator运行后如何获取其序列号或ID?

Android Emulator运行后如何获取其序列号或ID?,android,emulation,Android,Emulation,如果我在一台机器上运行多个带-无窗口选项的模拟器。命令“adb设备”显示: 然而,根据这个输出,我根本无法区分每个模拟器设备之间的区别。我需要知道哪个模拟器在哪个AVD上运行,然后我可以安装APK或向模拟器发送命令 如何识别每个仿真器设备或在其运行后获取仿真器的序列号?仿真器窗口的标题栏中显示相同的字符串(例如,emulator-5554)。始终在相同的端口上启动相同的AVD,不要让仿真器决定。 使用 然后,序列号将是emulator-X,并且您的avd_X将始终位于端口X,Y,因此您可以使用此

如果我在一台机器上运行多个带-无窗口选项的模拟器。命令“adb设备”显示:

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


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

仿真器窗口的标题栏中显示相同的字符串(例如,
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选项-正确的方法 我最初在一个名为的项目中看到了这一点。生成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 &
在循环中:

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
跟踪整个仿真器生命周期
  • 使用UUID属性启动仿真器
  • 然后启动一个循环,检查每个设备是否在线和/或是否具有匹配的UUID
  • 一旦你得到一个匹配的调用
    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