使用命令列 + 代理更新 Android SDK

姜家志發表於2017-03-24

自動化整合是當前的主流趨勢,一般配置自動化整合環境都是採用Server版本,並沒有桌面環境(沒有UI),之前寫了CentOS 安裝 Jenkins,還有Jenkins持續整合Android專案,下面就需要在Server上安裝Android SDK了,用來打包Android程式。

##獲取SDK安裝包
獲取android-sdk-linux的安裝包,可以通過下面的命令直接獲取。

wget dl.google.com/android/and…

這個包有時候在下不需要翻牆也可以成功下載,如果下載不下來就需要翻牆下載了,再上傳到伺服器上面,或者你的伺服器可以直接翻牆。(推薦一個國內的映象網站tools.android-studio.org/index.php/s…也可以在這個網站上下載)。
直接解壓安裝包:

tar zxvf android-sdk_r24.4.1-linux.tgz

安裝包解壓之後,就需要下載platformplatform-tool以及Android SDK了。使用Android Studio是可以直接在SDK Manager下載的,但是Server上沒有UI,所以需要使用命令列更新了。

##android 命令
到andorid的安裝目錄裡的tools目錄下,執行命令:

android -h

 Usage:
   android [global options] action [action options]
   Global options:
  -s --silent     : Silent mode, shows errors only.
  -v --verbose    : Verbose mode, shows errors, warnings and all messages.
     --clear-cache: Clear the SDK Manager repository manifest cache.
  -h --help       : Help on a specific command.
...
-    sdk              : Displays the SDK Manager window.
-   list sdk          : Lists remote SDK repository.
...
- update sdk          : Updates the SDK by suggesting new platforms to install if available.
- update adb          : Updates adb to support the USB devices declared in the
                    SDK add-ons.複製程式碼

可以看到使用幫助中有update sdk,update adb的升級命令以及list sdk命令。
更新Android SDK主要用到兩個命令,一個是從伺服器上獲取Android最新的可用SDK:

android list sdk

更新SDK的命令:

android update sdk

一般情況下我們不需要更新全部的SDK,只需要選擇性的更新部分SDK即可,可以使用--filter引數,來選擇要更新的SDK,還可以使用android update sdk --no-ui --all --force強制更新所有的SDK到電腦上。
這裡需要重點強調下--all引數,開發環境中不一定使用最新的SDK,有的時候就需要使用之前的build toolssdk,這個時候可以使用引數--filter查到歷史的SDK:

android list sdk --all

列出所有的SDK,在選擇更新sdk的時候使用--filter選擇的時候也必須加上--all引數。
使用命令列更新比較麻煩的是遇到了個問題: 一般更新Andorid SDK都是使用SDK Manager直接更新,而因為牆的問題dl-ssl.google.com/android無法使用。

##使用代理更新SDK
真實情況是執行命令android list sdk的時候,都會卡在:

Fetching https://dl.google.com/android/repository/addons_list-2.xml複製程式碼

因為大家都知道的原因google的服務是無法使用的,還好Android SDK Manager命令提供了兩個代理引數:

  • --proxy-host設定代理的host地址
  • --proxy-port設定代理的埠

可以通過代理使用國內的Android映象,國內的Android代理映象伺服器:

http://mirrors.neusoft.edu.cn 埠:80
http://ubuntu.buct.edu.cn/ 埠:80
http://ubuntu.buct.cn/ 埠:80
http://sdk.gdgshanghai.com 埠:8000
IPv6: http://ubuntu.buct6.edu.cn/ 埠:80複製程式碼

使用代理檢視SDK列表:

android list sdk --proxy-host ubuntu.buct.edu.cn --proxy-port 80 -s --all

 id: 1 or "doc-23"
 Type: Doc
 Desc: Documentation for Android SDK, API 23, revision 1
......複製程式碼

使用代理更新指定SDK:

android update sdk --no-ui --filter 1 --proxy-host ubuntu.buct.edu.cn --proxy-port 80 -s --all

這條命令會安裝id: 1 or "doc-23"Android 23的文件 。
安裝的時候會提示接受license:

Do you accept the license 'android-sdk-preview-license-52d11cd2' [y/n]:複製程式碼

選擇y同意之後才能繼續安裝,等待安裝成功即可。
使用國內的映象伺服器安裝,服務穩定,下載速度快,不需要翻牆。

  • 注:其中extra-android-m2repository,就是android的Support Libraries

##可能會出現的錯誤

  • 第一個可能會出現的錯誤

    Cannot run program "/var/lib/jenkins/tools/android-sdk/build-tools/23.0.1/aapt": error=2, No such file or directory
      at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
      at com.android.builder.png.AaptProcess$Builder.start(AaptProcess.java:163)
      at com.android.builder.png.QueuedCruncher$1.creation(QueuedCruncher.java:106)
      at com.android.builder.tasks.WorkQueue.run(WorkQueue.java:203)
      at java.lang.Thread.run(Thread.java:745)
    Caused by: java.io.IOException: error=2, No such file or directory
      at java.lang.UNIXProcess.forkAndExec(Native Method)
      at java.lang.UNIXProcess.<init>(UNIXProcess.java:248)
      at java.lang.ProcessImpl.start(ProcessImpl.java:134)
      at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
      ... 4 more
    Thread(png-cruncher_2) has a null payload複製程式碼

    因為使用aapt是32位的,不能在64位的系統上面執行,需要安裝對32位的支援。
    CentOS安裝命令:sudo yum install libz.so.1
    Ubuntu安裝命令:sudo yum apt-get install lib32z1

  • 第二個可能會出現的錯誤
    這個錯誤出現在build tools的版本為:25.0.0上面

    /build-tools/25.0.0/aapt:** /lib64/libc.so.6: version GLIBC_2.14' not found (required by /var/lib/jenkins/tools/android-sdk/build-tools/25.0.0/aapt)/var/lib/jenkins/tools/android-sdk/build-tools/25.0.0/aapt: /lib64/libc.so.6: versionGLIBC_2.14' not found (required by /var/lib/jenkins/tools/android-sdk/build-tools/25.0.0/lib64/libc++.so) FAILED

該問題出現的原因是因為libc庫的版本低,CentOS 的libc版本為2.14,需要升級到CentOS 7才有支援GLIBC_2.14,如果不想升級CentOS,就需要自己編譯glibc 2.14,編譯的步驟:

wget ftp.gnu.org/gnu/glibc/g…
tar zxvf glibc-2.14.tar.gz
cd glibc-2.14
mkdir build
cd build
../configure -prefix=/opt/glibc-2.14
make -j4
sudo make install
export LD_LIBRARY_PATH=/opt/glibc-2.14/lib

這樣就可以使用glibc 2.14了,但是aapt並沒有指定使用編譯的glibc-2.14,指定aapt使用glibc-2.14就可以解決上面的問題了。
首先將build tools中的aapt重新命名為:aapt_

cd /path/to/build-tools
mv aapt aapt_

再新建一個指令碼aapt用來指定glibc 2.14的環境變數,設定環境變數之後再啟動重新命名的aapt_,指令碼為:

#!/bin/sh
echo "$0"_$@
export LD_LIBRARY_PATH=/opt/glibc-2.14/lib && "$0"_ $@複製程式碼

這樣就解決了上面的錯誤,完成了Android SDK的安裝

相關文章