android - 无法配置 travis 以在 android 项目上工作

标签 android build travis-ci

我发现了 Travis CI 的几个问题,我一直在解决它们,但最后一个我不能。

我遇到了常见错误 com.android.ddmlib.InstallException: 建立 session 失败

这是我的 travis 文件:

language: android

before_install:
 - chmod +x gradlew

android:
  components:
    # Uncomment the lines below if you want to
    # use the latest revision of Android SDK Tools
    # - platform-tools
    # - tools

    # The BuildTools version used by your project
    - tools
    - build-tools-23.0.3

    # Additional components
    - extra-google-m2repository
    - extra-android-m2repository

    # The SDK version used to compile your project
    - android-23

    # Specify at least one system image,
    # if you need to run emulator(s) during your tests
    - sys-img-armeabi-v7a-android-23
    #- sys-img-x86-android-17

env:
  global:
    # install timeout in minutes (2 minutes by default)
    - ADB_INSTALL_TIMEOUT=8

# Emulator Management: Create, Start and Wait
before_script:
  - echo no | android create avd --force --name test --target android-23 --abi armeabi-v7a
  - emulator -avd test -no-skin -no-audio -no-window -gpu off -no-boot-anim &
  - android-wait-for-emulator
  - adb devices
  - adb shell input keyevent 82 &

script:
  - echo $ADB_INSTALL_TIMEOUT
  - android list target
  - ./gradlew connectedAndroidTest

after_failure:
  # Customize this line, 'android' is the specific app module name of this project. Shows log.
  - export MY_MOD="SimpleLock"
  - export MY_LOG_DIR="$(pwd)/app/build/reports/androidTests/connected/"
  - pwd && cd "${MY_LOG_DIR:-.}" && pwd && ls -al
  - sudo apt-get install -qq lynx && lynx --dump index.html > myIndex.log
  - lynx --dump com.android.builder.testing.ConnectedDevice.html > myConnectedDevice.log
  - lynx --dump com.android.builder.testing.html > myTesting.log
  - for file in *.log; do echo "$file"; echo "====================="; cat "$file"; done || true

这是我的 travis 输出: https://travis-ci.org/GarceGon/SimpleLock/builds/139367600

:app:connectedDebugAndroidTestUnable to install /home/travis/build/GarceGon/SimpleLock/app/build/outputs/apk/app-debug.apk
com.android.ddmlib.InstallException: Failed to establish session
    at com.android.ddmlib.SplitApkInstaller.install(SplitApkInstaller.java:66)
    at com.android.ddmlib.Device.installPackages(Device.java:901)
    at com.android.builder.testing.ConnectedDevice.installPackages(ConnectedDevice.java:119)
    at com.android.builder.internal.testing.SimpleTestCallable.call(SimpleTestCallable.java:121)
    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)
com.android.builder.testing.ConnectedDevice > runTests[test(AVD) - 6.0] FAILED 
    com.android.builder.testing.api.DeviceException: com.android.ddmlib.InstallException: Failed to establish session
        at com.android.builder.testing.ConnectedDevice.installPackages(ConnectedDevice.java:129)
null
com.android.builder.testing.api.DeviceException: com.android.ddmlib.InstallException: Failed to establish session
    at com.android.builder.testing.ConnectedDevice.installPackages(ConnectedDevice.java:129)
    at com.android.builder.internal.testing.SimpleTestCallable.call(SimpleTestCallable.java:121)
    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: Failed to establish session
    at com.android.ddmlib.SplitApkInstaller.install(SplitApkInstaller.java:66)
    at com.android.ddmlib.Device.installPackages(Device.java:901)
    at com.android.builder.testing.ConnectedDevice.installPackages(ConnectedDevice.java:119)
    ... 8 more
:app:connectedDebugAndroidTest FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':app:connectedDebugAndroidTest'.
> There were failing tests. See the report at: file:///home/travis/build/GarceGon/SimpleLock/app/build/reports/androidTests/connected/index.html
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
BUILD FAILED
Total time: 2 mins 20.531 secs
The command "./gradlew connectedAndroidTest" exited with 1.

谢谢!

最佳答案

解决方案:

删除 -no-boot-anim 选项以等待模拟器准备就绪并将超时增加到 10 分钟。


第一期:

替换

  - emulator -avd test -no-skin -no-audio -no-window -gpu off -no-boot-anim &

通过

  - emulator -avd test -no-skin -no-audio -no-window -gpu off &

删除 -no-boot-anim 选项,android-wait-for-emulator 脚本依赖于启动动画来检测模拟器何时准备就绪,正如我解释的 here

我 fork 了你的项目以在开发分支和 Travis-CI 构建 passed 上确认这一点,但是......


第二期:

后来我使用主分支和构建 failed 重新创建了更改 ...

Caused by: com.android.ddmlib.ShellCommandUnresponsiveException

Sean Barbeau 很好地解释了问题的 this 版本:

# install timeout in minutes (2 minutes by default)
- ADB_INSTALL_TIMEOUT=8

并且您还修复了另一个超时问题,解释为 herehere 需要更多时间,see:

Android Gradle Plugin had a hard coded timeout value that was too low.

Google fixed it (version 2.0.0-beta3):

https://code.google.com/p/android/issues/detail?id=189764

So what do we put in build.gradle to set this timeout value?

Currently it's all attached to android.adbOptions.timeOutInMs.

Sample: Google project Increasing ADB timeout and adding Travis-ci support. It works!

// This enables long timeouts required on slow environments, e.g. Travis
adbOptions {
    timeOutInMs 10 * 60 * 1000  // Set the timeout to 10 minutes
    installOptions "-d","-t"
}

我像 Mark McDonald 那样将超时从 1 分钟增加到 10 分钟,构建 passed :

enter image description here

关于android - 无法配置 travis 以在 android 项目上工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37956789/

相关文章:

java - 获取空对象 - 将数据从一个 Activity 发送到另一个 Activity

git - 构建Giraph时出现编译错误

xcode - 构建 Mac OS 应用程序 - 隐藏 'Contents' 文件夹中的文件

android - Android构建使用Travis的多个productFlavor buildTypes

rust - 如何使Travis-CI使用x86_64-pc-windows-msvc构建Rust二进制文件?

android - 按顺序运行 robolectric 测试?

Android Instant 应用程序无法通过应用程序链接在我的 Beta 预发布测试中运行

android - 如果已经在运行android,如何防止服务再次运行

java - 使用 Netbeans 构建可执行的 .jar 文件

ubuntu - 无法使用 Travis-CI 运行可执行文件 - 不确定我做错了什么