我想从命令行设置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。
灵感来自@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'以接受许可证。
我刚刚花了很长时间通过命令行安装android sdk依赖项,由于工具和在线附带的文档严重缺乏,我想我将在这里发布我发现的东西。
我正在使用android sdk r24.4.1 for linux。你可以运行两个命令来列出可用的包:
Android列表SDK
更详尽的是:
Android列表SDK——所有
对于上面的每个命令,特定包的包号不同!例如,前者将包API 23.1修订版3列为包#3,后者将其列为包#29。
现在,使用android命令有两种不同的安装方式。
Tools /android update SDK——no-ui——filter <package number>
and
Tools /android update SDK -u -a -t <包号>
假设每个安装命令都可以将package #作为参数,那么使用哪个包号呢?经过大量的网上搜索和尝试和错误,我发现
Android更新SDK——no-ui——过滤器使用Android列表SDK的包号
and
Android update SDK -u -a -t使用Android list SDK——all中的包号
换句话说,要安装API 23.1修订版3,你可以这样做:
Android更新SDK—no-ui—filter 3
or
Android更新SDK -u -a -t 29
很疯狂,但很有效。
构建工具在默认情况下不能自动下载,就像Nate在https://stackoverflow.com/a/19416222/1104031的帖子中说的那样。
但是我写了一个小工具,为你做一切
我在https://stackoverflow.com/a/17863931/1104031的帖子中使用了“期望”工具作为danb。
你只需要android-sdk和python27。
这个脚本将安装所有的构建工具,所有的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)
正如在其他回答中提到的,你可以使用——filter选项来限制安装的包:
Android SDK更新过滤器…
其他答案没有提到可以使用常量字符串标识符而不是用于筛选器选项的索引(索引将会更改)。这对于无人值守或脚本安装很有帮助。过滤选项:
... 这也接受'list sdk——extended'返回的标识符。
Android列表SDK——全部——扩展:
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更新SDK——过滤工具,平台工具,build-tools-19.0.3等