【问题标题】:Detect when Android emulator is fully booted检测Android模拟器何时完全启动
【发布时间】:2010-09-03 08:15:57
【问题描述】:

我想创建一个启动模拟器的脚本,在系统完全启动后,我想安装一个 .apk。

我如何知道模拟器何时完全启动,以便我可以运行安装命令?这里http://developer.android.com/guide/developing/tools/adb.html据说adb wait-for-device install <app>.apk不正确。

那么我该如何实现呢?是否可以?在我确定模拟器启动之前,我唯一的选择是睡几分钟吗?

【问题讨论】:

标签: android scripting emulation


【解决方案1】:

adb shell getprop init.svc.bootanim

这将告诉您启动动画是否正在运行。我们在无头构建服务器上使用它来检查模拟器是否启动。 dac2009 中的 sys.boot_completed 是导致我找到该标志的原因。我们使用 init.svc.bootanim 代替,因为 boot_completed 有触发过早的趋势。

【讨论】:

  • 如何在内存中加载无头模拟器?
  • 在测试@neuron 的答案时,我意识到我必须检查不同的属性才能实现最可靠的验证dev.bootcomplete(请注意前缀:dev 而不是 sys,因为 sys.boot_completed 在初始化完成之前变成 1 路)
  • 我发现 dev.bootcomplete 也不可靠,我还是更喜欢 init.svc.bootanim
  • 注意:如果启用了-no-boot-anim 标志,这将不起作用。
【解决方案2】:
while [ "`adb shell getprop sys.boot_completed | tr -d '\r' `" != "1" ] ; do sleep 1; done

如果系统启动完成,此代码会从 sys.boot_completed 获取信息,删除一个换行符并将结果值与 1 进行比较。如果它不等于 1/未完全启动/它只会休眠 1 秒并重试。

只需将您的 adb install... 放在这行代码之后。

【讨论】:

  • 当我为一个模拟器检查这个时,这对我有用。但是,如果我想让它检查多个模拟器,它会给我错误“多个模拟器”。如何解决?
  • 在这种情况下,您需要指定要使用 adb 的设备。而不是 adb shell。使用 adb -s DEVICE_IDENTIFIER。 DEVICE_IDENTIFIER 是您在调用 adb 设备时看到的 id。如果您想等待所有模拟器启动。
  • 尾随的换行符让我陷入了困境。谢谢!
  • 一种避免解析的更简单方法是在目标上执行检查并休眠。 adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed) ]]; do sleep 1; done;'
【解决方案3】:

我不确定这是否适用于所有设备,但它适用于我测试过的设备。

如果您进入 shell,您可以键入 getprop,并获取电话属性列表。 应该有一个名为“sys.boot_completed”。

如果您键入“getprop sys.boot_completed”,如果系统已启动,它将响应“1”,如果系统未启动,则返回空字符串。

【讨论】:

  • 我在现场遇到了至少一个没有设置该属性的设备,但如果它存在并且已设置,那么您知道您的设备已启动。您也可以查找 dev.bootcomplete,但我在该领域也遇到了一个也没有设置的设备。
  • 我对@9​​87654321@ 和init.svc.bootanim 进行了测试,发现sys.boot_completed 是两种方法中更保守的一种。如果您的模拟器可以选择检查 sys.boot_completed,请使用它!
【解决方案4】:

只需运行带有-delay-adb 标志的模拟器,然后运行adb wait-for-deviceadb 将在模拟器启动时退出。

【讨论】:

【解决方案5】:

使用service.bootanim.exit 提供的启动状态可能会产生不稳定的结果,如果您在之后尝试安装应用程序。

特别是如果您在使用adb shell su 0 setprop ctl.restart zygote 重新启动后使用它来检查

service.bootanim.exit 是模拟器启动时在白色背景上显示的“google”图标。完成后,下一个状态是“电话正在启动”屏幕,此时无法立即安装应用。

我发现在 UI 完成渲染后监控从无网络到 LTE 或 WIFI 的切换。这样,模拟器就可以接受用户输入,包括应用加载。

adb shell dumpsys connectivity | sed -e '/[0-9] NetworkAgentInfo.*CONNECTED/p' -n 

在 UI 加载完成后,模拟器网络将状态从无网络变为 LTE,最后变为 WIFI。在支持 Google API 的 Android 10 上测试。

如果没有sed,您将获得大量信息。如果您想要找到/未找到响应,请尝试grep 使用 WIFI 或 LTE。

【讨论】:

    【解决方案6】:

    如果您使用“-logcat VERBOSE”启动它并等待指示模拟器已启动的消息,您可以解析模拟器的 stdout 输出。

    我现在在输出中没有看到任何好的消息,但是您可以编写一个正在侦听“android.intend.action.BOOT_COMPLETED”的应用程序并将一些内容写入日志。

    更多信息请参考http://developer.android.com/guide/developing/tools/emulator.html

    【讨论】:

      【解决方案7】:

      您可以设置广播接收器,通知设备启动完成

      android:name="android.intent.action.BOOT_COMPLETED"
      

      【讨论】:

      • 这不是我要问的。我说的是在我的家用计算机上制作一个脚本,以便在模拟器上安装应用程序,以便能够自动化测试过程。
      • 哎呀!..您的标题为“检测 Android 模拟器何时完全启动”,我认为这将是最好的方法。无论如何,即使您想从系统运行脚本,您也需要知道刺激器启动何时完成。也许您可以从广播中启动某种服务,该服务可以调用本地 IIS 中的 URL,这可以触发您的脚本...
      猜你喜欢
      • 2015-06-15
      • 1970-01-01
      • 1970-01-01
      • 2018-12-18
      • 2012-03-19
      • 2017-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多