34

我正在安装 android SDK 来创建一个自动构建服务器。我遇到了一个问题,我管理的许多基于 Gradle 的 Android 项目依赖于不同的构建工具版本。一些项目仍然需要旧的构建工具版本(例如 v19.1.0)。

我的 android-sdk 包是在 build-tools 版本 20 刚刚发布时下载的,所以这是唯一可以通过android update sdk -u --filter build-tools.

我试图调用android update sdk -u --filter build-tools-19.1.0,但没有奏效。有没有一种简单的方法可以从命令行安装旧版本的 Android 构建工具?

注意:无法通过 GUI 安装

4

4 回答 4

68

假设您已经下载了适用于 linux 的 Android SDK,您有两个从命令行更新的选项。

使用sdk 中的android工具下载

除了使用 GUI 运行 android sdk 管理器之外,您还可以选择在无头模式下运行。您只需要指定-u(或--no-ui)标志。

列出可用于安装或升级的软件包:

$ cd android-sdk-linux
$ ./tools/android list sdk --all
Refresh Sources:
  (...)
  Fetching URL: https://dl.google.com/android/repository/repository-11.xml
  (...)
Packages available for installation or update: 166
   1- Android SDK Tools, revision 24.4.1
   2- Android SDK Tools, revision 25.0.9 rc10
   3- Android SDK Platform-tools, revision 23.1
   4- Android SDK Platform-tools, revision 24 rc1
   5- Android SDK Build-tools, revision 24 rc1
   6- Android SDK Build-tools, revision 23.0.2
   7- Android SDK Build-tools, revision 23.0.1
   8- Android SDK Build-tools, revision 23 (Obsolete)
  (...)
 162- Google Play Billing Library, revision 5
 163- Google Play Licensing Library, revision 2
 164- Android Auto API Simulators, revision 1
 165- Google Web Driver, revision 2
 166- Intel x86 Emulator Accelerator (HAXM installer), revision 6.0.1
 

要下载特定软件包,您需要从以下命令的列表中指定要安装的项目的数量:

$ ./tools/android update sdk -u -a -t [NO_OF_ITEM_TO_BE_INSTALLED]

示例:如果我想安装 Android SDK 构建工具修订版 23.0.1,我将输入:

$ ./tools/android update sdk -u -a -t 7

手动下载

由于不是每个包(尤其是旧包)都在你这样做时列出android sdk list,你也可以手动下载东西。您可以手动打开期间显示的 XML 文件android sdk list- https://dl.google.com/android/repository/repository-11.xml

您可以在那里找到各种类型的下载内容的链接,例如:

手动下载例如版本 19.0.1 的构建工具

$ cd android-sdk-linux/build-tools
$ wget http://dl.google.com/android/repository/build-tools_r19.0.1-linux.zip
$ unzip build-tools_r19.0.1-linux.zip
$ mv android-4.4.2 19.0.1
$ rm build-tools_r19.0.1-linux.zip

旁注(ubuntu):

如果你运行的是 64 位的 debian/ubuntu,aapt你需要安装额外的包:

sudo apt-get install lib32stdc++6
sudo apt-get install lib32z1

如果您正在运行 CentOs (RedHat),要运行aapt您将需要安装额外的软件包:

sudo yum install zlib.i686 libstd++.i686

在运行aapt时,如果您在 GLIBC 2.14 中遇到错误并且您不会升级您的语言环境 GLIBC。然后你需要为 sdk (build-tool, platform-tool) 下载以下包:

构建工具:http: //dl.google.com/android/repository/build-tools_r23.0.2-linux.zip

平台工具:https ://dl.google.com/android/repository/platform-tools_r23.0.1-linux.zip

于 2014-10-14T16:37:01.933 回答
7

您想要的是能够在命令行中获得与 SDK Manager GUI 相同的功能。

发出此命令以从存储库中查询所有可用的包。该查询将返回左侧带有索引号的包。

[rgulia@xinu ~]$ android list sdk --all 
Refresh Sources:
  Fetching https://dl-ssl.google.com/android/repository/addons_list-2.xml
  Validate XML
  Parse XML
  Fetched Add-ons List successfully
  …
  Validate XML: https://dl-ssl.google.com/android/repository/sys-img/x86/addon-x86.xml
  Parse XML:    https://dl-ssl.google.com/android/repository/sys-img/x86/addon-x86.xml
  Packages available for installation or update: 138
  1- Android SDK Tools, revision 24.1.2
  2- Android SDK Platform-tools, revision 22
  3- Android SDK Build-tools, revision 22.0.1
  4- Android SDK Build-tools, revision 22 (Obsolete)
  5- Android SDK Build-tools, revision 21.1.2
  ….

您可以使用 grep 命令来缩小搜索范围。例如:

[rgulia@xinu ~]$ android list sdk --all | grep -i tools | grep 21
   5- Android SDK Build-tools, revision 21.1.2
   6- Android SDK Build-tools, revision 21.1.1 (Obsolete)
   7- Android SDK Build-tools, revision 21.1 (Obsolete)
   8- Android SDK Build-tools, revision 21.0.2 (Obsolete)
   9- Android SDK Build-tools, revision 21.0.1 (Obsolete)
  10- Android SDK Build-tools, revision 21 (Obsolete)

最后,通过在此命令中提供其索引号来安装所需的包。

[rgulia@xinu ~]$ android update sdk -u -a -t 5

选项具有以下含义:

-u (--no-ui)  # Headless mode
-a (--all)    # Includes all packages, included the obsolete ones
-t (--filter) # in this example we have filtered by package index, i.e. 5 
于 2015-04-28T22:24:20.333 回答
3

回答我自己的问题,我刚刚发现实现我的目标的最佳方法之一是使用Jake Wharton 的 SDK manager Gradle 插件

就像添加 Gradle 插件一样简单。任何需要的 SDK 包都将按需安装到local.properties.

buildscript {
  repositories {
    mavenCentral()
  }
  dependencies {
    classpath 'com.android.tools.build:gradle:0.12.+'
    classpath 'com.jakewharton.sdkmanager:gradle-plugin:0.12.+'
  }
}

apply plugin: 'android-sdk-manager'
apply plugin: 'com.android.application'

This approach works great especially in headless CI environment. Just don't forget to add ANDROID_HOME environment variable just in case you don't have local.properties already (which most likely happens on CI environment)

于 2015-01-16T04:27:08.187 回答
2

基于:如何在命令行安装Android SDK Build Tools?其他的是我的版本:

#!/bin/bash -e

installAndroidSdk() {
    local url=http://dl.google.com/android/android-sdk_r24.3-linux.tgz

    sudo apt-get install -y lib32stdc++6 lib32z1

    # Install android SDK
    (
        cd /opt

        curl -o android.tgz -sL $url

        tar xzf android.tgz

        mv android-sdk-linux/ android

        rm android.tgz

        echo "export ANDROID_HOME=/opt/android" > /etc/profile.d/android.sh
        echo "export PATH=\$PATH:\$ANDROID_HOME/tools:\$ANDROID_HOME/platform-tools" >> /etc/profile.d/android.sh
        source /etc/profile.d/android.sh

        android list sdk --all --extended > /tmp/android-skds

        modules=( platform-tools build-tools-22.0.1 android-22 )
        for module in ${modules[@]}; do
            moduleId=$(less /tmp/android-skds | sed -n "s/id: \(.*\) or \"$module\"/\1/p")
            if [[ ! -z "$moduleId" ]]; then
                expect -c "
                    set timeout -1   ;
                    spawn android update sdk -u -a -t $moduleId;
                    expect { 
                        \"Do you accept the license\" { exp_send \"y\r\" ; exp_continue }
                        eof
                    }
                "
            else
                echo "[WARNING] - $module was not installed."
            fi
        done

        echo "export PATH=\$PATH:\$ANDROID_HOME/build-tools/22.0.1" | sudo tee -a /etc/profile.d/android.sh

        rm -f /tmp/android-skds
        sudo apt-get install -y android-tools-adb
    )
    return $?
}
于 2015-06-03T15:02:50.780 回答