2014-09-24 76 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 $? 
} 
相關問題