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


当前回答

大多数答案似乎忽略了这样一个事实,即您可能需要在没有超级用户权限的无头环境中运行更新,这意味着脚本必须自动回答所有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}

No matter how many prompts you get, all of those will be answered. This while/sleep loop looks like simulation of the yes command, and in fact it is, well almost. The problem with yes is that it floods stdout with 'y' and there is virtually no delay between sending those characters and the version I had to deal with had no timeout option of any kind. It will "pollute" stdout and the script will fail complaining about incorrect input. The solution is to put a delay between sending 'y' to stdout, and that's exactly what while/sleep combo does.

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

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

其他回答

正如在其他回答中提到的,你可以使用——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等

当我试图从命令行安装所有Android SDK相关的东西时,我遇到了一个很棒的信息来源,就是这个Dockerfile。在Dockerfile中,您可以看到作者执行了一个命令来安装平台工具和构建工具,而没有任何其他交互。在行动计划提出的情况下,该命令将被调整为:

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

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

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

When inside the bin folder, hold down the shift key, right click, then select open command line here. Shift+right click >> open command line here. When the command line opens, type sdkmanager click enter. Then run type sdkmanager (space), double hyphen (--), type list sdkmanager --list (this lists all the packages in the SDK manager) Type sdkmanager (space) then package name, press enter. Eg. sdkmanager platform-tools (press enter) It will load licence agreement. With options (y/n). Enter y to accept and it will download the package you specified.

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

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

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

用法(来自文档):

List installed and available packages: sdkmanager --list [options] \ [--channel=channel_id] // Channels: 0 (stable), 1 (beta), 2 (dev), or 3 (canary) Use the channel option to include a package from a channel up to and including channel_id. For example, specify the canary channel to list packages from all channels. Install packages: 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/

您还可以指定各种选项,例如强制所有连接使用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.