我想编写一个脚本,在启动模拟器后,系统完全启动之后,安装一个apk文件。
如何知道模拟器何时完全启动,以便运行安装命令?在这里http://developer.android.com/guide/developing/tools/adb.html中说明adb wait-for-device install <app>.apk
是不正确的。
那么我该如何实现呢?这可能吗?我的唯一选择是等待几分钟,直到我可以确认模拟器已经启动了吗?
我想编写一个脚本,在启动模拟器后,系统完全启动之后,安装一个apk文件。
如何知道模拟器何时完全启动,以便运行安装命令?在这里http://developer.android.com/guide/developing/tools/adb.html中说明adb wait-for-device install <app>.apk
是不正确的。
那么我该如何实现呢?这可能吗?我的唯一选择是等待几分钟,直到我可以确认模拟器已经启动了吗?
这会告诉你启动动画是否正在运行。我们在无头构建服务器上使用它来检查仿真器是否已启动。dac2009 的 sys.boot_completed 让我发现了该标志。我们使用 init.svc.bootanim 而不是 boot_completed,因为 boot_completed 往往会触发得太早。
while [ "`adb shell getprop sys.boot_completed | tr -d '\r' `" != "1" ] ; do sleep 1; done
这段代码从sys.boot_completed获取信息,如果系统启动已经完成,它会去掉换行符并将结果值与1进行比较。如果不等于1/未完全启动,则会休眠1秒后再次尝试。
只需在此代码行之后放置您的adb install ...。
adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed) ]]; do sleep 1; done;'
- Lucas我不确定这是否适用于所有设备,但是经过我测试的设备可以使用。
如果您进入shell,可以输入getprop命令,以获取手机属性列表。应该会有一个名为“sys.boot_completed”的属性。
如果您键入“getprop sys.boot_completed”,则会响应“1”,表示系统已启动,如果系统未启动,则为空字符串。
sys.boot_completed
与 init.svc.bootanim
进行了测试,发现 sys.boot_completed
是两种方法中更为保守的。如果您的模拟器有检查 sys.boot_completed
的选项,请使用它! - Gi0rgi0s只需使用-delay-adb
标志运行模拟器,然后运行adb wait-for-device
命令。当模拟器启动后,adb
命令将退出。
service.bootanim.exit
的引导状态可能会产生不稳定的结果,如果您尝试安装应用程序,则会出现此情况。adb shell su 0 setprop ctl.restart zygote
重新启动后进行检查。
service.bootanim.exit
是模拟器启动时显示在白色背景上的“Google”图标。当它完成后,下一个状态是“正在启动手机”屏幕,在这个屏幕上不可能立即安装应用程序。adb shell dumpsys connectivity | sed -e '/[0-9] NetworkAgentInfo.*CONNECTED/p' -n
UI加载完成后,模拟器网络状态会从无网络变为LTE,最终变为WIFI。在支持Google API的Android 10上进行了测试。
如果没有使用sed
,你会得到过载的信息。如果想要找到/未找到响应,请尝试使用grep
查找WIFI或LTE。
如果您使用“-logcat VERBOSE”启动模拟器并等待指示模拟器已启动的消息,则可以解析模拟器的stdout输出。
我目前在输出中没有看到任何好的消息,但是您可以编写一个应用程序来监听“android.intend.action.BOOT_COMPLETED”并将某些内容写入日志。
有关更多信息,请参见http://developer.android.com/guide/developing/tools/emulator.html。
android:name="android.intent.action.BOOT_COMPLETED"