Android的测试失败的特拉维斯与ShellCommandUnresponsiveException [英] Android tests fail on Travis with ShellCommandUnresponsiveException

查看:1172
本文介绍了Android的测试失败的特拉维斯与ShellCommandUnresponsiveException的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我们看到了很多的构建失败对我们的特拉维斯Android项目引入请求的第一,甚至第二执行。但是,如果我们重新启动了完全相同的构建足够的时间它最终通过。

下面是错误看起来像失败:

 :onebusaway-机器人:connectedAndroidTest
九时48分14秒E /设备:shell执行过程中的错误:空
无法安装/home/travis/build/OneBusAway/onebusaway-android/onebusaway-android/build/outputs/apk/onebusaway-android-debug.apk
com.android.ddmlib.InstallException
在com.android.ddmlib.Device.installPackages(Device.java:927)
在com.android.builder.testing.ConnectedDevice.installPackages(ConnectedDevice.java:105)
在com.android.builder.internal.testing.SimpleTestCallable.call(SimpleTestCallable.java:125)
在com.android.builder.internal.testing.SimpleTestCallable.call(SimpleTestCallable.java:48)
在java.util.concurrent.FutureTask.run(FutureTask.java:262)
在java.util.concurrent.Executors $ RunnableAdapter.call(Executors.java:471)
在java.util.concurrent.FutureTask.run(FutureTask.java:262)
在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
在java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:615)
在java.lang.Thread.run(Thread.java:745)
com.android.ddmlib.ShellCommandUnresponsiveException:产生的原因
在com.android.ddmlib.AdbHelper.executeRemoteCommand(AdbHelper.java:513)
在com.android.ddmlib.AdbHelper.executeRemoteCommand(AdbHelper.java:390)
在com.android.ddmlib.AdbHelper.executeRemoteCommand(AdbHelper.java:359)
在com.android.ddmlib.Device.executeShellCommand(Device.java:566)
在com.android.ddmlib.Device.createMultiInstallSession(Device.java:987)
在com.android.ddmlib.Device.installPackages(Device.java:884)
... 9个
com.android.builder.testing.ConnectedDevice> runTests [测试(AVD) -  5.0.1]失败
com.android.builder.testing.api.DeviceException:com.android.ddmlib.InstallException
    在com.android.builder.testing.ConnectedDevice.installPackages(ConnectedDevice.java:108)
空值
com.android.builder.testing.api.DeviceException:com.android.ddmlib.InstallException
在com.android.builder.testing.ConnectedDevice.installPackages(ConnectedDevice.java:108)
在com.android.builder.internal.testing.SimpleTestCallable.call(SimpleTestCallable.java:125)
在com.android.builder.internal.testing.SimpleTestCallable.call(SimpleTestCallable.java:48)
在java.util.concurrent.FutureTask.run(FutureTask.java:262)
在java.util.concurrent.Executors $ RunnableAdapter.call(Executors.java:471)
在java.util.concurrent.FutureTask.run(FutureTask.java:262)
在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
在java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:615)
在java.lang.Thread.run(Thread.java:745)
com.android.ddmlib.InstallException:产生的原因
在com.android.ddmlib.Device.installPackages(Device.java:927)
在com.android.builder.testing.ConnectedDevice.installPackages(ConnectedDevice.java:105)
... 8个
com.android.ddmlib.ShellCommandUnresponsiveException:产生的原因
在com.android.ddmlib.AdbHelper.executeRemoteCommand(AdbHelper.java:513)
在com.android.ddmlib.AdbHelper.executeRemoteCommand(AdbHelper.java:390)
在com.android.ddmlib.AdbHelper.executeRemoteCommand(AdbHelper.java:359)
在com.android.ddmlib.Device.executeShellCommand(Device.java:566)
在com.android.ddmlib.Device.createMultiInstallSession(Device.java:987)
在com.android.ddmlib.Device.installPackages(Device.java:884)
... 9个
:onebusaway-机器人:connectedAndroidTest失败
失败:建立失败,一个例外。
 

我们正在对特拉维斯使用运行在模拟器上测试 gradlew connectedTest

下面是我们的.travis.yml:

 提交公关与之前#测试格式更改此.travis.yml文件:
#http://lint.travis-ci.org/OneBusAway/onebusaway-android

语言:机器人
JDK:oraclejdk7
#关闭缓存以避免任何缓存问题
缓存:假的
#使用特拉维斯基于容器的基础设施(见#203)
须藤:假的
ENV:
  全球:
     -  ANDROID_API_LEVEL = 21
     -  ANDROID_BUILD_TOOLS_VERSION = 21.1.2
     -  ANDROID_ABI = google_apis / armeabi,V7A

机器人:
  组件:
     - 平台工具
     - 工具
     - 构建 - 工具 -  $ ANDROID_BUILD_TOOLS_VERSION
     -  android- $ ANDROID_API_LEVEL
    #对于谷歌地图API V1
     - 插件 -  google_apis-google- $ ANDROID_API_LEVEL
    #谷歌播放服务
     - 超谷歌,google_play_services
    #支持库
     - 额外的Andr​​oid支持
    #最新文物在本地资源库
     - 超谷歌,m2repository
     - 额外的Andr​​oid m2repository
    #至少指定一个系统映像
     -  SYS-IMG-armeabi-V7A-插件-google_apis-google- $ ANDROID_API_LEVEL

before_script:
  #创建并启动模拟器
   - 回声无| Android的创建AVD --force -n测试-t谷歌公司:谷歌的API:$ ANDROID_API_LEVEL --abi $ ANDROID_ABI
   - 模拟器-avd测试 - 无 - 皮 - 无 - 音频 - 无窗和放大器;

脚本:
   -  ./wait_for_emulator
   -  ./gradlew connectedCheck -Pdisable preDex

与小胶质#集成(https://gitter.im/OneBusAway/onebusaway-android)
通知:
  webhooks:
    网址:
       -  https://webhooks.gitter.im/e/493b93a98ed03a010c4c
    on_success:变化#选项:总是|从不|变化]默认:总是
    ON_FAILURE:总是#选项:总是|从不|变化]默认:总是
    on_start:假#默认:假的
 

解决方案

您可以 ADB_INSTALL_TIMEOUT 在特拉维斯环境变量设置为一个值,如8分钟就能避免这个问题。

例如,在你的.travis.yml:

 语言:机器人
JDK:oraclejdk7
#关闭缓存以避免任何缓存问题
缓存:假的
#使用特拉维斯基于容器的基础架构
须藤:假的
ENV:
  全球:
     -  ANDROID_API_LEVEL = 21
     -  ANDROID_BUILD_TOOLS_VERSION = 21.1.2
     -  ANDROID_ABI = armeabi,V7A
     -  ADB_INSTALL_TIMEOUT = 8#分钟(2分钟默认情况下)

机器人:
  组件:
     - 平台工具
     - 工具
     - 构建 - 工具 -  $ ANDROID_BUILD_TOOLS_VERSION
     -  android- $ ANDROID_API_LEVEL
 

ShellCommandUnresponsiveException 涉及的 AOSP问题69735:Ddmlib太与Device.java 的,这会导致ddmlib超时很快,如果它没有接收到输入超时侵略性。上述环境变量扩展的特拉维斯VM此超时时间。

另外,请确保您使用的是最新的API级别的SDK和构建工具(至少上面的版本),因为早期版本不允许设置此环境变量。

请注意,这可能只是解决您的问题,如果你的测试偶尔通上特拉维斯 - 如果你的构建总是失败,您可能有其他问题怎么回事

修改2015年11月10号

请注意,如果你看到的仍然是失败的,尤其是在API级别23模拟器,有可能导致您的问题另一个打开模拟器超时问题。

请参阅:

We're seeing a lot of build failures on the first and even second execution of pull requests for our Android project on Travis. However, if we restart the exact same build enough times it eventually passes.

Here's what the error looks like on failures:

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

We're running tests on the emulator on Travis using gradlew connectedTest.

Here's our .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

解决方案

You can set the environmental variable ADB_INSTALL_TIMEOUT on Travis to a value such as 8 minutes to avoid this problem.

For example, in your .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

The ShellCommandUnresponsiveException is related to AOSP issue 69735: Ddmlib is too agressive with timeouts in Device.java, which causes ddmlib to timeout quickly if it doesn't receive input. The above environmental variable extends this timeout period on the Travis VM.

Also please be sure you're using the latest API level SDK and Build tools (at least the version above), since earlier versions don't allow setting this environmental variable.

Note that this may only resolve your problem if your tests occasionally pass on Travis - if your build always fails you may have other problems going on.

EDIT Nov 10th 2015

Note that if you're still seeing failures, especially on API Level 23 emulator, there is another open emulator timeout issue that may be causing you problems.

See:

这篇关于Android的测试失败的特拉维斯与ShellCommandUnresponsiveException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆