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

Posted

技术标签:

【中文标题】如何在命令行上安装 Android SDK Build Tools?【英文标题】:How to install Android SDK Build Tools on the command line? 【发布时间】:2013-07-31 13:44:59 【问题描述】:

我想通过命令行设置安卓开发环境,遇到如下问题:

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,因为我想在没有 ant 的情况下从命令行构建 apk。

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

如果您缺少像 18.1.1 这样的构建工具,那么这是使用命令行安装它的正确方法。 这有点糟糕,他们没有在official tips 中提到--all 选项。谢谢。 @DanielJonker 是的。只需在命令中回显“yes”,即 echo yes | android update sdk --all --filter tools --no-ui --force > /dev/null echo "yes" 可以缩短为echo "y",但这并不适用于所有情况。在某些情况下,您可能会收到多个 y/n 许可证提示,具体取决于过滤器和特定软件包。 echo "y" 将仅响应第一个提示,而不响应其余提示。我正在尝试使其与yes 命令一起使用,但到目前为止没有成功。 @AlexanderMalakhov 我同意,如果您的主机操作系统具有该实用程序,那么使用它是最佳选择。我首先查看了 expect,但就我而言,我必须在 AWS 云中运行的某个 Linux 分布式系统上运行脚本。该发行版没有安装预期,我没有足够的权利将其安装为构建计划的一部分。环顾四周,我发现最好的解决方案是
 # update Android SDK on headless server FILTER=tool,platform,android-20 ( sleep 5 &amp;&amp; while [ 1 ]; do sleep 1; echo y; done ) \ | android update sdk --no-ui --all \ --filter $FILTER 
【参考方案2】:

正如其他答案中提到的,您可以使用--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

然后您可以使用字符串 ids 作为过滤器选项来精确指定您想要的版本:

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

【讨论】:

--extended 选项 +1,明确为 CI 脚本安装的内容。 android update 也需要--all 选项,否则会显示使用帮助。例如:android update sdk --no-ui --all --filter build-tools-21.1.0(对于 --extended 选项 +1,您可以看到像 build-tools-21.1.0 这样的别名) --filter--extended 选项的人在哪里? 我同意使用字符串而不是数字要好得多,这不是固定的。 我一直在寻找 --extended 选项,以便我可以编写一个脚本并在我的持续集成服务器中使用它,它可以刷新 sdk 资源本身。不错的提示!【参考方案3】:

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

用法(来自documentation):

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

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

使用频道选项可包含频道中的包,直至并包括频道 ID。例如,指定 canary 频道以列出来自所有频道的包。

安装包:

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.

【讨论】:

还有其他人得到Warning: Unknown argument --package_file 吗? @ulidtko 使用文档中有一个错误。正确的方法是附加等号,例如--package_file=packages.txt. 不幸的是,它并没有简化安装任务。并非所有 Android 程序员都在没有 GUI 的情况下在 linux 上进行编程。我们中的一些人在 Windows 上执行此操作,并且更喜欢像所有其他 Windows 应用程序一样运行的 UI。这是向后移动而不是向前移动 @AaA 它确实简化了从命令行安装的任务。 OP 明确表示他正在寻找 命令行 解决方案,因此您的评论在这种情况下无关紧要。 它很旧,但资深的 android 开发人员不使用 GUI。所以这篇文章说对了一半。但是它并没有解决实际在机器上获取 sdkmanager 的问题【参考方案4】:

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

所以对于安装 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 因为 SDK 安装程序在我使用 GUI 时不断崩溃,我不得不切换到命令行,所以这真的很有帮助。谢谢。【参考方案5】:

我在尝试从命令行安装所有与 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.1.0 @IgorGanapolsky 也许你应该尝试不带--all 标志【参考方案6】:

如果您安装了sdkmanager(我使用的是 MAC)

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

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

安装首选版本运行

sdkmanager "build-tools;27.0.3"

【讨论】:

谢谢。有用!最新版本的 Android-sdk 现在不推荐使用命令“android”,我们必须使用 /tools/bin 目录中的 ./sdkmanager 你可以在它之后添加代理,完整的命令可以是:~/Library/Android/sdk/tools/bin/sdkmanager "build-tools;27.0.3" --proxy=http --proxy_host=127.0.0.1 --proxy_port=1087【参考方案7】:

我刚刚通过命令行安装了 android sdk 依赖项,并且由于工具和在线附带的文档严重缺乏,我想我会在这里发布我发现的内容。

我正在为linuxandroid sdk r24.4.1 合作。您可以运行两个命令来列出可用的包:

android list sdk

还有更详尽的:

android list sdk --all

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

现在,使用 android 命令有两种不同的安装方式。

tools/android update sdk --no-ui --filter &lt;package number&gt;

tools/android update sdk -u -a -t &lt;package number&gt;

鉴于每个安装命令都可以将包#作为参数,您使用哪个包号?经过大量的在线搜索和反复试验,我发现

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

很疯狂,但它确实有效。

【讨论】:

-a--all 的缩写,这就是它使用该包号的原因。 (-u--no-ui 的缩写,-t--filter 的缩写。) 我相信 Ips 所说的。众所周知,Google 不会及时更新他们的 usage() 文本。 我在 ubuntu 上运行:$ echo y | $ANDROID_HOME/tools/android update sdk -u -a -t 27 现在如何确认我已更新到 Android 8? $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) 我运行时的原因:$ANDROID_HOME/tools/android list sdk 可用于安装或更新的软件包:1 1- SDK Platform Android 8.1.0, API 27, revision 1【参考方案8】:

大多数答案似乎忽略了这样一个事实,即您可能需要在没有超级用户权限的无头环境中运行更新,这意味着脚本必须自动回答所有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' 淹没标准输出,并且在发送这些字符之间几乎没有延迟,而我必须处理的版本没有任何类型的超时选项。它会“污染”标准输出,并且脚本将无法抱怨输入错误。解决方案是在将'y' 发送到标准输出之间延迟,这正是while/sleep 组合所做的。

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

事实上,我在博客上写过 (NSBogan),如果您有兴趣,请在此处查看更多详细信息。

【讨论】:

--all 将安装所有可能的 sdk。如果您想限制为特定过滤器,则不理想。【参考方案9】:

“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,则需要在 ANDROID_HOME 内的 cmdline-tools 目录中包含 tools 目录(如果需要,使用此确切名称创建它)参见 Android Command line tools sdkmanager always shows: Warning: Could not create settings

【讨论】:

【参考方案10】:

但是运行起来太慢了

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

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

你让它运行完成了吗?

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

例如:

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

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

【讨论】:

运行这个来获取可用的过滤器:"android update sdk -h" ... 一个过滤器,以逗号分隔的 [platform , system-image, tool, platform-tool, doc, sample, source]。这也接受 'list sdk --extended' 返回的标识符。【参考方案11】:

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

类似:

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

【讨论】:

谢谢,帮我节省了很多时间。【参考方案12】:

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

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

【讨论】:

我将项目切换到播放服务,它要求的许可证不仅仅是构建工具,所以这个解决方案非常有限。 感觉比索引更具确定性,索引可能会随着版本的发展而变化...【参考方案13】:

受@i4niac 和@Aurélien Lambert 的回答启发,这就是我的想法

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' 以接受许可证。

【讨论】:

【参考方案14】:

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

    在 bin 文件夹中,按住 shift 键,右键单击,然后选择在此处打开命令行。 Shift+右键单击 >> 在此处打开命令行。 当命令行打开时,输入sdkmanager点击回车。 然后运行输入sdkmanager(空格),双连字符(--),输入列表 sdkmanager --list(这里列出了SDK管理器中的所有包) 输入 sdkmanager(空格)然后输入包名,按回车。 例如。 sdkmanager 平台工具(按回车键) 它将加载许可协议。带选项(是/否)。输入 y 接受,它将下载您指定的包。

更多参考请关注官方文档here

我希望这会有所帮助。 :)

【讨论】:

【参考方案15】:

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

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

我在https://***.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 怎么样? 如果我错了,请纠正我,但似乎这个脚本每次运行时都会重新下载所有内容。我尝试使用 -u 参数,但它似乎不起作用:/【参考方案16】:

如其他回复中所述,构建工具需要安装 --all 标志。您还最好使用-t 过滤标志来避免安装所有包,但无法过滤所有构建工具。

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

https://code.google.com/p/android/issues/detail?id=78765 https://code.google.com/p/android/issues/detail?id=58337

【讨论】:

【参考方案17】:

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

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

【讨论】:

【参考方案18】:

试试

1.列出所有包

android list sdk --all

2.使用以下命令安装包

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

【讨论】:

【参考方案19】:

安卓更新sdk

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

这对我有用。

【讨论】:

【参考方案20】:

在不安装整个android studio的情况下设置android环境:

    下载JDK(8以上版本) 从https://gradle.org/install/下载gradle 从https://developer.android.com/studio 下载命令行工具,向下滚动并仅下载命令行工具 设置必要的环境变量 下载必要的 SDK 工具

【讨论】:

以上是关于如何在命令行上安装 Android SDK Build Tools?的主要内容,如果未能解决你的问题,请参考以下文章

mac如何设置ANDROID_SDK_ROOT?

如何用-cmd--命令行进入android sdk的安装目录

如何在mac本上安装android sdk

如何在mac本上安装android sdk

如何在mac本上安装android sdk

如何用-cmd--命令行进入android sdk的安装目录