Catalin Morosan
Catalin Morosan

Reputation: 7937

Detect when Android emulator is fully booted

I want to create a script where I start an emulator and after the system is fully booted, I want to install an .apk.

How can I know when the emulator is fully booted so I can run the install command? Here http://developer.android.com/guide/developing/tools/adb.html it is said that adb wait-for-device install <app>.apk is not correct.

So how can I achieve this? Is it possible? Is my only option to sleep for a few minutes until I can be sure that the emulator is started?

Upvotes: 41

Views: 29290

Answers (7)

Pebermynte Lars
Pebermynte Lars

Reputation: 485

Using the boot state provided from service.bootanim.exit may produce unstable results, if you try to install an app right after.

Especially if you use it to check after rebooting with adb shell su 0 setprop ctl.restart zygote

service.bootanim.exit is the "google" icon shown on white background when the emulator is booting. When it has completed, next state is the "Phone is starting" screen, where app install is not immediately possible.

I found monitoring the switch from no network to LTE or WIFI to happen after the UI is done rendering. This way the emulator is ready for user input, including app loading.

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

Emulator network changes states from no network, to LTE and finally WIFI after UI has completed loading. Tested on Android 10 with Google API support.

Without sed you get an overload of info. Try grep for either WIFI or LTE if you want a found/not found response.

Upvotes: 1

Torbik
Torbik

Reputation: 509

Just run emulator with -delay-adb flag and then run adb wait-for-device. adb will exit when the emulator booted.

Upvotes: 8

Sebo
Sebo

Reputation: 441

while [ "`adb shell getprop sys.boot_completed | tr -d '\r' `" != "1" ] ; do sleep 1; done

This code gets the information from sys.boot_completed if the system boot is complete, removes a newline and compares the resulting value to 1. If its unequal 1/ not booted completly/ it will just sleep 1 second and tries again.

Just put your adb install... after this line of code.

Upvotes: 25

DeRagan
DeRagan

Reputation: 22930

You can set a broadcast receiver which can notify that the device boot is complete

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

Upvotes: -2

neuron
neuron

Reputation: 1244

adb shell getprop init.svc.bootanim

This will tell you whether or not the boot animation is running. It's what we use on our headless build server to check if the emulator is up. The sys.boot_completed from dac2009 is what lead me to find that flag. We use init.svc.bootanim instead because boot_completed has a tendency of triggering too early.

Upvotes: 49

dac2009
dac2009

Reputation: 3561

Im not sure if this works on all devices, but it works on the ones I have tested.

If you go into the shell, you can type getprop, and get a list of phone properties. There should be one called "sys.boot_completed".

If you type "getprop sys.boot_completed" it will respond "1" if the system is booted, and an empty string if the system is not booted.

Upvotes: 14

Luminger
Luminger

Reputation: 2194

You may parse the stdout output of the emulator if you start it with "-logcat VERBOSE" and wait for a message which indicates that the emulator is booted.

I didn't saw any good message right now in the output, but you may write an app which is listening for "android.intend.action.BOOT_COMPLETED" and writes something to the log.

Refer http://developer.android.com/guide/developing/tools/emulator.html for more info.

Upvotes: 0

Related Questions