-
Type:
Bug
-
Resolution: Fixed
-
Priority:
Critical
-
Component/s: android-emulator-plugin
-
None
-
Environment:Ubuntu 16.04 64bit
Android SDK revision 25.1.6
Jenkins 2.5 and 1.651.2
Android Emulator Plugin 2.14.1
Android Emulator plugin fails to correctly shutdown the emulator started for the test, but this fact is not logged in console output:
[android] Starting Android emulator [android] Erasing existing emulator data... $ /var/lib/jenkins/tools/android-sdk/tools/emulator -engine classic -ports 5748,5749 -report-console tcp:5832,max=60 -prop persist.sys.language=en -prop persist.sys.country=US -avd hudson_en-US_160_HVGA_android-19 -no-snapshot-load -no-snapshot-save -wipe-data -no-window -no-audio -gpu off [android] Emulator reported that the console is available on port 5,748 [android] Waiting for emulator to finish booting... $ /var/lib/jenkins/tools/android-sdk/platform-tools/adb -s emulator-5748 wait-for-device shell getprop init.svc.bootanim [android] Emulator reported that the startup process is 'stopped' $ /var/lib/jenkins/tools/android-sdk/platform-tools/adb -s emulator-5748 logcat -v time [android] Emulator is ready for use (took 23 seconds) [test2-maremoto-studio] $ /bin/sh -xe /tmp/hudson1987499027468087201.sh ... [android] Stopping Android emulator [android] Archiving emulator log $ /var/lib/jenkins/tools/android-sdk/platform-tools/adb kill-server Finished: SUCCESS
This leads to
- emulator processes continue consuming CPU and RAM
- next emulator start fails due to resources remains locked
[android] Starting Android emulator [android] Erasing existing emulator data... $ /var/lib/jenkins/tools/android-sdk/tools/emulator -engine classic -ports 5726,5727 -report-console tcp:5861,max=60 -prop persist.sys.language=en -prop persist.sys.country=US -avd hudson_en-US_160_HVGA_android-19 -no-snapshot-load -no-snapshot-save -wipe-data -no-window -no-audio -gpu off WARNING: SD Card image already in use: /var/lib/jenkins/.android/avd/hudson_en-US_160_HVGA_android-19.avd/sdcard.img ko:Snapshot storage already in use: /var/lib/jenkins/.android/avd/hudson_en-US_160_HVGA_android-19.avd/snapshots.img emulator: WARNING: Classic qemu does not support SMP. The hw.cpu.ncore option from your config file is ignored. emulator: WARNING: userdata image already in use, changes will not persist! emulator: WARNING: cache image already in use, changes will not persist! ...
The root cause is Google emulator console behavior change: now you MUST authenticate in emulator console before you can issue 'kill' command. This change was introduced about a week ago when Android SDK 25.1.6 was released.
But the Android Emulator plugin can't handle authentication required - it simply issues 'kill' command to the emulator console, and the emulator silently refuses this unauthorized command.
Talking to emulators leaved running by plugin "by-hands" via telnet(1) - shutdowns them successfully:
kaa@AGnb:~$ ps -augxw |grep ^jenkins |grep emulator
jenkins 23511 15.2 4.4 1144460 333832 ? Sl 12:12 0:34 /var/lib/jenkins/tools/android-sdk/tools/emulator64-x86 -engine classic -ports 5698,5699 -report-console tcp:5839,max=60 -prop persist.sys.language=en -prop persist.sys.country=US -avd hudson_en-US_160_HVGA_android-19 -no-snapshot-load -no-snapshot-save -wipe-data -no-window -no-audio -gpu off
jenkins 23518 0.0 0.0 0 0 ? Z 12:12 0:00 [emulator64-cras] <defunct>
kaa@AGnb:~$
kaa@AGnb:~$ sudo cat /var/lib/jenkins/.emulator_console_auth_token ; echo ""
JDKCEhwZ6jhmnIV3
kaa@AGnb:~$
AGnb:~$
kaa@AGnb:~$ telnet 127.1 5698
Trying 127.0.0.1...
Connected to 127.1.
Escape character is '^]'.
Android Console: Authentication required
Android Console: type 'auth <auth_token>' to authenticate
Android Console: you can find your <auth_token> in
'/var/lib/jenkins/.emulator_console_auth_token'
OK
help
Android console command help:
help|h|? print a list of commands
avd control virtual device execution
auth user authentication for the emulator console
quit|exit quit control session
try 'help <command>' for command-specific help
OK
avd name
hudson_en-US_160_HVGA_android-19
OK
auth JDKCEhwZ6jhmnIV3
Android Console: type 'help' for a list of commands
OK
help
Android console command help:
help|h|? print a list of commands
event simulate hardware events
geo Geo-location commands
gsm GSM related commands
cdma CDMA related commands
crash crash the emulator instance
kill kill the emulator instance
network manage network settings
power power related commands
quit|exit quit control session
redir manage port redirections
sms SMS related commands
avd control virtual device execution
qemu QEMU-specific commands
sensor manage emulator sensors
finger manage emulator finger print
try 'help <command>' for command-specific help
OK
kill
OK: killing emulator, bye bye
Connection closed by foreign host.
kaa@AGnb:~$ ps -augxw |grep ^jenkins |grep emulator
kaa@AGnb:~$
As I can see, lines 584-586 of "src/main/java/hudson/plugins/android_emulator/AndroidEmulator.java" must be patched to issue 'auth' command before 'kill'
// Stop emulator process
log(emu.logger(), Messages.STOPPING_EMULATOR());
boolean killed = emu.sendCommand("kill");