當前位置: 首頁>>技術問答>>正文


如何命令行安裝Android SDK Build Tools(構建工具)?

Android構建工具安裝的問題

我想從命令行建立Android開發環境,遇到了如下問題:

wget http://dl.google.com/android/android-sdk_r22.0.5-linux.tgz

提取文件之後,運行如下命令

tools/android update sdk --no-ui

另外,運行下麵的命令速度很慢

Fetching https://dl-ssl.google.com/android/repository/addons_list-2.xml

而且,結果文件夾build-tools中什麽都沒有,我需要的是aaptapkbuilder,因為我想從沒有ant的命令行構建apk。

最佳解決方法

默認情況下,命令行中的SDK Manager(SDK管理器)不包括列表中的構建工具。它們屬於”obsolete”類別。要查看所有可用的下載,請使用命令

android list sdk --all

然後從命令行中獲取該列表中的一個包,使用:

android update sdk -u -a -t <package no.>

-u代表--no-ui-a代表--all-t代表--filter

如果需要安裝多個軟件包,則:

android update sdk -u -a -t 1,2,3,4,..,n 

其中1,2,..,n是上麵list命令列出的包號

次佳解決方法

跟其他答案提到的一樣,可以使用--filter選項來限製已安裝的軟件包:

android update sdk --filter ...

其他答案沒有提到是:可以使用常量字符串標識符,而不是過濾器選項的索引。這對自動或腳本化安裝很有幫助。 --filter選項:

… This also accepts the identifiers returned by ‘list sdk –extended’.

android list sdk --all --extended

Packages available for installation or update: 97
----------
id: 1 or "tools"
     Type: Tool
     Desc: Android SDK Tools, revision 22.6.2
----------
id: 2 or "platform-tools"
     Type: PlatformTool
     Desc: Android SDK Platform-tools, revision 19.0.1
----------
id: 3 or "build-tools-19.0.3"
     Type: BuildTool
     Desc: Android SDK Build-tools, revision 19.0.3

然後,可以使用字符串ids作為過濾器選項來精確指定所需的版本:

android update sdk --filter tools,platform-tools,build-tools-19.0.3

第三種解決方法

ADB Build-Tools不會自動下載,需要通過命令android update sdk --no-ui

首先,在控製台輸入命令:

android list sdk --all

然後,記住內容之前列出的編號並執行以下操作:

android update sdk -u --all --filter <number>

命令應該在/YourFolder/android-sdk-linux/tools輸入

對於遠程文件夾(例如ssh打開的服務器)也可以輸入:

**./android** list sdk --all
**./android** update sdk -u --all --filter <number>

要獲取ADB包的簡單列表,在終端輸入:

android list sdk

要安裝所有軟件包:

android update sdk --no-ui

或使用過濾器(其中逗號分隔符):

android update sdk --no-ui --filter 3,5,8,14

第四種方法

Android SDK Tools包的版本25.2.3(以及更高版本)包含一個新工具-sdkmanager – 它簡化了從命令行安裝build-tools的任務,位於android_sdk/tools/bin文件夾中。

用法(來自documentation):

sdkmanager packages [options] 

The packages argument is an SDK-style path, wrapped in quotes (for example, "build-tools;25.0.0" or "platforms;android-25"). You can pass multiple package paths, separated with a space, but they must each be wrapped in their own set of quotes.

用法示例(在Mac上):

alex@mbpro:~/sdk/tools/bin$ ls ../../build-tools/  
25.0.0/   
alex@mbpro:~/sdk/tools/bin$ ./sdkmanager "build-tools;25.0.2"  
done   
alex@mbpro:~/sdk/tools/bin$ ls ../../build-tools/  
25.0.0/ 25.0.2/

還可以指定各種options,例如強製所有連接使用HTTP(--no_https),或者使用代理服務器(--proxy_host=address--proxy_port=port)。

要檢查可用選項,請使用--help標誌。在我的機器(Mac)上,輸出如下:

alex@mbpro:~/sdk/tools/bin$ ./sdkmanager --help
Usage: 
  sdkmanager [--uninstall] [<common args>] \
    [--package_file <package-file>] [<packages>...]
  sdkmanager --update [<common args>]
  sdkmanager --list [<common args>]

In its first form, installs, or uninstalls, or updates packages.
    <package> is a sdk-style path (e.g. "build-tools;23.0.0" or 
             "platforms;android-23").
    <package-file> is a text file where each line is a sdk-style path
                   of a package to install or uninstall.
    Multiple --package_file arguments may be specified in combination
     with explicit paths.
In its second form (with --update), currently installed packages are
    updated to the latest version.
In its third form, all installed and available packages are printed out.

Common Arguments:
    --sdk_root=<sdkRootPath>: Use the specified SDK root instead of the SDK containing this tool
    --channel=<channelId>: Include packages in channels up to <channelId>.
                           Common channels are:
                           0 (Stable), 1 (Beta), 2 (Dev), and 3 (Canary).

    --include_obsolete: With --list, show obsolete packages in the
                        package listing. With --update, update obsolete
                        packages as well as non-obsolete.
    --no_https: Force all connections to use http rather than https.
    --proxy=<http | socks>: Connect via a proxy of the given type.
    --proxy_host=<IP or DNS address>: IP or DNS address of the proxy to use.
    --proxy_port=<port #>: Proxy port to connect to.

* If the env var REPO_OS_OVERRIDE is set to "windows",
  "macosx", or "linux", packages will be downloaded for that OS.

第五種方法

嘗試從命令行安裝所有Android SDK相關的東西時,一個很大的信息來源是this Dockerfile。在Docker文件中可以看到,作者執行單個命令來安裝platform toolsbuild tools,而無需任何其他交互。在OP提出的情況下,該命令將適用於:

echo y | $ANDROID_HOME/tools/android update sdk --all --filter build-tools-21.1.0 --no-ui

第六種方法

大多數答案似乎都忽略了這樣一個事實:可能需要在沒有超級用戶權限的無頭環境中運行更新,這意味著腳本必須自動回答所有y/n許可證提示。

這是一個例子。

FILTER=tool,platform,android-20,build-tools-20.0.0,android-19,android-19.0.1

( sleep 5 && while [ 1 ]; do sleep 1; echo y; done ) \
    | android update sdk --no-ui --all \
    --filter ${FILTER}

無論您收到多少提示,所有這些都將被自動回答。該while/sleep循環看起來像yes命令的仿真。 yes的問題在於大量的'y'輸出到stdout,並且在輸出這些字符之間幾乎沒有任何延遲,所以不得不處理沒有任何超時選項的版本。解決方案是在輸出'y'加入延遲,這正是while/sleep組合所做的工作。

expect在某些linux發行版中默認不可用,因為沒法將其作為CI腳本的一部分進行安裝,所以不得不使用最通用的解決方案,沒有什麽比簡單的bash腳本更通用。

事實上,這裏有一篇博客(NSBogan),可以參閱更多細節。

本文摘錄翻譯自:

本文由《純淨天空》出品。文章地址: https://vimsky.com/zh-tw/article/3611.html,未經允許,請勿轉載。