android - 如何通过命令行接受 Android 模拟器的调试对话框
问题描述
我正在编写一个自动模拟器脚本,它将创建和启动一个 Android 模拟器,这样我就可以在任何机器上运行我的 UI 测试并保证它可以在设备上运行。
我当前的脚本创建了一个android-27;google_apis;x86
工作正常的设备,但缺少谷歌服务,所以我的应用程序中的地图不显示。
我尝试使用创建模拟器google_apis_playstore
,但是当设备启动时,它会提示 ADB 调试提示。通常点击它会很好,但我希望能够在无头服务器上运行它并且不会总是能够。
有没有办法创建具有 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
解决方案
与default
or不同google_apis
,google_apis_playstore
它正在执行身份验证。这意味着adb server
主机和adb daemon
模拟器上都应该共享相同的 RSAadbkey
进行通信。文档在这里:https ://developer.android.com/studio/command-line/adb
通常它会自动工作。adb start-server
命令将创建adbkey
文件,然后emulator/emulator
将它们复制到图像文件系统中。但是由于它不适用于您的情况,您必须仔细验证配置错误的位置:
- 运行
adb keygen adbkey
生成 2 个文件 -adbkey
和adbkey.pub
- 这两个文件需要复制到您主机上的服务器
$HOME/.android
文件夹(或者$ANDROID_VENDOR_KEYS
)adb
- 需要将相同的 2 个文件复制到您的 GUEST的
$HOME/.android
文件夹(或者$ANDROID_SDK_HOME/.android
) 。emulator/emulator
通常 HOST==GUEST 但如果您adb
在 docker 容器内的桌面和模拟器上运行,它们是不同的。 - 模拟器的文件系统被缓存,因此删除任何以前创建的图像。他们不会复制密钥。
- 可选地,这里建议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
推荐阅读
- java - 如何使用他们的字体在 textview 中复制文本?
- java - Java 超出 2 个字节
- c# - 将 winforms 设计器中的字体设置为 Font 对象
- ruby - Rails - 将数字转换为数组
- c++ - c ++,打印列表内对象的属性值,查找属性特定值的对象,删除对象
- firebase - 如何仅允许访问我的 nativescript 应用程序的 firestore 数据?
- delphi - 在 Delphi 2007 中创建 Shell 链接导致外部异常 EEFFACE
- ionic-framework - 离子签名板
- html - 3个元素在同一行垂直对齐,一个在左边,一个在中间,一个在右边
- mysql - 仅从第一个订单中获取一条记录,并从第二个订单中获取其余记录