如何在命令行上安装Android SDK构建工具?

我想从命令行设置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中什么都没有,我想要的是apapt和apkbuilder,因为我想从命令行构建apk而没有ant。

374388 次浏览

但是,它跑起来太慢了

是的,我也遇到过同样的问题。有些文件下载非常慢(至少在过去几天是这样)。如果你想下载所有的东西,你可以做的不多。

结果是在文件夹build-tools中什么都没有,我想要的是apapt和apkbuilder,因为我想从命令行构建apk而没有ant。

你让它跑完吗?

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

例如:

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

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

默认情况下,命令行中的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 

Where 1,2,..,n is the package number listed with the list command above

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

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

我在https://stackoverflow.com/a/17863931/1104031帖子中使用了“expect”工具作为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)

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

正如在其他回答中提到的,你可以使用--filter选项来限制安装的包:

android update sdk --filter ...

其他答案没有提到可以使用常量字符串标识符而不是用于筛选器选项的索引(索引将会更改)。这对于无人值守或脚本安装很有帮助。Man for --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

我在尝试从命令行安装所有Android SDK相关的东西时遇到的一个很棒的信息来源是 Dockerfile。在Dockerfile中,你可以看到作者执行了一个命令来安装platform toolsbuild tools,没有任何其他交互。在行动计划提出的情况下,该命令将被调整为:

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

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

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

正如在其他响应中所述,构建工具需要安装--all标志。你也最好使用-t过滤器标志来避免安装所有的包,但没有办法过滤所有的构建工具。

在AOSP错误跟踪器中已经有针对这两点的特性请求。请随意投票给他们,这可能会在某一天实现:

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

expect在一些linux发行版上默认是不可用的,我没有办法将它作为我的CI脚本的一部分安装,所以必须使用最通用的解决方案,没有什么比简单的bash脚本更通用的了,对吗?

事实上,我写过关于它的博客(NSBogan),如果你感兴趣,可以在这里查看更多细节。

灵感来自@i4niac &@Aurélien兰伯特,这就是我想出来的

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

Android更新SDK

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

这是我的工作。

我刚刚花了很长时间通过命令行安装android sdk依赖项,由于工具和在线附带的文档严重缺乏,我想我将在这里发布我发现的东西。

我正在为linux使用android 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 <package number>

而且

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

假设每个安装命令都可以将package #作为参数,那么使用哪个包号呢?经过大量的网上搜索和尝试和错误,我发现

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

很疯狂,但很有效。

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

用法(from documentation):

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

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风格的路径,用引号括起来(for 例如,"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.

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

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

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

喜欢的东西:

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

试一试

列出所有的包

android list sdk --all

2.使用以下命令安装包

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

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

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

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

要安装首选版本,请运行

sdkmanager "build-tools;27.0.3"

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

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

如需更多参考,请参阅官方文件在这里

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

不建议使用“android”命令。

对于命令行工具,使用工具/ bin / sdkmanager工具/ 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)或修补路径变量-所有这些都由您自行决定。

脚本的例子:

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'
< p >要求: Curl(或wget)和unzip

故障排除:

如果你看到Warning: Could not create settings,你需要在ANDROID_HOME的cmdline-tools目录中有tools目录(如果需要的话创建它,使用这个确切的名字),见Android命令行工具sdkmanager总是显示:警告:无法创建设置

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

  1. 下载JDK(版本大于8)
  2. https://gradle.org/install/下载gradle
  3. https://developer.android.com/studio下载命令行工具向下滚动,只下载命令行工具
  4. 设置必要的环境变量
  5. 下载必要的SDK工具