【问题标题】:Why would an Android emulator be listed as 'host' in adb devices?为什么 Android 模拟器会在 adb 设备中列为“主机”?
【发布时间】:2019-09-23 16:50:01
【问题描述】:

最近,我偶然发现了一个运行模拟器的服务器上的日志,该服务器为我们的 CI 测试运行模拟器,其中一个模拟器在 adb devices 的输出中一直被列为“主机”,而不是通常的“设备”或偶尔的“离线” . (直到它的看门狗厌倦并杀死它。)

[18:49:37]   168    -rw-r--r-- 1 root root 14040 Sep 20 19:35 /tmp/watchlog
[18:49:37]   169         1  List of devices attached
[18:49:37]   170         2  emulator-5570   device
[18:49:37]   171         3  emulator-5568   device
[18:49:37]   172         4  emulator-5566   device
[18:49:37]   173         5  emulator-5564   device
[18:49:37]   174         6  emulator-5562   device
[18:49:37]   175         7  emulator-5560   device
[18:49:37]   176         8  emulator-5558   device
[18:49:37]   177         9  emulator-5556   device
[18:49:37]   178        10  emulator-5554   device
[18:49:37]   179        11  emulator-5572   host

它们都在自己的 docker 容器中,从同一个映像启动,连接到控制器容器中默认端口 5037 上的 ADB 服务器,并且它们正在运行 --net=host。

如果我在模拟器中运行 adb 设备,主机看起来就像我期望看到的那样,所以我猜测由于重新映射导致某种端口号冲突,但 adb 没有在任何 55xx 端口上运行。或者也许 adb 实例制作了一些随机 id,而这恰好与守护进程匹配? (我中奖了吗?)

我不知道这种情况有多频繁 - 我从没想过要监控奇怪的状态。


更新:我更仔细地查看了容器输出,发现 5573 的连接被拒绝。如果我启动一个模拟器,它的 adb 端口已经在使用(通过 nc -lk),它根本不会出现在 adb 中 -它没有列为主机。

[18:49:37]    35    == STATUS: 2019-09-20.19:32:03 emulator-starting-5572
[18:49:37]    36    + emulator -no-window -no-boot-anim -no-audio -gpu swiftshader_indirect -avd avdmanager-creation -port 5572 -no-snapshot-save
[18:49:37]    37    localhost [127.0.0.1] 5573 (?) : Connection refused
[18:49:37]    38    /local/emulauncher.sh: line 213:    77 Done                    echo ping
[18:49:37]    39            78 Killed                  | timeout -s9 3 nc localhost $[ ${EMULATOR_PORT} + 1 ]
[18:49:37]    40    qemu-system-x86_64: warning: TSC frequency mismatch between VM (1999997 kHz) and host (3399999 kHz), and TSC scaling unavailable
[18:49:37]    41    qemu-system-x86_64: warning: TSC frequency mismatch between VM (1999997 kHz) and host (3399999 kHz), and TSC scaling unavailable
[18:49:37]    42    60...emulator: Requested console port 5572: Inferring adb port 5573.
[18:49:37]    43    Your emulator is out of date, please update by launching Android Studio:
[18:49:37]    44     - Start Android Studio
[18:49:37]    45     - Select menu "Tools > Android > SDK Manager"
[18:49:37]    46     - Click "SDK Tools" tab
[18:49:37]    47     - Check "Android Emulator" checkbox
[18:49:37]    48     - Click "OK"

killed/ping/timeout-nc 让看门狗做一些事情,当它偶尔保持离线时,它似乎会唤醒模拟器,尽管使用“ping”让我怀疑我是否打算将它发送到 qemu 而不是adb 端口。 60...来自看门狗倒计时。

【问题讨论】:

    标签: android android-emulator


    【解决方案1】:

    就您所知,这只是在adb 认为属于模拟器的范围内侦听端口号的一些随机进程。 adb 向端口发送命令,然后在尝试确定连接状态时解析回复。

    而“主机”状态只是default option:

    const std::string& type = pieces[0];
    if (type == "bootloader") {
        D("setting connection_state to kCsBootloader");
        t->SetConnectionState(kCsBootloader);
    } else if (type == "device") {
        D("setting connection_state to kCsDevice");
        t->SetConnectionState(kCsDevice);
    } else if (type == "recovery") {
        D("setting connection_state to kCsRecovery");
        t->SetConnectionState(kCsRecovery);
    } else if (type == "sideload") {
        D("setting connection_state to kCsSideload");
        t->SetConnectionState(kCsSideload);
    } else if (type == "rescue") {
        D("setting connection_state to kCsRescue");
        t->SetConnectionState(kCsRescue);
    } else {
        D("setting connection_state to kCsHost");
        t->SetConnectionState(kCsHost);
    }
    

    【讨论】:

    • 不错的假设!一旦我开始工作,我会查看日志并运行一些测试,尽管我希望模拟器退出声称端口正在使用中,从而杀死模拟器的容器,因为模拟器是入口点中的最后一件事外壳脚本。
    • 我无法显示“主机”,即使我“nc”端口繁忙或在运行模拟器之前尝试“adb -P 5555”。我在看门狗循环中添加了一些 netstat 日志记录,以尝试获取更多信息,以防我再次发现它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 2011-05-01
    • 2011-11-22
    • 1970-01-01
    • 2014-11-30
    • 2023-03-10
    • 1970-01-01
    相关资源
    最近更新 更多