Почему эмулятор Android должен быть указан в качестве хоста на устройствах adb? - PullRequest
0 голосов
/ 21 сентября 2019

Недавно я наткнулся на журнал на сервере, который запускает эмуляторы для нашего тестирования CI, где один из нескольких эмуляторов постоянно указывался как «хост» вместо обычного «устройства» или случайного «офлайн» в выводе устройств adb.,(До тех пор, пока его сторожевой таймер не надоест и не убьет его.)

[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

Каждый из них находится в своем собственном док-контейнере, запускается с одного и того же образа и подключается к серверу ADB через порт по умолчанию 5037 в контейнере контроллера.и они запускают --net = host.

Host выглядит так, как я ожидал увидеть, если бы я запускал устройства adb в эмуляторе, поэтому я предполагаю какое-то столкновение номеров портов из-запереназначение, но adb не работает ни на одном порту 55xx.Или, может быть, экземпляры ADB создают какой-то случайный идентификатор, и он просто совпадает с идентификатором демона?(Я выигрываю приз?)

Я не знаю, как часто это происходит - я никогда не думал отслеживать странные состояния.


Обновление: я присмотрелсяна выходе контейнера, и там было отказано в соединении для 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"

Убитый / ping / timeout-nc заставляет сторожа делать что-то, что, казалось, пробуждает эмулятор, когда он иногда остается в автономном режиме, хотя использование ping заставляет меня задуматься, собирался ли я отправитьчто к qemu, а не к порту adb.60 ... исходит от сторожевого таймера.

1 Ответ

1 голос
/ 22 сентября 2019

Насколько вам известно, это просто какой-то случайный процесс, прослушивающий номер порта в диапазоне, который adb считает принадлежащим эмуляторам.adb отправляет команду в порт, а затем анализирует ответ при попытке выяснить состояние соединения.

А статус "хоста" - это просто опция по умолчанию :

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...