2014-09-24 75 views
30

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

当build-tools版本20刚刚发布时,我的android-sdk软件包被下载了,所以这是唯一可以通过android update sdk -u --filter build-tools下载的版本。

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

注:通过GUI安装是不可能的

回答

54

假设你已经下载了Android SDK for linux的,你有两个选择命令行进行更新。使用Android的工具从SDK

相反的运行与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] 

例子:如果我想安装的Andorid 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

您可以在此处找到要下载的各种类型的东西的链接,G:

要手动下载例如构建工具

$ 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 

附注19.0.1版本(Ubuntu的):

如果您正在运行Debian/Ubuntu的64位,运行aapt你需要安装额外的软件包:

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

如果你正在运行的CentOS(红帽),运行aapt你需要安装额外的软件包:

sudo yum install zlib.i686 libstd++.i686 

在运行aapt时,如果您在GLIBC 2.14中遇到错误,并且您不想升级您的语言环境GLIBC。然后u需要下载以下软件包SDK(建设 - 工具,平台工具):

构建工具: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

+0

你说下载的Android SDK之后,首先我们需要运行“android update sdk -u”。当它没有过滤器,然后它会下载巨大的演出....我需要的是一个特定的版本.... – 2015-12-30 09:03:41

+0

@DoronShai我更新了答案,希望它现在完成! – wtekiela 2016-03-11 16:36:44

+0

@wtekiela你“旁注”非常有帮助。谢谢!这本身就是一个受欢迎的问题。 – BrianTheLion 2016-07-28 13:38:52

3

回答我的问题,我刚才发现实现我的目标的最好方法之一是使用SDK manager Gradle plugin by Jake Wharton

就像添加Gradle插件一样简单。任何必需的SDK软件包将根据需要安装到local.properties中指定的SDK位置。

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' 

这种方法在无头CI环境下工作得非常好。只是不要忘记添加ANDROID_HOME环境变量,以防万一您没有local.properties(这很可能发生在CI环境中)

7

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

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

[[email protected] ~]$ 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命令缩小搜索范围。例如:

[[email protected] ~]$ 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) 

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

[[email protected] ~]$ 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 
2

How to install Android SDK Build Tools on the command line?和其他人在这里是我的版本:

#!/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 $? 
} 
相关问题