如何在命令行上安装Android SDK Build Tools?

330

我想通过命令行设置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文件夹中什么也没有,而我需要的是aapt和apkbuilder,因为我想通过命令行构建APK而不使用ant。

20个回答

485

默认情况下,命令行的SDK管理器列表中不包含构建工具。它们在“已过时”类别中。要查看所有可用的下载内容,请使用

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是上面列出的包的编号。


4
如果你缺少诸如18.1.1之类的构建工具,则可以使用命令行安装它,这是正确的方法。 - Cray
21
有点糟糕,官方提示中没提到--all选项。谢谢。 - Alexander Malakhov
4
是的,就是这样。只需在命令中输出“yes”,即: echo yes | android update sdk --all --filter tools --no-ui --force > /dev/null - nsg
4
“echo "yes"” 可以简写为 “echo "y"”,但并非所有情况下都适用。在某些情况下,取决于过滤器和特定软件包,您可能会得到多个 y/n 许可提示。 “echo "y"” 仅会回答第一个提示,而不会回答其余提示。我一直尝试使用 “yes” 命令使其工作,但迄今为止没有成功。 - i4niac
3
@AlexanderMalakhov 我同意,如果您的主机操作系统有此工具,则使用它是最佳选择。我首先看了expect,但在我的情况下,我必须在运行在AWS云中的某个Linux发行版上运行脚本。该发行版没有安装expect,并且我没有足够的权限将其安装为构建计划的一部分。在寻找周围的解决方案后,我发现最好的解决方案是:<pre><code>
# 在无头服务器上更新 Android SDK FILTER=工具、平台、android-20 (睡眠5秒,然后在[1]不断循环;做睡眠1秒;echo y;完成)
| Android更新sdk --no-ui --all
--filter ${FILTER} </code></pre>
- i4niac
显示剩余9条评论

141

正如其他答案所提到的,您可以使用 --filter 选项来限制安装的软件包:

android update sdk --filter ...

其他答案没有提到的是,您可以使用常量字符串标识符而不是索引(会改变)作为过滤选项。这对于无人值守或脚本安装很有帮助。对于 --filter 选项,请参阅 man 手册:

...... 这还接受由 '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

接着你可以使用字符串 id 作为过滤器选项,以精确指定你想要的版本:

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


27
感谢您的信任。对于 --extended 选项的加一,明确说明CI脚本所需安装的内容。 - nhaarman
16
如果没有使用 --all 选项,执行 android update 命令时会显示使用帮助。例如:android update sdk --no-ui --all --filter build-tools-21.1.0(还可以使用 --extended 选项以查看别名,如 build-tools-21.1.0)。 - Petrus Repo
2
--filter--extended 选项的指定人在哪里? - Ciro Santilli OurBigBook.com
2
我同意使用字符串比数字更好,因为数字是不固定的。 - wisbucky
1
我正在寻找--extended选项,以便编写脚本并在我的持续集成服务器中使用它,从而可以自动刷新sdk资源。好的提示! - osayilgan
过时的回复,请查看其他回复。 - João Pimentel Ferreira

97

Android SDK Tools包的版本25.2.3(及更高版本)中,包含一个新工具-sdkmanager,它简化了从命令行安装构建工具的任务。
它位于android_sdk/tools/bin文件夹中。

用法(来自文档):

列出已安装和可用的软件包:

sdkmanager --list [options] \
      [--channel=channel_id] // Channels: 0 (stable), 1 (beta), 2 (dev), or 3 (canary)

使用channel选项来包括从channel到channel_id之间的渠道中的包。例如,指定金丝雀渠道以列出所有渠道的软件包。

安装软件包:

sdkmanager packages [options]

packages参数是一个SDK-style路径,需要用引号括起来(例如,"build-tools;25.0.0""platforms;android-25")。您可以传递多个包路径,用空格分隔,但每个路径都必须用自己的一对引号括起来。

示例用法(在我的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/

你还可以指定不同的选项,例如强制所有连接使用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.

1
还有其他人收到“警告:未知参数--package_file”吗? - ulidtko
3
使用文档中有一个错误,正确的方法是添加等号,例如 --package_file=packages.txt - Alex Lipov
4
@AaA 它确实简化了命令行安装任务。原帖明确表示他正在寻找一个命令行解决方案,因此你的评论在这个上下文中是无关的。 - Alex Lipov
1
如果您没有安装SDK,获取sdkmanager二进制文件的最简单方法是下载Android命令行工具(sdkmanager是其中一个包含的工具)。URL是平台和版本特定的,即获取Linux的最新版本(截至今天)将是wget -q https://dl.google.com/android/repository/commandlinetools-linux-8092744_latest.zip -O cmdtools.zip。这将下载一个zip归档文件,稍后可以使用unzip -q cmdtools.zip -d /tmp/解压缩,然后使用/tmp/cmdline-tools/bin/sdkmanager调用sdkmanger - Alex Lipov
3
请注意,sdkmanager 是一个Java二进制文件,因此您需要预先安装Java。 - Alex Lipov
显示剩余4条评论

56

ADB Build-Tools不会通过命令android update sdk --no-ui自动下载。

因此,要安装Build-Tool,请在控制台中输入以下命令:

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

对于旧版SDK,您必须使用--all参数。例如,android update sdk --no-ui --all --filter 27以安装平台-8。 - fluke
由于 SDK 安装程序在使用 GUI 时经常崩溃,我不得不切换到命令行,这确实有所帮助。感谢。 - Yvonne Aburrow

33

我在试图从命令行安装与Android SDK相关的所有内容时,发现了一个非常好的信息来源:这个 Dockerfile。在Dockerfile中,您可以看到作者执行单个命令来安装平台工具构建工具,而无需任何其他交互。在OP提出的情况下,该命令将被调整为:

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

如果我不想要所有的包呢?只想要21.1.0 - IgorGanapolsky
@IgorGanapolsky 也许你应该尝试不带 --all 标志。 - geoand

29

如果您已安装sdkmanager(我使用的是MAC),则运行sdkmanager --list以列出可用包。

如果要安装构建工具,请从可用软件包列表中复制首选版本。

要安装首选版本,请运行

sdkmanager "build-tools;27.0.3"

1
谢谢。它有效!"android"命令已经在最新版本的Android-sdk中被弃用,我们必须使用/tools/bin目录下的./sdkmanager。 - JLavoie
你可以在后面添加代理,完整的命令可能是:~/Library/Android/sdk/tools/bin/sdkmanager "build-tools;27.0.3" --proxy=http --proxy_host=127.0.0.1 --proxy_port=1087 - Bird Bird
这个答案帮助我解决了“No usable Android build tools found. Highest 30.x installed version is 29.0.2; minimum version required is 30.0.3.”的问题,方法是使用“sdkmanager "build-tools;30.0.3"”。 - tyler.frankenstein

23

"android" 命令已弃用。

对于命令行工具,请使用 tools/bin/sdkmanagertools/bin/avdmanager

如果您不需要使用 Android Studio,可以从 developer.android.com 的“仅限命令行工具”部分下载基本的 Android 命令行工具。

在命令行界面中,应该是类似这样的:

curl --output sdk-tools-linux.zip https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip
或者
wget --output-document sdk-tools-linux.zip https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip

之后只需将存档解压到目标文件夹中即可。

unzip sdk-tools-linux.zip

现在,我们可以安装您所需的一切...

./tools/bin/sdkmanager --install 'build-tools;29.0.2' 'platform-tools' 'platforms;android-29' 'tools'

您可以使用命令./tools/bin/sdkmanager --list获取完整的软件包列表。

一些软件包需要接受许可协议。您可以交互式地接受它,也可以向输入流传递“y”,就像这样(两个协议的情况):

echo -ne "y\ny" | ./tools/bin/sdkmanager --install 'system-images;android-29;default;x86_64'

当然,为了方便起见,您可以导出变量,例如ANDROID_HOMEANDROID_SDK_ROOT(包括在~/.profile或~/.bash_profile中)或修补PATH变量-所有这些由您决定。

脚本示例:

mkdir /opt/android-sdk
cd /opt/android-sdk
curl --output sdk-tools-linux.zip https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip
unzip sdk-tools-linux.zip
echo -ne "y" | ./tools/bin/sdkmanager --install 'build-tools;29.0.2' 'platform-tools' 'platforms;android-29' 'tools'

要求: curl(或wget)和unzip

故障排除:

如果您看到Warning: Could not create settings,则需要在ANDROID_HOME中的cmdline-tools目录内部有tools目录(如需要,请确保使用此确切名称创建它)。请参见Android Command line tools sdkmanager always shows: Warning: Could not create settings


21

我刚通过命令行安装Android SDK依赖关系花费了很长时间,并且由于工具自带的文档和在线文档都不足,所以我想在这里分享我发现的内容。

我正在使用android sdk r24.4.1 适用于linux。有两个命令可以运行以列出可用的包:

android list sdk

更详尽的是:

android list sdk --all

特定软件包的软件包编号因上述每个命令而异!例如,前者将API 23.1 revision 3列为包#3,后者则将其列为#29

现在,有两种不同的方法可以使用 android 命令进行安装。

tools/android update sdk --no-ui --filter <package number>

tools/android update sdk -u -a -t <package number>

考虑到每个安装命令都可以接受包号作为参数,您应该使用哪个软件包编号?经过许多在线搜索和试错,我发现

android update sdk --no-ui --filter 使用来自 android list sdk的软件包编号。

android update sdk -u -a -t 使用来自android list sdk --all的软件包编号。

换句话说,要安装API 23.1 revision 3,您可以执行以下操作之一:

android update sdk --no-ui --filter 3

或者

android update sdk -u -a -t 29

很疯狂,但却奏效。


1
“-a” 是 “--all” 的简写,这就是为什么它使用该包号的原因。(“-u” 是 “--no-ui”的简写,“-t” 是 “--filter”的简写。) - darthmaim
$ANDROID_HOME/tools/android list target | grep "Based on Android" 基于Android 4.0.3 (API级别15) 基于Android 4.1.2 (API级别16) 基于Android 4.2.2 (API级别17) 基于Android 4.3.1 (API级别18) 基于Android 4.4.2 (API级别19) 基于Android 4.4.2 (API级别19) 基于Android 5.0.1 (API级别21) 基于Android 5.1.1 (API级别22) 基于Android 6.0 (API级别23) 基于Android 7.0 (API级别24) - Ashish Karpe
我甚至运行了 $ANDROID_HOME/tools/android update sdk --no-ui 正在安装存档: 准备安装存档 正在下载 SDK 平台 Android 8.1.0,API 27,修订版 1 下载完成,但大小不正确。期望值为 65606517 字节,实际值为 65738431 字节。 完成。未安装任何内容。 - Ashish Karpe
描述:Android + Google APIs 基于Android 4.0.3(API级别15) 描述:Android + Google APIs 基于Android 4.1.2(API级别16) 描述:Android + Google APIs 基于Android 4.2.2(API级别17) 描述:Android + Google APIs 基于Android 4.3.1(API级别18) 基于Android 4.4.2(API级别19) 描述:Android + Google APIs 基于Android 4.4.2(API级别19) 描述:Android + Google APIs 基于Android 5.0.1(API级别21) - Ashish Karpe
描述:Android + Google APIs 基于 Android 5.1.1(API 级别 22) 描述:Android + Google APIs 基于 Android 6.0(API 级别 23) 描述:Android + Google APIs 基于 Android 7.0(API 级别 24) - Ashish Karpe
显示剩余6条评论

20

大多数答案似乎忽略了您可能需要在没有超级用户权限的无头环境中运行更新,这意味着脚本必须自动回答所有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 命令会向 stdout 输出大量的 'y' 字符,并且发送字符之间几乎没有延迟时间,而我所处理的版本没有任何超时选项。它会 "污染" stdout,并且脚本将因为输入不正确而失败。解决方案是在向 stdout 发送 'y' 之间设置延迟,而这正是 while/sleep 组合所做的。
默认情况下,expect 在某些 Linux 发行版中不可用,而我无法在 CI 脚本中安装它,所以必须使用最通用的解决方案,而没有什么比简单的 bash 脚本更通用了,对吧?
事实上,我在博客中写道(NSBogan),如果您感兴趣,请查看此处获取更多详细信息。

--all 将安装所有可能的 SDK。如果您想限制到特定过滤器,则不是理想选择。 - IgorGanapolsky

8

然而,它的运行速度太慢了。

是的,我也遇到过同样的问题。在最近几天中,一些文件下载速度非常缓慢。如果你想要下载所有内容,那么你没有太多可以做的。

结果是build-tools文件夹里什么都没有,而我需要的是aapt和apkbuilder,因为我想在命令行下构建apk而不使用ant。

你让它运行到完成了吗?

你可以使用-t开关来筛选正在下载的软件包。

例如:

tools/android update sdk --no-ui -t platform-tool

前几天我尝试使用此方法时安装的构建工具版本为18.0.0。但是,最新版本的18.0.1不包含在此筛选器中,唯一的方法是使用--all开关安装所有内容以获取它。


2
运行以下命令以获取可用的过滤器:"android update sdk -h" ... 一个过滤器,它将更新限制为以逗号分隔的形式指定类型的软件包[平台、系统映像、工具、平台工具、文档、示例、源代码]。这也接受由“list sdk --extended”返回的标识符。 - aleb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接