If this title doesn’t make sense. No worries. Come here when you start writing functional automation test and need to run it against Android Emulator.
The Problem (Skip this section, if all you need is solution)
When you want to run your automation tests against android emulator, you would like to disable the animations. The animations are enabled by default on the emulators. They give a good user experience, but not the speed. As the animations take time during transitions. Do you want your automation tool to have good user experience? I hope not at all. What you want is — get the tests run asap and just check-in the code to the repository. If this was not enough, we also ran some visual comparison tests which would become flaky if the animations were enabled.
Hence, all we wanted was to disable the animations on our emulator. So for solving the problem, I had very clean and clear approach (same as what most of the developers do):
I followed the above mentioned process. I went till the second page. Got some solutions. While automating the stuff, figured out sometimes it worked; other times it won’t. It felt like the emulator is playing games. Being infrastructure persons on the project, it was our job to make sure the emulator have animations disabled. We had to screen share into our build agents, open the emulator manually and verify the animations are disabled. That is just ridiculous in today’s world of automation. I decided to dedicate my weekend to this. Played a lot with the
emulator commands. Went into the kernel of the android emulator. With God’s grace, I finally got the fruit.(as they say — “Patience is bitter but its fruit is sweet”)
The key to the solution is to do a clean reboot after you have changed the settings.
sudo reboot is what you have to avoid and embrace
$ANDROID_HOME/platform-tools/adb shell “su 0 am start -a android.intent.action.REBOOT”.
Thanks to Mikhail Advani for acknowledging my finding and transforming it into a decent code (as well as reviewing and suggesting changes to this blog). A simple shell script that have worked for us 99.99% of the times:
Note: In this snippet I am configuring avd(android virtual device) named “Nexus_25”. You can name your avd whatever you want. Just replace “Nexus_25” with your avd name, in the below code snippet.
$ANDROID_HOME/emulator/emulator -avd Nexus_25 -no-boot-anim -no-audio -no-window > /dev/null &
echo $! > $EMULATOR_PROCESS_ID_FILE_PATH #pid of previous command execution $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed) ]]; do sleep 10; done' #Wait until home screen gets displayed
$ANDROID_HOME/platform-tools/adb shell "settings put global window_animation_scale 0.0 "
$ANDROID_HOME/platform-tools/adb shell "settings put global transition_animation_scale 0.0"
$ANDROID_HOME/platform-tools/adb shell "settings put global animator_duration_scale 0.0"
#change whatever settings you wish to.
$ANDROID_HOME/platform-tools/adb shell "su 0 am start -a android.intent.action.REBOOT" $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed) ]]; do sleep 10; done' #Wait until home screen gets displayed
kill -9 $(cat $EMULATOR_PROCESS_ID_FILE_PATH) #Why this? Because we don't trust adb emu kill
P.S. This might not be the only solution. But it is a solution. Feedbacks are appreciated.