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

标签 android shell android-studio android-emulator adb

我正在编写一个自动模拟器脚本,它将创建并启动一个 Android 模拟器,这样我就可以从任何机器上运行我的 UI 测试并保证它会在设备上运行。

我当前的脚本创建了一个工作正常的 android-27;google_apis;x86 设备,但缺少谷歌服务,所以我的应用程序中的 map 不显示。

我尝试使用 google_apis_playstore 创建模拟器,但当设备启动时,它会提示 ADB 调试提示。通常点击它会很好,但我希望能够在 headless 服务器上运行它并且不会总是能够。

有没有办法创建一个模拟器,该模拟器将具有 google apis + maps 而无需接受 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

最佳答案

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 服务器
  • 需要将相同的 2 个文件复制到 $HOME/.android 文件夹(或者 $ANDROID_SDK_HOME/.android)以用于 emulator/emulator在你的客人身上。通常 HOST==GUEST 但如果您在桌面上运行 adb 并在 docker 容器内运行模拟器,它们是不同的。
  • 模拟器的文件系统已缓存,因此请删除之前创建的所有图像。他们不会复制 key 。
  • 可选,这里建议https://developer.android.com/studio/command-line/adb#notlisted在发出任何 adb 命令
  • 之前显式调用 adb start-server
$ adb kill-server
$ emulator -avd Nexus_6_API_25 -port 5557
$ adb start-server
$ adb devices

List of devices attached
emulator-5557 device

关于android - 如何通过命令行接受 Android 模拟器的调试对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54948726/

相关文章:

android - Admob 广告无法加载状态详细信息 有限的广告服务

android - 选择选项卡时如何重新加载 fragment ?

android - Flutter(或Dart)的QR扫描插件

bash - Docker在X时间后杀死了一个容器中的无限进程

Android Studio - android.jar 和 rt.jar 冲突

java - ImageView不根据屏幕尺寸进行调整

Android WebView 硬件加速键盘故障

bash - 遍历目录中的所有文件

bash - 在 shell 中打印具有多行值的变量?

android - 安装应用程序需要几分钟时间,并出现 dex2oat 警告