Travis CI 构建不适用于 Android 约束布局
Travis CI build doesn't work with Android Constraint Layout
我正在尝试让 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
吗?
您的 build.gradle
正试图拉入 com.android.support.constraint:constraint-layout:1.0.0-alpha2
。我的 SDK 管理器只提供 1.0.0-alpha1
(Android 支持存储库的修订版 32)。也许 Travis CI 也只有 1.0.0-alpha1
。
因为我假设您 1.0.0-alpha2
在您的开发机器上工作,所以我不太确定这里发生了什么。 Android 支持存储库或其他东西的分发包中可能存在故障。
有一个未解决的问题https://code.google.com/p/android/issues/detail?id=212128
简而言之,com.android.support.constraint:constraint-layout:1.0.0-alpha1
被捆绑到 Google 存储库中,但 1.0.0-alpha2
和更高版本只能从 gradle 插件获得,该插件需要将许可文本放置在 $HOME/.android/license/
(如果找不到,请尝试 $ANDROID_HOME/licenses
)。
您可以将许可文本文件从您的本地计算机(在同意 Android Studio 2.2 提供的 SDK Manager 的许可后)复制到问题中提到的 CI 服务器。或者降级到 1.0.0-alpha1
来解决问题。
我和 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
...
支持库版本 25.0.0 的新版本发布后,约束布局 Alpha1 库显然不再适用于特拉维斯CI。使用该版本是目前唯一的解决方法。
现在我找到了使用新 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
上接受所有许可证 object:
licenses:
- android-sdk-license-.+
- '.+'
不再需要接受许可的变通方法如果您直接接受许可:
- echo yes | sdkmanager "extras;m2repository;com;android;support;constraint;constraint-layout;1.0.2"
- echo yes | sdkmanager "extras;m2repository;com;android;support;constraint;constraint-layout-solver;1.0.2"
Full working sample using constraint-layout codelab repository for Android API level 22 to 25.
遗憾的是,添加许可证哈希不再有效。
对我有用的最简单的解决方案(2018 年)是将 SDK 许可证从 SDK 复制到我的项目,然后告诉 Travis 在构建时将它们复制到自身。
Travis 的 Github 页面上已经有一个已解决的问题,其中提到的解决方案之一目前肯定有效。
解决方案
- 复制 Android SDK 根目录中的
licenses
文件夹。
- 将其粘贴到您自己的项目的根目录中,与
.travis.yml
文件所在的同一层次结构中。
- 将这些命令添加到您的
.travis.yml
的 before_install
块中:
.travis.yml:
before_install:
- mkdir "$ANDROID_HOME/licenses" || true
- cp ./licenses/* "$ANDROID_HOME/licenses/"
精确 link 解:https://github.com/travis-ci/travis-ci/issues/6617#issuecomment-369580270
Link 我对另一个 SO 问题的原始回答:
我正在尝试让 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
吗?
您的 build.gradle
正试图拉入 com.android.support.constraint:constraint-layout:1.0.0-alpha2
。我的 SDK 管理器只提供 1.0.0-alpha1
(Android 支持存储库的修订版 32)。也许 Travis CI 也只有 1.0.0-alpha1
。
因为我假设您 1.0.0-alpha2
在您的开发机器上工作,所以我不太确定这里发生了什么。 Android 支持存储库或其他东西的分发包中可能存在故障。
有一个未解决的问题https://code.google.com/p/android/issues/detail?id=212128
简而言之,com.android.support.constraint:constraint-layout:1.0.0-alpha1
被捆绑到 Google 存储库中,但 1.0.0-alpha2
和更高版本只能从 gradle 插件获得,该插件需要将许可文本放置在 $HOME/.android/license/
(如果找不到,请尝试 $ANDROID_HOME/licenses
)。
您可以将许可文本文件从您的本地计算机(在同意 Android Studio 2.2 提供的 SDK Manager 的许可后)复制到问题中提到的 CI 服务器。或者降级到 1.0.0-alpha1
来解决问题。
我和 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
...
支持库版本 25.0.0 的新版本发布后,约束布局 Alpha1 库显然不再适用于特拉维斯CI。使用该版本是目前唯一的解决方法。
现在我找到了使用新 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
上接受所有许可证 object:
licenses:
- android-sdk-license-.+
- '.+'
不再需要接受许可的变通方法
- echo yes | sdkmanager "extras;m2repository;com;android;support;constraint;constraint-layout;1.0.2"
- echo yes | sdkmanager "extras;m2repository;com;android;support;constraint;constraint-layout-solver;1.0.2"
Full working sample using constraint-layout codelab repository for Android API level 22 to 25.
遗憾的是,添加许可证哈希不再有效。
对我有用的最简单的解决方案(2018 年)是将 SDK 许可证从 SDK 复制到我的项目,然后告诉 Travis 在构建时将它们复制到自身。
Travis 的 Github 页面上已经有一个已解决的问题,其中提到的解决方案之一目前肯定有效。
解决方案
- 复制 Android SDK 根目录中的
licenses
文件夹。 - 将其粘贴到您自己的项目的根目录中,与
.travis.yml
文件所在的同一层次结构中。 - 将这些命令添加到您的
.travis.yml
的before_install
块中:
.travis.yml:
before_install:
- mkdir "$ANDROID_HOME/licenses" || true
- cp ./licenses/* "$ANDROID_HOME/licenses/"
精确 link 解:https://github.com/travis-ci/travis-ci/issues/6617#issuecomment-369580270
Link 我对另一个 SO 问题的原始回答: