2015-03-09 4 views
17

Мы видим много сбоев сборки при первом и даже втором выполнении запросов на тягу для нашего Android-проекта на Travis. Однако, если мы перезапустим одну и ту же сборку достаточно, она в конечном итоге пройдет.Тесты на Android не работают на Travis с ShellCommandUnresponsiveException

Вот что ошибка выглядит на неудачах:

: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. 

Мы проводим тесты на эмуляторе на Трэвиса, используя gradlew connectedTest.

Вот наш .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 

ответ

15

Вы можете установить переменные окружения ADB_INSTALL_TIMEOUT на Travis до такого значения, как 8 минут, чтобы избежать этой проблемы.

Например, в ваших .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 связана с AOSP issue 69735: Ddmlib is too agressive with timeouts in Device.java, что приводит к ddmlib тайм-аут быстро, если он не получает входной сигнал. Указанная выше переменная среды расширяет этот период таймаута на VM Travis.

Также убедитесь, что вы используете новейшие инструменты SDK для уровня API и сборки (по крайней мере, выше), поскольку более ранние версии не позволяют установить эту переменную окружения.

Обратите внимание, что это может решить вашу проблему только в том случае, если ваши тесты периодически передаются на Travis - если ваша сборка всегда терпит неудачу, у вас могут возникнуть другие проблемы.

РЕДАКТИРОВАТЬ марта 2016

Обратите внимание, что если вы по-прежнему видим неудачи, особенно на уровне API 23 эмуляторе, есть другой эмулятор проблема тайм-аут, который может быть причиной вам проблем.

Чтобы обойти эту проблему, вам необходимо обновить плагин Gradle, по крайней мере 2.0.0-beta3 - например:

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

Для получения дополнительной информации см:

+3

Пришел сюда через поиск Google, любой, кто это видит; знаете, исправить это в CircleCi? Получение той же ошибки, но не знаю, как ее исправить в CircleCi –

+0

@RED_ Вы можете установить одну и ту же переменную в CircleCI: https://circleci.com/docs/configuration#modifiers – Peeja

+2

Спасибо, но с тех пор я так много сделал. Даже CircleCi говорят, что сейчас у них нет решения. может просто перейти к Тревису. –

Смежные вопросы