Uploaded image for project: 'Jenkins'
  1. Jenkins
  2. JENKINS-35004

Android Emulator plugin fails to shutdown AVD since SDK emulator 25.1.6 release

    XMLWordPrintable

Details

    • Bug
    • Status: Closed (View Workflow)
    • Critical
    • Resolution: Fixed
    • None
    • Ubuntu 16.04 64bit
      Android SDK revision 25.1.6
      Jenkins 2.5 and 1.651.2
      Android Emulator Plugin 2.14.1

    Description

      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

      1. emulator processes continue consuming CPU and RAM
      2. 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");
      

      Attachments

        Activity

          Thanks for the detailed report!

          I've updated the plugin to disable the auth token, and released version 2.15.

          orrc Christopher Orr added a comment - Thanks for the detailed report! I've updated the plugin to disable the auth token, and released version 2.15.

          Code changed in jenkins
          User: Christopher Orr
          Path:
          src/main/java/hudson/plugins/android_emulator/AndroidEmulator.java
          src/main/java/hudson/plugins/android_emulator/EmulatorConfig.java
          src/main/java/hudson/plugins/android_emulator/util/Utils.java
          http://jenkins-ci.org/commit/android-emulator-plugin/98f6b8cdc0e389cd9fe5fbed34ec4e53e52c199a
          Log:
          [FIXED JENKINS-35004] Disable console auth token at startup.

          Otherwise, by default starting with SDK Tools 25.1.6, you need to authenticate
          before you can start using the telnet interface. So here we use the documented
          way of disabling this feature, i.e. returning to the old behaviour.

          scm_issue_link SCM/JIRA link daemon added a comment - Code changed in jenkins User: Christopher Orr Path: src/main/java/hudson/plugins/android_emulator/AndroidEmulator.java src/main/java/hudson/plugins/android_emulator/EmulatorConfig.java src/main/java/hudson/plugins/android_emulator/util/Utils.java http://jenkins-ci.org/commit/android-emulator-plugin/98f6b8cdc0e389cd9fe5fbed34ec4e53e52c199a Log: [FIXED JENKINS-35004] Disable console auth token at startup. Otherwise, by default starting with SDK Tools 25.1.6, you need to authenticate before you can start using the telnet interface. So here we use the documented way of disabling this feature, i.e. returning to the old behaviour.

          Code changed in jenkins
          User: Christopher Orr
          Path:
          src/main/java/hudson/plugins/android_emulator/AndroidEmulator.java
          src/main/java/hudson/plugins/android_emulator/EmulatorConfig.java
          src/main/java/hudson/plugins/android_emulator/util/Utils.java
          http://jenkins-ci.org/commit/android-emulator-plugin/31c1582fea973e5ab530f188b7f360c261b8d4ef
          Log:
          [FIXED JENKINS-35004] Disable console auth token at startup.

          Otherwise, by default starting with SDK Tools 25.1.6, you need to authenticate
          before you can start using the telnet interface. So here we use the documented
          way of disabling this feature, i.e. returning to the old behaviour.

          scm_issue_link SCM/JIRA link daemon added a comment - Code changed in jenkins User: Christopher Orr Path: src/main/java/hudson/plugins/android_emulator/AndroidEmulator.java src/main/java/hudson/plugins/android_emulator/EmulatorConfig.java src/main/java/hudson/plugins/android_emulator/util/Utils.java http://jenkins-ci.org/commit/android-emulator-plugin/31c1582fea973e5ab530f188b7f360c261b8d4ef Log: [FIXED JENKINS-35004] Disable console auth token at startup. Otherwise, by default starting with SDK Tools 25.1.6, you need to authenticate before you can start using the telnet interface. So here we use the documented way of disabling this feature, i.e. returning to the old behaviour.

          Re-closing this issue, since somebody randomly re-opened it…

          orrc Christopher Orr added a comment - Re-closing this issue, since somebody randomly re-opened it…

          People

            orrc Christopher Orr
            kaa Andrey Kopeyko
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: