Las pruebas de Android fallan en Travis con ShellCommandUnresponsiveException

Estamos viendo muchos fallos en la construcción de la primera e incluso segunda ejecución de solicitudes de extracción para nuestro proyecto de Android en Travis. Sin embargo, si reiniciamos exactamente la misma construcción muchas veces pasa.

Esto es lo que parece el error en los fallos:

:onebusaway-android:connectedAndroidTest 09:48:14 E/Device: Error during shell execution: null Unable to install /home/travis/build/OneBusAway/onebusaway-android/onebusaway-android/build/outputs/apk/onebusaway-android-debug.apk com.android.ddmlib.InstallException at com.android.ddmlib.Device.installPackages(Device.java:927) at com.android.builder.testing.ConnectedDevice.installPackages(ConnectedDevice.java:105) at com.android.builder.internal.testing.SimpleTestCallable.call(SimpleTestCallable.java:125) at com.android.builder.internal.testing.SimpleTestCallable.call(SimpleTestCallable.java:48) at java.util.concurrent.FutureTask.run(FutureTask.java:262) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) at java.util.concurrent.FutureTask.run(FutureTask.java:262) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:745) Caused by: com.android.ddmlib.ShellCommandUnresponsiveException at com.android.ddmlib.AdbHelper.executeRemoteCommand(AdbHelper.java:513) at com.android.ddmlib.AdbHelper.executeRemoteCommand(AdbHelper.java:390) at com.android.ddmlib.AdbHelper.executeRemoteCommand(AdbHelper.java:359) at com.android.ddmlib.Device.executeShellCommand(Device.java:566) at com.android.ddmlib.Device.createMultiInstallSession(Device.java:987) at com.android.ddmlib.Device.installPackages(Device.java:884) ... 9 more com.android.builder.testing.ConnectedDevice > runTests[test(AVD) - 5.0.1] FAILED com.android.builder.testing.api.DeviceException: com.android.ddmlib.InstallException at com.android.builder.testing.ConnectedDevice.installPackages(ConnectedDevice.java:108) null com.android.builder.testing.api.DeviceException: com.android.ddmlib.InstallException at com.android.builder.testing.ConnectedDevice.installPackages(ConnectedDevice.java:108) at com.android.builder.internal.testing.SimpleTestCallable.call(SimpleTestCallable.java:125) at com.android.builder.internal.testing.SimpleTestCallable.call(SimpleTestCallable.java:48) at java.util.concurrent.FutureTask.run(FutureTask.java:262) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) at java.util.concurrent.FutureTask.run(FutureTask.java:262) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:745) Caused by: com.android.ddmlib.InstallException at com.android.ddmlib.Device.installPackages(Device.java:927) at com.android.builder.testing.ConnectedDevice.installPackages(ConnectedDevice.java:105) ... 8 more Caused by: com.android.ddmlib.ShellCommandUnresponsiveException at com.android.ddmlib.AdbHelper.executeRemoteCommand(AdbHelper.java:513) at com.android.ddmlib.AdbHelper.executeRemoteCommand(AdbHelper.java:390) at com.android.ddmlib.AdbHelper.executeRemoteCommand(AdbHelper.java:359) at com.android.ddmlib.Device.executeShellCommand(Device.java:566) at com.android.ddmlib.Device.createMultiInstallSession(Device.java:987) at com.android.ddmlib.Device.installPackages(Device.java:884) ... 9 more :onebusaway-android:connectedAndroidTest FAILED FAILURE: Build failed with an exception. 

Estamos ejecutando pruebas en el emulador de Travis usando gradlew connectedTest .

Aquí está nuestro .travis.yml:

 # Test format changes to this .travis.yml file before submitting a PR with: # http://lint.travis-ci.org/OneBusAway/onebusaway-android language: android jdk: oraclejdk7 # Turn off caching to avoid any caching problems cache: false # Use the Travis Container-Based Infrastructure (see #203) sudo: false env: global: - ANDROID_API_LEVEL=21 - ANDROID_BUILD_TOOLS_VERSION=21.1.2 - ANDROID_ABI=google_apis/armeabi-v7a android: components: - platform-tools - tools - build-tools-$ANDROID_BUILD_TOOLS_VERSION - android-$ANDROID_API_LEVEL # For Google Maps API v1 - addon-google_apis-google-$ANDROID_API_LEVEL # Google Play Services - extra-google-google_play_services # Support library - extra-android-support # Latest artifacts in local repository - extra-google-m2repository - extra-android-m2repository # Specify at least one system image - sys-img-armeabi-v7a-addon-google_apis-google-$ANDROID_API_LEVEL before_script: # Create and start emulator - echo no | android create avd --force -n test -t "Google Inc.:Google APIs:"$ANDROID_API_LEVEL --abi $ANDROID_ABI - emulator -avd test -no-skin -no-audio -no-window & script: - ./wait_for_emulator - ./gradlew connectedCheck -PdisablePreDex # Integration with Gitter (https://gitter.im/OneBusAway/onebusaway-android) notifications: webhooks: urls: - https://webhooks.gitter.im/e/493b93a98ed03a010c4c on_success: change # options: [always|never|change] default: always on_failure: always # options: [always|never|change] default: always on_start: false # default: false 

Puede establecer la variable ambiental ADB_INSTALL_TIMEOUT en Travis en un valor tal como 8 minutos para evitar este problema.

Por ejemplo, en su .travis.yml:

 language: android jdk: oraclejdk7 # Turn off caching to avoid any caching problems cache: false # Use the Travis Container-Based Infrastructure sudo: false env: global: - ANDROID_API_LEVEL=21 - ANDROID_BUILD_TOOLS_VERSION=21.1.2 - ANDROID_ABI=armeabi-v7a - ADB_INSTALL_TIMEOUT=8 # minutes (2 minutes by default) android: components: - platform-tools - tools - build-tools-$ANDROID_BUILD_TOOLS_VERSION - android-$ANDROID_API_LEVEL 

ShellCommandUnresponsiveException está relacionado con el problema 69735 de AOSP: Ddmlib es demasiado agresivo con los tiempos de espera en Device.java , lo que provoca que ddmlib se apague rápidamente si no recibe entrada. La variable ambiental anterior amplía este tiempo de espera en la Travis VM.

También asegúrese de que está utilizando las herramientas SDK y Build más recientes del API (por lo menos la versión anterior), ya que las versiones anteriores no permiten establecer esta variable ambiental.

Tenga en cuenta que esto sólo puede resolver su problema si sus pruebas de vez en cuando pasar Travis – si su compilación siempre falla puede tener otros problemas en curso.

EDITAR Marzo 2016

Tenga en cuenta que si sigue viendo fallos, especialmente en el emulador de Nivel de API 23, hay otro problema de tiempo de espera de emulador que puede estar causándole problemas.

Para evitar esto, tendrás que actualizar tu plugin de Gradle a por lo menos 2.0.0-beta3 – por ejemplo:

 dependencies { classpath 'com.android.tools.build:gradle:2.0.0-beta5' } 

Para más detalles, consulte:

  • ¿Cuál es la mejor práctica para usar keystores para firmar la versión de lanzamiento de una aplicación para Android en Travis CI?
  • Dependencias de Gradle con Travis CI en proyecto Android
  • Almacenamiento en caché del SDK de Android en Travis CI
  • La construcción de Travis CI no funciona con Android Constraint Layout
  • Error al iniciar el emulador x86 de Android en Travis CI
  • Travis CI Android Tests: no hay dispositivos conectados
  • Travis CI Android - No encuentra la versión que coincide
  • Travis CI se queda atascado en la creación de herramientas de construcción en Android
  • Cómo ejecutar Prueba Travis-CI y Espresso
  • Leer versionName de build.gradle en bash
  • Prueba de instrumentación de Android falla en Travis CI AVD pero funciona en emulador local
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.