Travis CI 失败,因为无法接受许可约束布局

Travis CI failed because cannot accept license Constrain Layout

在我写这个问题之前,我已经搜索过关于这个的相同问题,他们没有导出许可证,因为仍然使用约束布局的 alpha 版本。但是现在 android 已经发布了约束布局的稳定版本。我尝试了很多设置但仍然失败..

我最近的.travis.yml

language: android

jdk: oraclejdk8

android:
  components:
    - platform-tools
    - tools # to get the new `repository-11.xml`
    - tools # see https://github.com/travis-ci/travis-ci/issues/6040#issuecomment-219367943)
    - build-tools-25.0.0
    - android-25

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

  licenses:
    - 'android-sdk-preview-license-52d11cd2'
    - 'android-sdk-license-.+'
    - 'google-gdk-license-.+'

script:
   - ./gradlew clean build

这是我的 build.gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion '25.0.0'
    defaultConfig {
        applicationId "com.package.my"
        minSdkVersion 16
        targetSdkVersion 25
        versionCode 6
        versionName "1.3.1"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    dataBinding {
        enabled = true
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.1.1'
    testCompile 'junit:junit:4.12'
    compile 'com.google.firebase:firebase-database:10.2.0'
    compile 'com.google.firebase:firebase-messaging:10.2.0'
    compile 'com.firebaseui:firebase-ui-database:1.2.0'
    compile 'com.android.support.constraint:constraint-layout:1.0.1'
    compile 'com.android.support:design:25.0.0'
    compile 'org.sufficientlysecure:html-textview:3.2'
    compile 'com.android.support:recyclerview-v7:25.2.0'

}

apply plugin: 'com.google.gms.google-services'

使用这个设置我得到了这个错误

FAILURE: Build failed with an exception.
* What went wrong:
A problem occurred configuring project ':app'.
> You have not accepted the license agreements of the following SDK components:
  [ConstraintLayout for Android 1.0.1, Solver for ConstraintLayout 1.0.1].
  Before building your project, you need to accept the license agreements and complete the installation of the missing components using the Android Studio SDK Manager.
  Alternatively, to learn how to transfer the license agreements from one workstation to another, go to http://d.android.com/r/studio-ui/export-licenses.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: 1 mins 55.975 secs
The command "./gradlew clean build" exited with 1.
Done. Your build exited with 1.

有没有使用出口许可证的解决方案?

更新回复

is there any solution without workaround using export license?

是的,你可以使用新的sdkmanagerinstall the constraint library and accept the 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"

否则,缺少的组件将被gradle检测到并在不接受的情况下下载:

  # Show version and download Gradle Wrapper if it's not already cached
  - cd ${TRAVIS_BUILD_DIR}/${DIR} && ./gradlew --version
  # Clean project and download missing dependencies and components
  - cd ${TRAVIS_BUILD_DIR}/${DIR} && ./gradlew clean build

在这种情况下,如下所述,您需要通过解决方法在第一次接受许可。

Full working sample using constraint-layout codelab repository for Android API level 22 to 25:

language: android
jdk: oraclejdk8
sudo: required # false for Container-Based Infrastructure, required for Sudo-enabled Infrastructure

before_cache:
  - rm -f ${TRAVIS_BUILD_DIR}/gradle/caches/modules-2/modules-2.lock # Avoid to repack it due locks
  - rm -f ${TRAVIS_BUILD_DIR}/gradle/caches/3.3/classAnalysis/classAnalysis.lock
  - rm -f ${TRAVIS_BUILD_DIR}/gradle/caches/3.3/jarSnapshots/jarSnapshots.lock

cache:
  directories:
    - ${TRAVIS_BUILD_DIR}/gradle/caches/
    - ${TRAVIS_BUILD_DIR}/gradle/wrapper/dists/

notifications:
  email: false

android:
  components: # Cookbooks version: https://github.com/travis-ci/travis-cookbooks/tree/9c6cd11
    - tools # Update preinstalled tools from revision 24.0.2 to 24.4.1
    - build-tools-25.0.2 # Match build-tools version used in build.gradle
    - platform-tools # Update platform-tools to revision 25.0.3+
    - tools # Update tools from revision 24.4.1 to 25.2.5

env:
  global:
    - DIR=constraint-layout-start # Project directory
    - API=25 # Android API level 25 by default
    - TAG=google_apis # Google APIs by default, alternatively use default
    - ABI=armeabi-v7a # ARM ABI v7a by default
    - QEMU_AUDIO_DRV=none # Disable emulator audio to avoid warning
    - GRADLE_USER_HOME="${TRAVIS_BUILD_DIR}/gradle" # Change location for Gradle Wrapper and cache
    - ANDROID_HOME=/usr/local/android-sdk-24.0.2 # Depends on the cookbooks version used in the VM
    - TOOLS=${ANDROID_HOME}/tools # PATH order matters, exists more than one emulator script
    - PATH=${ANDROID_HOME}:${ANDROID_HOME}/emulator:${TOOLS}:${TOOLS}/bin:${ANDROID_HOME}/platform-tools:${PATH}
    - ADB_INSTALL_TIMEOUT=20 # minutes (2 minutes by default)

matrix:
  include: # More Emulator API levels to build in parallel
    - env: API=24
    - env: API=23
    - env: API=22
  allow_failures:
    - env: API=23
    - env: API=22
  fast_finish: false

before_install:
  - export EMULATOR="system-images;android-${API};${TAG};${ABI}" # Used to install/create emulator
  - echo 'count=0' > /home/travis/.android/repositories.cfg # Avoid warning

install:
  # List and delete unnecessary components to free space
  - sdkmanager --list || true
  - sdkmanager --uninstall "system-images;android-15;default;armeabi-v7a"
  - sdkmanager --uninstall "system-images;android-16;default;armeabi-v7a"
  - sdkmanager --uninstall "system-images;android-17;default;armeabi-v7a"
  - sdkmanager --uninstall "system-images;android-18;default;armeabi-v7a"
  - sdkmanager --uninstall "system-images;android-19;default;armeabi-v7a"
  - sdkmanager --uninstall "system-images;android-21;default;armeabi-v7a"
  - sdkmanager --uninstall "extras;google;google_play_services"
  - sdkmanager --uninstall "extras;android;support"
  - sdkmanager --uninstall "platforms;android-10"
  - sdkmanager --uninstall "platforms;android-15"
  - sdkmanager --uninstall "platforms;android-16"
  - sdkmanager --uninstall "platforms;android-17"
  - sdkmanager --uninstall "platforms;android-18"
  - sdkmanager --uninstall "platforms;android-19"
  - sdkmanager --uninstall "platforms;android-20"
  - sdkmanager --uninstall "platforms;android-21"
  - sdkmanager --uninstall "build-tools;21.1.2"
  # Update sdk tools to latest version and install/update components
  - echo yes | sdkmanager "tools"
  - echo yes | sdkmanager "platforms;android-25" # Latest platform required by SDK tools
  - echo yes | sdkmanager "platforms;android-${API}" # Android platform required by emulator
  - echo yes | sdkmanager "extras;android;m2repository"
  - echo yes | sdkmanager "extras;google;m2repository"
  - 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"
  - echo yes | sdkmanager "$EMULATOR" # Install emulator system image
  # Create and start emulator
  - echo no | avdmanager create avd -n acib -k "$EMULATOR" -f --abi "$ABI" --tag "$TAG"
  - emulator -avd acib -engine classic -no-window -camera-back none -camera-front none -verbose -qemu -m 512 &
  # Start adbd, wait for device connected and show android serial
  - adb wait-for-device get-serialno
  # Show version and download Gradle Wrapper if it's not already cached
  - cd ${TRAVIS_BUILD_DIR}/${DIR} && ./gradlew --version
  # Clean project and download missing dependencies and components
  - cd ${TRAVIS_BUILD_DIR}/${DIR} && ./gradlew clean build
  # Check components status
  - sdkmanager --list || true

before_script:
  # Wait for emulator fully-booted and disable animations
  - android-wait-for-emulator
  - adb shell settings put global window_animation_scale 0 &
  - adb shell settings put global transition_animation_scale 0 &
  - adb shell settings put global animator_duration_scale 0 &
  - sleep 30
  - adb shell input keyevent 82 &

script:
  # Run all device checks
  - cd ${TRAVIS_BUILD_DIR}/${DIR} && ./gradlew connectedCheck

after_script:
  # Show tests and lint results
  - cat ${TRAVIS_BUILD_DIR}/${DIR}/*/build/outputs/androidTest-results/connected/*
  - cat ${TRAVIS_BUILD_DIR}/${DIR}/*/build/reports/lint-results.xml

另外两个示例使用 sdkmanageravdmanager,没有 ${DIR} 解决方法:

参考资料

官方ci与Auto-download missing packages with Gradle

相关的所有文档

new Emulator options are explained in Start the Emulator from the Command Line

avdmanager explained here replaces android avd since SDK tools version 25.3.0

sdkmanager explained here 还增强了从命令行查看和接受所有许可证的能力


之前的回复:因为 sdkmanager 替换了 android 脚本

我对 Travis-ci 有点过时了,现在似乎需要额外的工作,所以你最好检查一下:

  • 因为 tir38 noticed, android tool 不再受支持。相反,使用 sdkmanager...

  • 打开此主题的 issue and

In your .travis.yml file add:

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"

Do not forgot to accept all the licences on the main android object:

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

If you are getting "Please install the missing components using the SDK manager in Android Studio." error you can just install the missing component with the sdkmanager command line tool:

echo y | sdkmanager "extras;m2repository;com;android;support;constraint;constraint-layout;1.0.0-beta4"
echo y | sdkmanager "extras;m2repository;com;android;support;constraint;constraint-layout-solver;1.0.0-beta"
  • This article 解释 Circle-ci 和 Travis-ci

  • 的约束布局问题
  • Documentation关于AndroidSDK工具包(25.2.3+)中提供的sdkmanager


过时的解决方案:在 android 脚本弃用之前

我不使用默认的 Travis-ci 脚本来安装 Android 组件并接受许可,from here:

# Install and update SDK
function install-and-update-sdk {
    # Keep SDK packages up-to-date (only missing suggested updates are installed).
    ( sleep 5 && while [ 1 ]; do sleep 1; echo y; done ) | android update sdk -u -t \
        ${UPDATE_PKGS:-'platform-tools,tools,extra-android-m2repository,extra-google-m2repository'}
    # Install or reinstall SDK packages (if empty, all packages are installed).
    ( sleep 5 && while [ 1 ]; do sleep 1; echo y; done ) | android update sdk -a -u -t \
        ${INSTALL_PKGS:-'build-tools-23.0.3,android-23'},${TARGET_PKGS:-}
}

你可以同时接受所有的许可,如果你这样做 this:

# THE SETUP STAGE
# ---------------
# If you comment out this section, Travis CI will install for you the components you define here.
# Check your project requirements and the components included by default on Travis-ci VM images.
# Check required: https://github.com/google/iosched/blob/master/doc/BUILDING.md
# Check defaults: http://docs.travis-ci.com/user/languages/android/#Pre-installed-components

android:
  components:
    # Check Android SDK tools: http://developer.android.com/tools/sdk/tools-notes.html
    # Check Android SDK Platform-tools: http://developer.android.com/tools/revisions/platforms.html
    # Comment the lines below if the latest revisions of Android SDK Tools are included by default.
    # - tools
    # - platform-tools
    # ...
  licenses:
    # Check licenses: http://docs.travis-ci.com/user/languages/android/#Dealing-with-Licenses
    # By default Travis will accept all the licenses, but it's also possible to define a white list:
    # White list current android-sdk-license revision.
    # - 'android-sdk-license-5be876d5'
    # White list all android-sdk-license revisions.
    # - 'android-sdk-license-.+'
    # White list all the licenses.
    - '.+'

我遇到了同样的问题,问题是我使用的是 android 构建工具和 gradle 版本的一个旧版本,只需将它们更新到可用的最新版本就可以了。 例如,今天 gradle 的最后一个版本是 3.3,构建工具的最后一个版本是 2.3.3。 我的 build.gradle 文件看起来像

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.3'
    }
}

前段时间有人提出这个问题https://issuetracker.google.com/issues/37102998 如果您转到最后的答案,您会发现只需升级 gradle 版本和构建工具版本即可解决问题。

对我有用的最简单的解决方案是将 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/"

精确 link 解:https://github.com/travis-ci/travis-ci/issues/6617#issuecomment-369580270