Travis CI构建无法与Android约束布局一起使用。

22

我正在尝试让Travis构建我的Android项目。当它尝试下载ConstraintLayout库时失败了。你知道我该怎么做才能让它工作吗?

我的.travis.yml文件是这样的:

language: android
jdk:
  - oraclejdk8
android:
  components:
    - platform-tools
    - tools
    - build-tools-23.0.2
    - android-23
    - extra-android-support
    - extra-android-m2repository
    - extra-google-m2repository

我的 build.gradle 文件是:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"
    defaultConfig {
        applicationId "my.example.bdd"
        minSdkVersion 9
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:23.4.0'
    compile 'com.android.support.constraint:constraint-layout:1.0.0-alpha2'
    testCompile 'junit:junit:4.12'
    androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2'
    androidTestCompile 'com.android.support.test:runner:0.5'
    androidTestCompile 'com.android.support:support-annotations:23.4.0'
}

在 Travis 上出现的错误是:

FAILURE: Build failed with an exception.
* What went wrong:
A problem occurred configuring project ':app'.
> Could not resolve all dependencies for configuration ':app:_debugApk'.
   > Could not find com.android.support.constraint:constraint-layout:1.0.0-alpha2.
     Searched in the following locations:
         https://jcenter.bintray.com/com/android/support/constraint/constraint-layout/1.0.0-alpha2/constraint-layout-1.0.0-alpha2.pom
         https://jcenter.bintray.com/com/android/support/constraint/constraint-layout/1.0.0-alpha2/constraint-layout-1.0.0-alpha2.jar
         file:/usr/local/android-sdk/extras/android/m2repository/com/android/support/constraint/constraint-layout/1.0.0-alpha2/constraint-layout-1.0.0-alpha2.pom
         file:/usr/local/android-sdk/extras/android/m2repository/com/android/support/constraint/constraint-layout/1.0.0-alpha2/constraint-layout-1.0.0-alpha2.jar
         file:/usr/local/android-sdk/extras/google/m2repository/com/android/support/constraint/constraint-layout/1.0.0-alpha2/constraint-layout-1.0.0-alpha2.pom
         file:/usr/local/android-sdk/extras/google/m2repository/com/android/support/constraint/constraint-layout/1.0.0-alpha2/constraint-layout-1.0.0-alpha2.jar

你有什么办法来修复这个问题吗?使用Travis构建ConstraintLayout是否可能?


2
就我所知,我在extras/android/m2repository/com/android/support/constraint/constraint-layout中没有看到1.0.0-alpha2版本。我只看到了1.0.0-alpha1版本。根据SDK管理器显示,我的设置是最新的(Android支持库版本为Rev 32)。 - CommonsWare
可以。似乎 1.0.0-alpha2 还没有发布。如果您将此作为答案发布,我会接受它。 - Terry
我尝试从本地SDK中提取.aar/.jar文件,但无法使其正常工作。如果有人能够做到,那可能是一个临时解决方案,直到问题得到解决? - virtualandy
1
如果您查看由@CommonsWare提到的错误报告,它有其他信息可以帮助解决这个问题。 要点:Gradle将下载constraint-layout依赖项,因为它们未捆绑。 您需要在$ANDROID_HOME / SDK中拥有许可证文件才能执行此操作。 您还可能需要使CI实例上的SDK可写。 希望对您有所帮助。 - virtualandy
@virtualandy 需要哪个许可证文件?有没有其他简单的替代方案?谢谢! - fasteque
@fasteque 抱歉,我的表述不够清晰。请查看错误报告中的Response's #19-21。他们指出您应该通过Android Studio/SDK UI接受许可证,然后进入AS/SDK并获取一个目录(其中包含2个纯文本文件)。该目录需要复制到无头/CI实例的SDK中。 - virtualandy
6个回答

18

在支持库版本25.0.0发布后,似乎约束布局库Alpha1在TravisCI上不再起作用。目前使用该版本是唯一的解决方法。

现在我找到了一个新的解决方法,可以使用新的Alpha9版本。在你的.travis.yml文件中添加:

before_install:
  - mkdir "$ANDROID_HOME/licenses" || true
  - echo -e "\n8933bad161af4178b1185d1a37fbf41ea5269c55" > "$ANDROID_HOME/licenses/android-sdk-license"
  - echo -e "\n84831b9409646a918e30573bab4c9c91346d8abd" > "$ANDROID_HOME/licenses/android-sdk-preview-license"

不要忘记在主android对象上接受所有许可证:

licenses:
  - android-sdk-license-.+
  - '.+'

2
非常好用!感谢分享! - Gnzlt

13

你的 build.gradle 试图引入 com.android.support.constraint:constraint-layout:1.0.0-alpha2。但我的SDK管理器只提供了 1.0.0-alpha1(Android支持库的Rev32)。也许Travis CI也只有1.0.0-alpha1

我猜想你的开发机器上已经使用了 1.0.0-alpha2,所以我不太确定此处出了什么问题。可能是Android支持库的分发包装存在一些小问题。


2
1.0.0-alpha2版本附带Studio 2.2的第二个预览版。不确定他们如何使其可用于gradle构建...我在我的Jenkins服务器上遇到了类似的问题(找不到1.0.0-alpha2)。 - Dodge
同样的问题,关于Jenkins。我尝试了很多选项,包括使用http://dl.google.com/android/android-sdk_r24.4.1-linux.tgz,然后它可以解决alpha1,但不能解决alpha2。 - virtualandy
1
顺便说一句,我已经提交了一个关于这个问题的错误报告 - CommonsWare
@CommonsWare 谢谢!注意 https://code.google.com/p/android/issues/detail?id=185638#c4 中提到命令行 SDK 更新程序不再有任何开发。:( - virtualandy

7

有一个未解决的问题https://code.google.com/p/android/issues/detail?id=212128

简而言之,com.android.support.constraint:constraint-layout:1.0.0-alpha1被捆绑到Google Repository中,但1.0.0-alpha2以及后来的版本仅可从gradle插件中获取,该插件需要将许可证文本放置在$HOME/.android/license/(如果找不到,请尝试$ANDROID_HOME/licenses)。

你可以从Android Studio 2.2提供的SDK Manager同意许可协议后,将许可证文本文件从本地机器复制到CI服务器中,如此问题即可得到解决。或者降级到1.0.0-alpha1版本以解决问题。


1

1
我遇到了与 com.android.support.constraint:constraint-layout:1.0.0-alpha9 相同的问题。在我的情况下,我直接尝试在 Travis 中创建许可文件,方法如下:
before_install:
  - mkdir "$ANDROID_SDK/licenses" || true
  - echo -e "\n8933bad161af4178b1185d1a37fbf41ea5269c55" > "$ANDROID_SDK/licenses/android-sdk-license"

但是由于我没有在$ANDROID_SDK上写入的权限,也没有支持sudo,我不知道接下来该怎么做。
我唯一看到的选择是等待Google将其包含在许可中或降级到alpha1...

我将我的机器上的许可文件夹复制到了我的代码库中,并添加了以下依赖项:dependencies: pre: - scp -r ${HOME}/${CIRCLE_PROJECT_REPONAME}/licenses $ANDROID_HOME - oldergod
1
@gonzalo,请检查一下我的解决方案,它与你的相同,但添加了新的预览范围许可证。它在TravisCI上运行良好,无需回滚到Alpha1。 - amouly

0

遗憾的是,添加许可证散列值不再起作用。

对我来说(在2018年)最简单的解决方案是从SDK中将SDK许可证复制到我的项目中,然后告诉Travis在构建时将它们复制到自身。

Travis的Github页面上已经有一个关闭的问题,并且其中提到的解决方案当前确实有效。

解决方案

  1. 复制Android SDK根目录中的licenses文件夹。
  2. 将其粘贴到与.travis.yml文件位于相同层次结构的您自己项目的根目录中。
  3. 将这些命令添加到.travis.ymlbefore_install块中:

.travis.yml

before_install:
- mkdir "$ANDROID_HOME/licenses" || true
- cp ./licenses/* "$ANDROID_HOME/licenses/"

解决方案的精确链接:https://github.com/travis-ci/travis-ci/issues/6617#issuecomment-369580270

我的原始答案在另一个 SO 问题上的链接:https://dev59.com/QFgQ5IYBdhLWcg3wdzvX#49050480


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接