如何通过命令行接受Android模拟器的调试对话框

时间:2019-03-01 16:32:07

标签: android shell android-studio android-emulator adb

我正在编写一个自动化的仿真器脚本,该脚本将创建并启动一个Android仿真器,以便可以在任何计算机上运行UI测试并确保它可以在设备上运行。

我当前的脚本创建了一个android-27;google_apis;x86设备,该设备可以正常运行,但是缺少Google服务,因此我的应用中的地图无法显示。

我尝试使用google_apis_playstore创建一个仿真器,但是当设备启动时,它会提示ADB调试提示。通常,轻按此按钮是可以的,但是我希望能够在无头服务器上运行此命令,并且永远不会。

是否总有一个模拟器可以创建Google apis +地图而不必接受ADB对话框的模拟器?

这是我当前的shell脚本

#!/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时出现错误,因为它无法通过对话框来检查模拟器是否已启动。

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 :(得分:3)

defaultgoogle_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个文件-adbkeyadbkey.pub
  • 需要将这2个文件复制到主机上$HOME/.android服务器的$ANDROID_VENDOR_KEYS文件夹中(或者adb
  • 您需要在GUEST上将$HOME/.android的相同2个文件复制到$ANDROID_SDK_HOME/.android文件夹(或者emulator/emulator)中。通常为HOST == GUEST,但是如果您在docker容器中的台式机和模拟器上运行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