首页 文章

如何在命令行上安装Android SDK Build Tools?

提问于
浏览
275

我想从命令行设置Android dev环境,遇到以下问题:

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,因为我想在没有ant的情况下从命令行构建apk .

18 回答

  • 2

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

    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是上面列出命令列出的包号

  • 1

    如其他答案中所述,您可以使用 --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

  • 20

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

    Usage (from documentation):

    sdkmanager包[选项]
    packages参数是一个SDK风格的路径,用引号括起来(例如,“build-tools; 25.0.0”或“platforms; android-25”) . 您可以传递多个包路径,用空格分隔,但每个包必须用自己的引号括起来 .

    Example usage (on my 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.
    
  • 61

    ADB Build-Tools不会通过命令android update sdk --no-ui自动下载

    所以安装Buil-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
    
  • 1

    我尝试从命令行安装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
    
  • 6

    我刚刚通过命令行安装了android sdk依赖项,因为工具和网络附带的文档非常缺乏,我想我会发布我在这里发现的内容 .

    我正在 android sdk r24.4.1linux 工作 . 您可以运行两个命令来列出可用的包:

    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

    疯了,但它的确有效 .

  • 21

    大多数答案似乎忽略了这样一个事实:您可能需要在没有超级用户权限的无头环境中运行更新,这意味着脚本必须回答所有 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,并且在发送这些字符之间几乎没有延迟,我必须处理的版本没有任何类型的超时选项 . 它将"pollute" stdout并且脚本将失败抱怨输入错误 . 解决方案是在发送 'y' 到stdout之间加一个延迟,这正是 while/sleep combo所做的 .

    expect 默认在某些Linux发行版上不可用,我无法将其安装为我的CI脚本的一部分,因此不得不使用最通用的解决方案,没有什么比简单的bash脚本更通用了,对吧?

    事实上,我在博客上发表了这篇文章(NSBogan),如果你有兴趣,可以在这里查看更多细节 .

  • 4

    但是,跑步太慢了

    是的,我遇到了同样的问题 . 一些文件下载非常慢(或者至少它们已经过去几天) . 如果你想下载所有内容,你可以做很多事情 .

    结果是文件夹构建工具中没有任何内容,我想要的是aapt和apkbuilder,因为我想在没有ant的情况下从命令行构建apk .

    你让它完成了吗?

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

    例如:

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

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

  • 32

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

    运行 sdkmanager --list 列出可用的包 .

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

    安装首选版本运行

    sdkmanager "build-tools;27.0.3"
    
  • 4

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

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

    灵感来自@ i4niac和@AurélienLambert的答案,这就是我想出的

    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
    

    Explanation

    • 获取逗号分隔的数字列表,这些数字是 android list sdk --all 命令(忽略过时的包)结果中构建工具包的索引 .

    • 每隔几毫秒继续在终端投掷'y'以接受许可 .

  • 1

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

    就像是:

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

  • 137

    Nate在https://stackoverflow.com/a/19416222/1104031帖子中说,默认情况下无法自动下载构建工具 .

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

    我在https://stackoverflow.com/a/17863931/1104031帖子中使用"expect"工具作为danb . 你只需要android-sdk和 python27expect .

    此脚本将安装所有构建工具,所有sdks以及自动构建所需的一切:

    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)
    
  • 8

    如其他响应中所述,构建工具需要安装 --all 标志 . 您还最好使用 -t 过滤器标志来避免安装所有包,但无法过滤所有构建工具 .

    在AOSP错误跟踪器中已经有对这两点的功能请求 . 随意投票给他们,这可能会让他们有一天发生:

  • 0

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

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

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

    • 当在bin文件夹内时,按住shift键,右键单击,然后在此处选择打开命令行 . 右键单击>>打开命令行 .

    • 命令行打开后,键入sdkmanager,单击“输入” .

    • 然后运行类型sdkmanager(空格),双连字符( - ),类型列表Sdkmanager --list(这列出了SDK管理器中的所有包)

    • 键入sdkmanager(space)然后输入包名称,按回车键 . 例如 . sdkmanager platform-tools(按回车)它将加载许可协议 . 带选项(y / n) . 输入y接受,它将下载您指定的包 .

    我希望这有帮助 . :)

  • 467

    尝试

    1. 列出所有包裹

    android list sdk --all
    

    2. 使用以下命令安装软件包

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

    android update sdk

    此命令将更新并安装SDK Tools,Build Tools,SDK平台工具的所有最新版本 .

    这对我有用 .

相关问题