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


292

我想从命令行设置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

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

Answers:


479

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

android list sdk --all

然后从命令行获取该列表中的软件包之一,请使用:

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

其中-u代表--no-ui,-a代表--all和-t代表--filter。

如果您需要安装多个软件包,请执行以下操作:

Android更新SDK -u -a -t 1,2,3,4,..,n 

其中1,2,..,n是上面的list命令列出的包裹号


4
如果您缺少像18.1.1这样的构建工具,那么这是使用命令行进行安装的正确方法。
Cray

19
有点烂,他们没有--all官方提示中提到选项。谢谢。
亚历山大·马拉霍夫

4
@DanielJonker是的。只需对命令回显“是”,即回显“是” | android update sdk --all --filter tools --no-ui --force> / dev / null
nsg 2014年

4
echo "yes"可以缩短为echo "y",但这在所有情况下都无法正常工作。在某些情况下,根据过滤器和特定的软件包,您可能会获得多个y / n许可证提示。echo "y"将仅响应第一个提示,而不响应其余提示。我正在尝试使其与yes命令一起使用,到目前为止没有成功。
i4niac

3
@AlexanderMalakhov我同意,如果您的主机操作系统具有实用程序,那么使用它是最佳选择。我首先看了Expect,但就我而言,我必须在AWS云中运行的特定Linux发行版上运行脚本。该发行版没有预期的安装,并且我没有足够的权利来安装它作为构建计划的一部分。环顾四周后,我发现的最佳解决方案是<pre> <code>#在无头服务器上更新Android SDK FILTER = tool,platform,android-20(sleep 5 && while [1]; sleep 1; echo y; done )\ | 机器人更新SDK --no-UI --all \ --filter $ {FILTER} </代码> </ PRE>
i4niac

140

如其他答案所述,您可以使用该--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 等等


27
+1(表示该--extended选项),明确说明要为CI脚本安装的内容。
nhaarman

16
android update还将需要该--all选项,否则将显示使用帮助。例如:(android update sdk --no-ui --all --filter build-tools-21.1.0和+1 --extended允许您看到类似的别名build-tools-21.1.0
Petrus Repo

1
--filter--extended选项的人在哪里?
Ciro Santilli郝海东冠状病六四事件法轮功

2
我同意使用字符串而不是数字(固定的数字)要好得多。
wisbucky

1
我一直在寻找该--extended选项,因此我可以编写脚本并将其用于我的Continuous Integration Server中,在该脚本中可以刷新sdk资源本身。不错的提示!
osayilgan

73

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

用法(来自 文档):

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/

您还可以指定各种选项,例如,强制所有连接使用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
有人得到Warning: Unknown argument --package_file吗?
ulidtko

3
@ulidtko使用说明文档中有一个错误。正确的方法是附加等号,例如--package_file=packages.txt
Alex Lipov

不幸的是,它不能简化安装任务。并非所有的Android程序员都在没有GUI的Linux上进行编程。我们中的一些人在Windows上执行此操作,并且喜欢运行其他Windows应用程序的UI。这是后退而不是前进
AaA

2
@AaA确实简化了从命令行安装的任务。OP明确表示,他正在寻找命令行解决方案,因此,在这种情况下,您的评论与您无关。
Alex Lipov

55

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

因此,用于安装Buil-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安装platform-8
fluke

由于当我使用GUI时SDK安装程序一直崩溃,因此我不得不切换到命令行,因此确实很有帮助。谢谢。
伊冯娜·阿布罗

32

我在尝试安装与命令行相关的所有Android SDK时遇到的重要信息就是 Dockerfile。在Dockerfile内部,您可以看到作者执行了一个安装命令,platform tools并且build tools没有任何其他交互。在OP提出的情况下,该命令将适用于:

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

如果我不想要所有包裹怎么办?只想21.1.0
IgorGanapolsky '16

@IgorGanapolsky也许您应该尝试在没有--all标志的情况下
geoand

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

我相信Ips所说的。众所周知,Google不会使usage()文本保持最新。
not2qubit

在ubuntu上,我跑了:$ echo y | $ ANDROID_HOME / tools / android更新sdk -u -a -t 27现在如何确认我已更新为Android 8?
Ashish Karpe

$ ANDROID_HOME / tools / android列表目标| grep“基于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 list sdk可用于安装或更新的软件包:1 1- SDK Platform Android 8.1.0,API 27,修订版1
Ashish Karpe

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'发送这些字符与我必须处理的没有任何超时选项的版本之间几乎没有延迟。它将“污染”标准输出,并且脚本将抱怨错误的输入而失败。解决方案是在发送'y'到stdout 之间设置延迟,而这正是while/sleepcombo所做的。

expect 在某些Linux发行版中默认情况下不可用,并且我无法将其作为CI脚本的一部分进行安装,因此必须使用最通用的解决方案,没有什么比简单的bash脚本更通用的了,对吗?

事实上,我在博客上写道NSBogan),如果您有兴趣的话,可以在这里查看更多详细信息。


--all将安装所有可能的sdk。如果要限制为特定的过滤器,则不理想。
IgorGanapolsky '16

17

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

sdkmanager --list以列出可用的软件包。

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

要安装首选版本,请运行

sdkmanager "build-tools;27.0.3"

1
谢谢。有用!现在不推荐使用最新版本的Android-sdk来使用“ android”命令,我们必须使用/ tools / bin目录中的
./sdkmanager

8

但是,运行速度太慢

是的,我遇到了同样的问题。一些文件下载速度非常慢(或者至少是最近几天)。如果要下载所有内容,则无能为力。

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

您让它完成了吗?

您可以做的一件事是过滤使用-t交换机下载的软件包。

例如:

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

前几天尝试此操作时,我安装了构建工具的18.0.0版本。出于某种原因,此过滤器未包含最新版本18.0.1,唯一的获取方法是使用--all开关安装所有组件。


2
运行此命令以获取可用的过滤器:“ android update sdk -h” ...一个过滤器,以逗号分隔的[平台,系统映像,工具,平台]列表的形式将更新限制为指定类型的软件包-tool,doc,sample,source]。这也接受“ list sdk --extended”返回的标识符。
aleb

6

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

就像是:

#!/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


谢谢,帮助您节省了很多时间。
utzcoz

4

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

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

我将项目切换为播放服务,它要求获得的许可不仅仅是构建工具,因此该解决方案非常有限。
nurettin '16

感觉比确定性要强得多,因为随着版本的发展,索引可能会随着时间而变化...
Augustin Riedinger 17-4-10的

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,但在tools文件夹内的bin文件夹中有sdkmanager的命令行版本。

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

有关更多参考,请在此处关注官方文件

我希望这有帮助。:)


4

不建议使用“ android”命令。

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

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

从CLI应该像这样

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)并解压缩

故障排除:

如果看到Warning: Could not create settings,则需要tools将该cmdline-tools目录包含在ANDROID_HOME 内的目录中(如果需要,请使用此确切名称创建该目录),请参阅Android命令行工具sdkmanager始终显示:警告:无法创建设置


2

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

但是我写了一个小工具,可以为您提供一切

我在https://stackoverflow.com/a/17863931/1104031帖子中使用了“期望”工具作为danb 。你只需要Android的SDK和python27expect

该脚本将安装所有构建工具,所有SDK和自动构建所需的一切:

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)

怎么echo "yes" | ./android update sdk --no-https --no-ui --filter 1,6
schemacs 2014年

1
如果我错了,请纠正我,但似乎此脚本每次运行时都会重新下载所有内容。我尝试使用-u参数,但它似乎不起作用:/
gbero 2014年


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更新SDK

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

对我来说是工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.