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

问题描述 投票:282回答:18

我想从命令行设置Android dev环境,遇到以下问题:

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

结果是文件夹构建工具中没有任何内容,我想要的是aapt和apkbuilder,因为我想在没有ant的情况下从命令行构建apk。

android sdk android-build aapt build-tools
18个回答
473
投票

默认情况下,命令行中的SDK Manager不包含列表中的构建工具。他们处于“过时”类别。要查看所有可用下载,请使用

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


5
投票

我更喜欢放一个安装我的依赖项的脚本

就像是:

#!/usr/bin/env bash
#
# Install JUST the required dependencies for the project.
# May be used for ci or other team members.
#

for I in android-25 \
         build-tools-25.0.2  \
         tool \
         extra-android-m2repository \
         extra-android-support \
         extra-google-google_play_services \
         extra-google-m2repository;

 do echo y | android update sdk --no-ui --all --filter $I ; done

https://github.com/caipivara/android-scripts/blob/master/install-android-dependencies.sh


4
投票

我刚刚遇到这个问题,所以我最后通过阅读和解析可用工具列表来编写了一行bash脏解决方案:

 tools/android update sdk -u -t $(android list sdk | grep 'Android SDK Build-tools' | sed 's/ *\([0-9]\+\)\-.*/\1/')

4
投票

灵感来自@ i4niac和@AurélienLambert的答案,这就是我想出的

csv_update_numbers=$(./android list sdk --all | grep 'Android SDK Build-tools' | grep -v 'Obsolete' | sed 's/\(.*\)\- A.*/\1/'|sed '/^$/d'|sed -e 's/^[ \t]*//'| tr '\n' ',')
csv_update_numbers_without_trailing_comma=${csv_update_numbers%?}

( sleep 5 && while [ 1 ]; do sleep 1; echo y; done ) \
    | ./android update sdk --all -u -t $csv_update_numbers_without_trailing_comma

说明

  • 获取逗号分隔的数字列表,这些数字是android list sdk --all命令(忽略过时的包)结果中构建工具包的索引。
  • 每隔几毫秒继续在终端投掷'y'以接受许可证。

4
投票

从developer.android.com下载android SDK(它目前是Windows操作系统的149mb文件)。值得注意的是android已经删除了sdkmanager GUI,但在bin文件夹中有一个命令行版本的sdkmanager,它位于tools文件夹中。

  1. 在bin文件夹内时,按住shift键,右键单击,然后在此处选择打开命令行。 Shift +右键单击>>打开命令行。
  2. 命令行打开后,键入sdkmanager,单击“输入”。
  3. 然后运行类型sdkmanager(空格),双连字符(--),类型列表sdkmanager --list(这列出了SDK管理器中的所有包)
  4. 输入sdkmanager(space)然后输入包名称,按回车键。例如。 sdkmanager platform-tools(按回车)它将加载许可协议。带选项(y / n)。输入y接受,它将下载您指定的包。

有关更多参考,请参阅官方文档here

我希望这有帮助。 :)


2
投票

Nate在https://stackoverflow.com/a/19416222/1104031帖子中说,默认情况下无法自动下载构建工具。

但我写了一个小工具,为你做一切

我在https://stackoverflow.com/a/17863931/1104031帖子中使用了“expect”工具作为danb。你只需要android-sdk和python27expect

此脚本将安装所有构建工具,所有sdks以及自动构建所需的一切:

import subprocess,re,sys

w = subprocess.check_output(["android", "list", "sdk", "--all"])
lines = w.split("\n")
tools = filter(lambda x: "Build-tools" in x, lines)
filters = []
for tool in tools:
  m = re.search("^\s+([0-9]+)-", tool)
  tool_no = m.group(1)
  filters.append(tool_no)

if len(filters) == 0:
  raise Exception("Not found build tools")


filters.extend(['extra', 'platform', 'platform-tool', 'tool'])

filter = ",".join(filters)

expect= '''set timeout -1;
spawn android update sdk --no-ui --all --filter %s;
expect {
  "Do you accept the license" { exp_send "y\\r" ; exp_continue }
  eof
}''' % (filter)

print expect

ret = subprocess.call(["expect", "-c", expect])
sys.exit(ret)

1
投票

如其他响应中所述,构建工具需要安装--all标志。您还可以更好地使用-t过滤器标志来避免安装所有包,但无法过滤所有构建工具。

在AOSP错误跟踪器中已经有对这两点的功能请求。随意投票给他们,这可能会让他们有一天发生:


1
投票

我试过这个更新所有,它工作了!

echo y | $ANDROID_HOME/tools/android update sdk --no-ui

0
投票

尝试

1.列出所有包裹

android list sdk --all

2.使用以下命令安装软件包

android update sdk -u -a -t package1, package2, package3 //comma seperated packages obtained using list command 

-1
投票

android update sdk

此命令将更新并安装SDK Tools,Build Tools,SDK平台工具的所有最新版本。

这对我有用。


138
投票

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

android update sdk --filter ...

其他答案没有提到您可以使用常量字符串标识符而不是过滤器选项的索引(将更改)。这对无人参与或脚本安装很有帮助。男子为--filter选项:

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


65
投票

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

用法(来自documentation):

sdkmanager packages [options]

packages参数是一个SDK风格的路径,用引号括起来(例如,"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/

您还可以指定各种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.

54
投票

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

32
投票

我尝试从命令行安装所有Android SDK时遇到的一个很好的信息来源是this Dockerfile。在Dockerfile中,您可以看到作者执行单个命令来安装platform toolsbuild tools而无需任何其他交互。在OP提出的情况下,该命令将适用于:

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

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

疯了,但它的确有效。


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的问题在于它使用'y'泛滥stdout,并且在发送这些字符之间几乎没有延迟,我必须处理的版本没有任何类型的超时选项。它将“污染”stdout并且脚本将失败抱怨输入错误。解决方案是在将'y'发送到stdout之间延迟,这正是while/sleep组合所做的。

expect默认在某些Linux发行版上不可用,我无法将其作为我的CI脚本的一部分安装,因此不得不使用最通用的解决方案,没有什么比简单的bash脚本更通用,对吧?

事实上,我在博客上写了这篇文章(NSBogan),如果你有兴趣,可以在这里查看更多细节。


11
投票

如果你安装了sdkmanager(我正在使用MAC)

运行sdkmanager --list列出可用的包。

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

安装首选版本运行

sdkmanager "build-tools;27.0.3"

8
投票

但是,跑步太慢了

是的,我遇到了同样的问题。一些文件下载非常慢(或者至少它们已经过去几天)。如果你想下载所有内容,你可以做很多事情。

结果是文件夹构建工具中没有任何内容,我想要的是aapt和apkbuilder,因为我想在没有ant的情况下从命令行构建apk。

你让它完成了吗?

您可以做的一件事是使用-t开关过滤正在下载的软件包。

例如:

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

有一天,当我尝试使用此版本时,我安装了18.0.0版本的构建工具。由于某种原因,此过滤器不包含最新版本18.0.1,获得它的唯一方法是使用--all开关安装所有内容。

© www.soinside.com 2019 - 2024. All rights reserved.