自动接受所有SDK许可证

由于gradle安卓插件2.2-alpha4 :

Gradle将尝试下载项目依赖的缺less的SDK包

这是非常酷,并知道是一个杰克·沃顿项目 。

但是,要下载SDK库,您需要:接受许可协议或gradle告诉您:

您尚未接受以下SDK组件的许可协议:[Android SDK Build-Tools 24,Android SDK Platform 24]。 在构build项目之前,您需要接受许可证协议,并使用Android Studio SDK Manager完成缺失组件的安装。 或者,要了解如何将许可协议从一个工作站传输到另一个工作站,请访问http://d.android.com/r/studio-ui/export-licenses.html

这是一个问题,因为我希望在进行gradle build时安装所有的sdk依赖gradle build

我正在寻找一个解决scheme来自动接受所有的许可证。 也许是一个gradle脚本? 你有什么想法吗?

谢谢!

[编辑]

一个解决scheme是执行:

 android update sdk --no-ui --filter build-tools-24.0.0,android-24,extra-android-m2repository 

并手动安装,但这是gradle的新function。

[编辑2]

更好的解决scheme是使用sdkmananger:

 yes | sudo sdkmanager --licenses 

我遇到了alpha5预览。

杰克·沃顿指出,你目前可以使用

 mkdir -p "$ANDROID_SDK/licenses" echo -e "\n8933bad161af4178b1185d1a37fbf41ea5269c55" > "$ANDROID_SDK/licenses/android-sdk-license" echo -e "\n84831b9409646a918e30573bab4c9c91346d8abd" > "$ANDROID_SDK/licenses/android-sdk-preview-license" 

重新创build您机器上的当前$ANDROID_HOME/license文件夹。 这与msg( http://tools.android.com/tech-docs/new-build-system/license )链接中列出的过程具有相同的结果。

哈希是许可证文本的sha1s,我想这将被定期更新,所以这个代码将只工作这么长时间:)

并手动安装,但这是gradle的新function。

一开始我很惊讶,即使我已经通过android工具接受了命名组件的许可证,但这并没有起作用,但是它指出了AS内的SDKpipe理器创build/licenses文件夹。

我想官方工具不会因法律原因而跳过这一步。

重新阅读它的发行说明

SDK自动下载:Gradle将尝试下载项目依赖的缺less的SDK包。

这并不意味着它会工作,如果你还没有安装Android工具,并已经接受了最新的许可证。

编辑:说,它仍然不能在我的testinggubuntu框上工作,直到我连接SDK到AS。 CI工作正常 – 不知道有什么区别…

对于最新的Android Studio(2.3),更新/接受所有许可证的最佳方法是运行:

 tools/bin/sdkmanager --licenses 

您可能仍然需要根据您的设置将许可证文件复制到其他位置。

如果您正在使用Jenkins,则可以使用以下bash脚本作为构build过程中的第一步:

 (while sleep 3; do echo "y"; done) | $ANDROID_HOME/tools/android update sdk -u 

这当然会安装所有可用的更新,但如果您可以节省磁盘空间,它将为您节省一些时间。 睡眠是为了避免安装程序中的readline被破坏,因为在这种情况下“yes”无法正常工作。

编辑:您还需要在构build步骤中添加“安装Android项目先决条件”插件,以获得正确的$ ANDROID_HOME,如果您正在使用内置的SDKpipe理器。

AndroidSDK终于可以接受许可证。

 yes | sdkmanager --licenses 

对于新的sdkmanager实用程序:

yes | $ANDROID_HOME/tools/bin/sdkmanager "build-tools;24.0.3"

yesses之间有一点点延迟,所以命令可能会暂停,许可显示一段时间,但不需要人为干预。

不幸的是,OP最初解决的方式并不总是有效。 如果您从错误消息中发现什么是您的构build当前构build工具版本 。 这可能是它缺less的更高版本的构build工具。 在这种情况下,您需要手动启动SDK Manager并添加构build工具并接受许可证。

根据OP说明,它看起来如下。

$ ./gradlew build

 
为了遵守这个构build的JVM设置,将分叉一个新的JVM。 请考虑使用守护进程:https://docs.gradle.org/2.14.1/userguide/gradle_daemon.html。

失败:生成失败,出现exception。

 * 什么地方出了错:
configuration项目“:app”时发生问题。
 >您尚未接受以下SDK组件的许可协议:
   [Android SDK Build-Tools 24.0.2]。

 ...
构build失败

注意:2017-04-16

android工具现在已经被弃用,以支持新的sdkmanager 。 请参阅Joe Lawson的答案以及从2017年3月开始的后续post。

然后调整你的命令如下:

 android update sdk --no-ui --filter build-tools-24.0.2,android-24,extra-android-m2repository 
刷新来源:
  获取https://dl.google.com/android/repository/addons_list-2.xml
  validationXML
  parsingXML
  获取插件列表成功
  刷新来源
  获取url:https://dl.google.com/android/repository/repository-11.xml
  validationXML:https://dl.google.com/android/repository/repository-11.xml
  parsingXML:https://dl.google.com/android/repository/repository-11.xml
 ...
错误:忽略未知的包filter“build-tools-24.0.2”
 -------------------------------
许可证ID:android-sdk-license-xxxxxxxx
使用: 
  -  SDK平台Android 7.0,API 24,修订版2
   -  Android支持库,修订版39
 -------------------------------

 ...

 2015年11月20日
你接受许可证'android-sdk-license-xxxxxxxx'[y / n]:y

安装档案:
  准备安装档案
  下载SDK平台Android 7.0,API 24,修订版2
  安装SDK平台Android 7.0,API 24,修订版2
    已安装SDK平台Android 7.0,API 24,修订版296%)
  下载Android支持库,修订版本39
  安装Android支持库,修订版39
    已安装Android支持库,修订版3999%)
  完成。  2包安装。

再次运行这个,还是不要让Gradle高兴。 所以人工接受是唯一的解决scheme,直到有人提出更好的东西。 (请做!)

android工具已被弃用,您应该改用sdkmanagersdkmanager也会在您首次接受时写入许可证文件。 即使使用命令,许可证也会根据您使用的SDK而变化

 echo -e "\n8933bad161af4178b1185d1a37fbf41ea5269c55" > "$ANDROID_SDK/licenses/android-sdk-license" 

在一些系统上工作。 它不会工作。 有些SDK安装期望许可文件在文件中没有换行符的情况下结束,因此请尝试在echo命令中添加-n

 echo -n -e "\n8933bad161af4178b1185d1a37fbf41ea5269c55" > "$ANDROID_SDK/licenses/android-sdk-license" 

如果这不起作用,你可以尝试使用base64编码。

所以要发现我的许可证:

 $> rm ${ANDROID_HOME}/ $> unzip tools_r25.2.3-linux.zip -d ${ANDROID_HOME} $> ${ANDROID_HOME}/tools/bin/sdkmanager "system-images;android-23;default;x86_64" 

它会提示你接受许可证。 接受后将它复制到${ANDROID_HOME}/licenses/android-sdk-license 。 为了确保你总是得到正确的书面使用base64

 $> base64 ${ANDROID_HOME}/licenses/android-sdk-license Cjg5MzNiYWQxNjFhZjQxNzhiMTE4NWQxYTM3ZmJmNDFlYTUyNjljNTU= 

然后你可以使用base64 -d重新创build文件。

 $> echo Cjg5MzNiYWQxNjFhZjQxNzhiMTE4NWQxYTM3ZmJmNDFlYTUyNjljNTU= | base64 -d > ${ANDROID_HOME}/licenses/android-sdk-license 

您可以通过运行sha1sum来validation写入的文件是否是预期的。

 $> sha1sum ${ANDROID_HOME}/licenses/android-sdk-license da6b80c9c47b41c0bf7032938e7137a58a3dc249 

请注意,对于目前所有遇到这个问题的人来说,build-tools-24.0.2现在被认为已经过时了,所以你会得到:

  Error: Ignoring unknown package filter 'build-tools-24.0.2' 

当运行已经build议安装它们的各种命令时。

解决scheme是添加 – 所有:

 android update sdk --no-ui --all --filter "build-tools-24.0.2" 

另外,如果你在32位的Linux上, 所有的 构build工具23.0.1之后的版本都是64位 ,所以不会运行。 32位用户被困在23.0.1上,获得更高版本的工具的唯一方法是切换到64位。

我们在jenkins发现了同样的问题。 使用buildToolsVersion '25.0.2' ,我们必须在构build之前接受许可证。 在我们的例子中,我们需要运行:

./sdkmanager --update ,要求我们接受sdkmanager的许可证,然后

./sdkmanager --licenses要求我们接受之前未被接受的新许可证的许可证

记住:用jenkins的用户来运行这些指令。 在我的Debian中,Jenkins用户只是jenkins 。 换句话说:以root身份进行操作会以root身份创build所接受的许可证,因此Jenkins将不会读取它们。

顺便说一句,我们在/var/lib/jenkins/tools/android-sdk/tools/binfind了sdkmanager 。 如果你的不在那里,用find / -name "sdkmanager"

有关SDK api编号为25的错误消息:

android update sdk --no-ui --all --filter build-tools-25.0.1,android-25,extra-android-m2repository

这解决了我的错误

 yes | $ANDROID_HOME/tools/bin/sdkmanager "build-tools;25.0.2" 

如果你运行yes | sdkmanager --licenses yes | sdkmanager --licenses ,然后我们打印$ANDROID_HOME/licenses/android-sdk-license

我们会得到这个

 # cat $ANDROID_HOME/licenses/android-sdk-license 8933bad161af4178b1185d1a37fbf41ea5269c55 d56f5187479451eabf01fb78af6dfcb131a6481e 

对于GitLab CI,要接受Android SDK构build工具26.0.2许可证,您需要运行此操作

 before_script: - mkdir -p $ANDROID_HOME/licenses - echo "8933bad161af4178b1185d1a37fbf41ea5269c55" > $ANDROID_HOME/licenses/android-sdk-license - echo "d56f5187479451eabf01fb78af6dfcb131a6481e" >> $ANDROID_HOME/licenses/android-sdk-license 

如果您使用tools/bin/sdkmanager --licenses ,则仍然需要人工交互。 我有使用我的gitlab CI的问题。 这是我的解决scheme:

 wget --quiet --output-document=tools.zip https://dl.google.com/android/repository/sdk-tools-linux-3859397.zip unzip -qq tools.zip echo y | tools/bin/sdkmanager "platforms;android-25" echo y | tools/bin/sdkmanager "platform-tools" echo y | tools/bin/sdkmanager "build-tools;25.0.2" echo y | tools/bin/sdkmanager "extras;android;m2repository" echo y | tools/bin/sdkmanager "extras;google;m2repository" 

如果有任何问题, echo y会说是,但是您需要为每个安装包制作一行

我通过使用公认的许可证文件创build公共git回购来解决这个问题。 然后,我使用wget在运行./gradlew构build我的项目之前将所需的任何计算机上的许可证提取到[sdk-dir] / licenses目录中。

复制整个许可证/目录,并将其粘贴到您希望构build项目的机器上的Android SDK主目录中。

https://developer.android.com/studio/intro/update.html#download-with-gradle

这为我解决了这个问题

在Windows PowerShell中,您可以执行此操作

 for($i=0;$i -lt 30;$i++) { $response += "y`n"}; $response | sdkmanager --licenses 

这更加灵活,并且需要零手动干预。 30号码是任意的,应该足以覆盖许可证接受的数量,但是如果需要的话可以增加

我跑

 #react-native run-android 

从terminal,并遇到了这个问题。 对于手动,请转到Android Studio – > Android SDK – > SDK Platform单击Show Packages Detail并检查:

 + Google APIs + Android SDK Platform 23 + Intel x86 Atom_64 System Image + Google APIs Intel x86 Atom_64 System Image 

安装软件包时,勾选accept license =>可以解决问题。

有两种方法可以解决这个问题。

  1. 通过接受许可协议,使用命令窗口更新sdk工具如下,只需根据您的需要更改版本。

    android update sdk –no-ui –filter build-tools-25.0.2,android-25,extra-android-m2repository

  2. 第二种方法是将许可证文件夹复制到Android根目录。 转到您的开发机器打开Android Studio。 从“项目结构”菜单中find您的SDK位置。 (C:\ Users \用户名\应用程序数据\本地\的Android \ SDK)。 在该目录下,必须有一个许可证文件夹。 复制该文件夹的内容。 把这个文件夹粘贴到你的Jenkins服务器机器上(或者你遇到这个问题的地方)在android sdk根目录下。 (C:\用户\ UserName.jenkins \ TOOLS \ Android的SDK)

最后,这两个简单的步骤在Windows 10上为我工作。

1)确保你更新你的Android构build工具和API。 在Android Sdk上点击安装包安装可用的更新。

2)启动您的Android Studio,系统会提示您安装需要的编译工具,以便更新已经更新的api和工具。这将安装编译工具属性,包括许可证和完成的工作。

我导航到:

 /usr/lib/android-sdk/licenses 

我inputterminal:

 echo -e "\n8933bad161af4178b1185d1a37fbf41ea5269c55" > $ANDROID_SDK/licenses/android-sdk-license" 

拥有root权限。 现在它适用于我。

这项工作就像一个魅力。 疑难杂症。

(同时睡3;做回声“y”;完成)| $ ANDROID_HOME / tools / android update sdk -u

cd $ ANDROID_HOME / tools / bin ./sdkmanager –update