Как принять диалог отладки для Android Emulator через командную строку - PullRequest
0 голосов
/ 01 марта 2019

Я пишу сценарий автоматического эмулятора, который будет создавать и запускать эмулятор Android, чтобы я мог запускать свои тесты пользовательского интерфейса с любой машины и гарантировать, что он будет работать на устройстве.

Мой текущий сценарий создаетandroid-27;google_apis;x86 устройство, которое работает нормально, но в нем отсутствуют службы Google, поэтому карты в моем приложении не отображаются.

Я попытался создать эмулятор, используя google_apis_playstore, но при загрузке устройства он запрашивает ADBподсказка отладки.Обычно это было бы хорошо, но я ожидал, что смогу запустить это на автономном сервере и не всегда смогу.

В любом случае можно ли создать эмулятор, который будет иметь google apis + maps без необходимости принимать диалог ADB?

Вот мой текущий сценарий оболочки

#!/bin/sh
# Run this script in root project dir

# Kill existing emulator
$ANDROID_HOME/platform-tools/adb devices | grep emulator | cut -f1 | while read line; do $ANDROID_HOME/platform-tools/adb -s $line emu kill; done

# Install system image
$ANDROID_HOME/tools/bin/sdkmanager "system-images;android-27;google_apis;x86"
yes | $ANDROID_HOME/tools/bin/sdkmanager --licenses

# Create emulator
echo "no" | $ANDROID_HOME/tools/bin/avdmanager create avd -f \
    -n "tester" \
    -k 'system-images;android-27;google_apis;x86' \
    -b x86 \
    -d "Nexus 5X"

# Start emulator
$ANDROID_HOME/emulator/emulator -avd tester &

# Wait for emulator to start
$ANDROID_HOME/platform-tools/adb wait-for-device shell input keyevent 82
while [ "`$ANDROID_HOME/platform-tools/adb shell getprop sys.boot_completed | tr -d '\r' `" != "1" ] ; do sleep 1; done
sleep 5;

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

error: device unauthorized.
This adb server's $ADB_VENDOR_KEYS is not set
Try 'adb kill-server' if that seems wrong.
Otherwise check for a confirmation dialog on your device.

Кажется глупым, что вам нужно будет принять разрешения на отладку для эмулятора?

Редактировать: я отправил это как ошибку https://issuetracker.google.com/issues/128271326

1 Ответ

0 голосов
/ 16 марта 2019

В отличие от default или google_apis, google_apis_playstore обеспечивает аутентификацию.Это означает, что и adb server на хосте, и adb daemon на эмуляторе должны использовать один и тот же RSA adbkey для связи.Документация здесь: https://developer.android.com/studio/command-line/adb

Как правило, это работает автоматически.Команда adb start-server создаст adbkey файлы, а затем emulator/emulator скопирует их в файловую систему образа.Но поскольку в вашем случае это не работает, вам придется тщательно проверить, где что-то неправильно настроено:

  • Запуск adb keygen adbkey создает 2 файла - adbkey и adbkey.pub
  • Эти 2 файла необходимо скопировать в папку $HOME/.android (или $ANDROID_VENDOR_KEYS) для adb сервера на вашем ХОСТЕ
  • Те же 2 файла необходимо скопировать в папку $HOME/.android (альтернативно $ANDROID_SDK_HOME/.android)) для emulator/emulator в вашем ГОСТЕ.Обычно HOST == GUEST, но если вы запускаете adb на рабочем столе и эмулятор внутри докер-контейнера, они отличаются.
  • Файловая система для эмулятора кэшируется, поэтому удалите все ранее созданные изображения.Им не нужно было бы копировать ключи.
  • Опционально, здесь https://developer.android.com/studio/command-line/adb#notlisted предлагается явно adb start-server вызвать перед выполнением любых adb команд
$ adb kill-server
$ emulator -avd Nexus_6_API_25 -port 5557
$ adb start-server
$ adb devices

List of devices attached
emulator-5557 device
...