2013-07-31 116 views
261

我想设置的命令行Android的开发环境,并遇到了以下问题:如何在命令行上安装Android SDK构建工具?

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 

结果是没有什么文件夹的构建工具,我想是aapt和apkbuilder,因为我想从命令行构建apk而没有蚂蚁。

回答

8

然而,在运行

太慢是的,我有同样的问题。一些文件下载速度非常慢(或者至少在过去的几天里)。如果你想下载所有的东西,你可以做的事情不多。

结果是没有什么文件夹构建工具,我想要的是aapt和apkbuilder,因为我想从命令行构建apk而不用ant。

你让它跑完了吗?

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

例如:

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

当我今天尝试了一天,我得到了安装了构建工具18.0.0版本。出于某种原因,最新版本18.0.1不包含在此过滤器中,唯一的方法是使用--all开关安装所有软件。

+2

运行此获得可用过滤器:“Android的SDK更新-h” ......这限制了更新到指定类型的 封装形式的过滤器的逗号分隔列表 [platform,system-image,tool,platform-tool,doc,sample, source]。这也接受 'list sdk --extended'返回的标识符。 – aleb

456

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

android list sdk --all 

然后获得在命令行是列表中的包之一,用途:

android update sdk -u -a -t <package no.> 

凡-u代表--no-UI, -a代表--all和-t代表 - 过滤器。

如果需要安装多个软件包做:

android update sdk -u -a -t 1,2,3,4,..,n

凡1,2,...,n为上述

+4

如果您缺少像18.1这样的构建工具。1,那么这是使用命令行安装它的正确方法。 – Cray

+18

它有点糟糕,他们没有在[官方提示](http://tools.android.com/recent/updatingsdkfromcommand-line)中提及'--all'选项。谢谢。 –

+0

因此,它会要求您接受许可证,是否可以在原始命令中接受许可证。 –

2

构建工具与列表命令中列出的包数目不能进行自动下载默认为Nate在https://stackoverflow.com/a/19416222/1104031的帖子中表示。

但我写的小工具,让你的一切

我用“期待”工具,在https://stackoverflow.com/a/17863931/1104031后danb。 您只需要android-sdk和python27,expect

该脚本将安装所有构建工具,所有的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) 
+0

关于'echo“是”|“ ./android update sdk --no-https --no-ui --filter 1,6'? – schemacs

+1

纠正我,如果我错了,但似乎这个脚本每次运行时都会重新下载一切。我尝试使用-u参数,但它似乎不起作用:/ – gbero

54

ADB内置工具不会被自动下载,通过命令的Android SDK更新--no-UI

所以安装BUIL工具类型(控制台):

android list sdk --all 

请记住,在项目上市前的数量和执行以下命令:

android update sdk -u --all --filter <number> 

命令应该在/ YourFolder/Android的SDK Linux的被键入/工具

同样对于远程文件夹(服务器通过SSH例如打开)类型:

**./android** list sdk --all 
**./android** update sdk -u --all --filter <number> 

对于简单的列表亚行包输入端子:

android list sdk 

用于安装所有的软件包:

android update sdk --no-ui 

或者使用过滤器(逗号分隔):

android update sdk --no-ui --filter 3,5,8,14 
+0

对于旧的弃用sdks,您必须使用--all。例如android update sdk --no-ui --all --filter 27来安装platform-8 – fluke

+0

,因为当我使用GUI时,SDK安装程序不断崩溃,我不得不切换到命令行,所以这真的有所帮助。谢谢。 –

+1

''android'命令已弃用。' - - 2017年8月14日 –

135

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

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

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

+27

对于'--extended'选项+1,明确了要为CI脚本安装什么。 – nhaarman

+16

'android update'还需要'--all'选项,否则显示使用帮助。例如:'android update sdk --no-ui --all --filter build-tools-21.1.0'(和'--extended'选项的+1,它允许你看到像'build-tools -21.1.0') –

+1

'--filter'和'--extended'选项的人在哪里? –

31

的信息来源我在尝试从命令行安装与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 
+0

如果我不想**所有**包裹怎么办?只要** 21.1.0 **。 –

+0

@IgorGanapolsky也许你应该尝试没有'--all'标志 – geoand

+1

'“android”命令已被弃用2017年8月14日 –

4

我只是有这个问题,所以我终于通过阅读和解析的aviable工具列表写了1号线的bash肮脏的解决方案:

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

我把我的项目切换到播放服务,它要求的许可证不仅仅是构建工具,所以这个解决方案非常有限。 – nurettin

+0

感觉比索引更具确定性,随着版本的不断发展,索引可能随时间而变化... –

20

大部分的答案似乎忽略了一个事实,你可能需要运行更新中一个没有超级用户权限的无头环境,这意味着脚本必须自动回答所有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),检查出来的更多的细节在这里,如果你有兴趣。

+0

** - all **将安装所有可能的sdk。如果你想限制到一个特定的过滤器,这并不理想。 –

4

通过@从答案的启发i4niac & @的Aurelien兰伯特,这就是我想出了

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

的Android SDK更新

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

这对我有用。

21

我刚刚经历了一段时间,通过命令行安装了android sdk依赖项,并且由于随工具和在线提供的文档非常缺乏,我以为我会发布我在这里发现的内容。

我与android sdk r24.4.1联系为linux。有迹象表明,你可以运行列出可用的软件包两个命令:

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>

考虑到安装命令每个人都可以拿包#作为参数,你用哪个包多少?经过一番网上搜索和反复试验,我发现

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

疯狂,但它的作品。

+1

'-a'是'--all'的简短版本,这就是为什么它使用该包号码。 ('-u'是'--no-ui'的缩写,'-f'是'--filter'的缩写。) – darthmaim

+0

我相信Ips说的。谷歌已经知道不会让他们的'usage()'文字与现实保持一致。 – not2qubit

+0

我在ubuntu上运行:$ echo y | $ ANDROID_HOME/tools/android update sdk -u -a -t 27现在如何确认我已更新到Android 8? –

49

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

使用(从documentation):

sdkmanager packages [options] 

packages参数是一个SDK风格的路径,包在引号内( 例如,"build-tools;25.0.0""platforms;android-25")。您可以通过 传递多个包路径,用空格分隔,但它们必须各自包含在它们自己的一组引号中。

用法示例(在我的Mac):

[email protected]:~/sdk/tools/bin$ ls ../../build-tools/ 
25.0.0/ 
[email protected]:~/sdk/tools/bin$ ./sdkmanager "build-tools;25.0.2" 
done 
[email protected]:~/sdk/tools/bin$ ls ../../build-tools/ 
25.0.0/ 25.0.2/ 

你也可以指定不同的options,例如强制所有连接使用HTTP(--no_https),或者为了使用代理服务器(--proxy_host=address--proxy_port=port)。

要检查可用选项,请使用--help标志。在我的机器(Mac)上,输出如下:

[email protected]:~/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. 
+1

其他人得到'警告:未知参数--package_file'? – ulidtko

+3

@ulidtko使用文档中存在一个错误。正确的方法是追加等号,例如'--package_file = packages.txt'。 –

1

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

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

我更愿意把那安装我的依赖

就像一个剧本:

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

+0

谢谢,帮我节省了很多时间。 – utzcoz

0

尝试

列出所有包

android list sdk --all 

2.使用以下命令

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

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

运行sdkmanager --list列出可用的软件包安装软件包。

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

要安装的首选版本上运行

sdkmanager "build-tools;27.0.3" 
相关问题