Android构建工具安装的问题
我想从命令行建立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
中什么都没有,我需要的是aapt
和apkbuilder
,因为我想从没有ant
的命令行构建apk。
最佳解决方法
默认情况下,命令行中的SDK Manager(SDK管理器)不包括列表中的构建工具。它们属于”obsolete”类别。要查看所有可用的下载,请使用命令
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是上面list
命令列出的包号
次佳解决方法
跟其他答案提到的一样,可以使用--filter
选项来限制已安装的软件包:
android update sdk --filter ...
其他答案没有提到是:可以使用常量字符串标识符,而不是过滤器选项的索引。这对自动或脚本化安装很有帮助。 --filter
选项:
… This also accepts the identifiers returned by ‘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
等
第三种解决方法
ADB Build-Tools不会自动下载,需要通过命令android update sdk --no-ui
首先,在控制台输入命令:
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
第四种方法
Android SDK Tools
包的版本25.2.3(以及更高版本)包含一个新工具-sdkmanager – 它简化了从命令行安装build-tools的任务,位于android_sdk/tools/bin
文件夹中。
用法(来自documentation):
sdkmanager packages [options]
The
packages
argument is an SDK-style path, wrapped in quotes (for example,"build-tools;25.0.0"
or"platforms;android-25"
). You can pass multiple package paths, separated with a space, but they must each be wrapped in their own set of quotes.
用法示例(在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.
第五种方法
尝试从命令行安装所有Android SDK相关的东西时,一个很大的信息来源是this Dockerfile。在Docker文件中可以看到,作者执行单个命令来安装platform tools
和build tools
,而无需任何其他交互。在OP提出的情况下,该命令将适用于:
echo y | $ANDROID_HOME/tools/android update sdk --all --filter build-tools-21.1.0 --no-ui
第六种方法
大多数答案似乎都忽略了这样一个事实:可能需要在没有超级用户权限的无头环境中运行更新,这意味着脚本必须自动回答所有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,并且在输出这些字符之间几乎没有任何延迟,所以不得不处理没有任何超时选项的版本。解决方案是在输出'y'
加入延迟,这正是while/sleep
组合所做的工作。
expect
在某些linux发行版中默认不可用,因为没法将其作为CI脚本的一部分进行安装,所以不得不使用最通用的解决方案,没有什么比简单的bash脚本更通用。
事实上,这里有一篇博客(NSBogan),可以参阅更多细节。