使用新版android sdk tool 的 sdkmanager 安装 android sdk 组件

96
zch4wb
2017.07.31 20:14* 字数 810

25.2.3+sdk tools中,不仅sdk的gui更新工具用不了,$ANDROID_SDK_ROOT/tools目录下的android.bat(Linux为shell)也变成了deprecated状态,官方推荐GUI界面使用studio集成管理器,命令行(使用场景:打包机或者CI系统中)界面使用$ANDROID_SDK_ROOT/tools/bin/sdkmanager.bat,参考官方文档,来自己尝试下。

假设现在要在自己的开发机上新安装sdk,如果使用studio,则需要翻墙,无法使用g.cn:80代理来加快速度,或者干脆下载不了。

从官方或者其他途径下载到sdk tools,官方下载界面如下

sdk tools下载

相应的,下载studio无sdk版本


studio下载

下载后解压到D:\android\sdk\tools,开始使用sdkmanager,加上help参数,列出使用方式

cd D:\android\sdk\tools\bin
sdkmanager --help

基础用法如下:

#列出已安装和可用的包(包括已安装的包)
sdkmanager --list [options]
#安装包
sdkmanager packages [options]

packages参数为用--list参数输出的可用的包的path,官方叫做SDK-style path,例如安装platform tools的方法:

sdkmanager "platforms;android-26"

如果要一次安装多个包,可以使用--package_file参数指定包名配置文本文件,如下:

sdkmanager --package_file=package_file [options]

package_file文件内容为SDK-style path,一行一个,没有双引号,例如:

build-tools;23.0.1
build-tools;23.0.2
build-tools;23.0.3

删除使用--uninstall参数,例如:

sdkmanager --uninstall packages [options]
sdkmanager --uninstall --package_file=package_file [options]

更新已安装的包

sdkmanager --update [options]

[options]参数列出了怎样使用代理,强制使用http的方法,具体如下:

选项 描述
--sdk_root=path 指定sdk根目录
--channel=channel_id 指定更新频道:0 (Stable), 1 (Beta), 2 (Dev), and 3 (Canary)
--include_obsolete 列出和更新包时是否包括已经废弃的包,和--list或--update同时使用
--no_https 强制使用http
--verbose 详细输出模式:错误、警告和完整信息
--proxy={http | socks} 代理方式用http或socks
--proxy_host={IP_address | DNS_address} 代理主机,可以用IP地址,也可以用域名
--proxy_port=port_number 代理端口

想给其他操作系统下载sdk,可以设置环境变量REPO_OS_OVERRIDE,值为windows, macosx, linux

使用代理g.cn:80,并且用http方式列出包信息:

sdkmanager --list --no_https --proxy=http --proxy_host=g.cn --proxy_port=80

为了防止每次都输入一堆options参数,写个bat脚本(shell脚本类似),叫smeasy.bat吧,内容如下

@echo off
@rem %* 功能参数,如:list update uninstall

set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.

set SDK_MAN=%DIRNAME%sdkmanager.bat

set PARAM=

if "x%~1" == "x" goto execute

set PARAM=%*

:execute
%SDK_MAN% %PARAM% --no_https --proxy=http --proxy_host=g.cn --proxy_port=80

为了同步多台机器的配置,最好写个package_file,创建一个叫pack.txt的文件,里面填包名即可,安装时直接执行

smeasy --package_file=pack.txt

使用--list参数列出包名时,会有这种为了表格输出有省略号的时候

list默认输出

想列出完整包名,需要使用--verbose参数,修改脚本最后一句为:

%SDK_MAN% %PARAM% --no_https --proxy=http --proxy_host=g.cn --proxy_port=80 --verbose

这样就能列出完整的包名了,如下图


完整包名

从图中还能看到包之间有依赖关系,下载一个包时,其依赖的包也会被下载下来。

更新sdk tools时,发现失败,日志如下:

sdk tools更新失败

经过googlestackoverflow上已经有解决办法,需要使用--sdk_root参数指定另外的sdk根目录(里面需要先放一个sdk tools),所以先copy一份sdk tools到另一个目录D:\android\sdk_temp,然后把D:\android\sdk_temp\tools\bin\smeasy.bat脚本最后一句改为:

set SDK_ROOT=D:\android\sdk
%SDK_MAN% %PARAM% --no_https --proxy=http --proxy_host=g.cn --proxy_port=80 --verbose --sdk_root=%SDK_ROOT%

至此,脚本完成。

完整版smeasy.bat脚本如下:

@echo off
@rem %* 功能参数,如:list update uninstall
set SDK_ROOT=D:\android\sdk
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.

set SDK_MAN=%DIRNAME%sdkmanager.bat

set PARAM=

if "x%~1" == "x" goto execute

set PARAM=%*

:execute
%SDK_MAN% %PARAM% --no_https --proxy=http --proxy_host=g.cn --proxy_port=80 --verbose --sdk_root=%SDK_ROOT%

对应的shell脚本smeasy.sh如下:

#!/bin/bash
DIRNAME=$PWD
SDK_MAN=$DIRNAME/sdkmanager
SDK_ROOT=$HOME/android/sdk

PARAM=
if [ $# -gt 0 ]
then
    PARAM=$*
fi

$SDK_MAN $PARAM --no_https --proxy=http --proxy_host=g.cn --proxy_port=80 --verbose --sdk_root=$SDK_ROOT

参考
sdk tools和studio下载地址:https://developer.android.com/studio/index.html#downloads
环境变量配置的变化:https://developer.android.com/studio/command-line/variables.html
sdkmanager配置说明:https://developer.android.com/studio/command-line/sdkmanager.html
sdk tools更新失败解决办法:https://stackoverflow.com/questions/43796568/cant-update-tools-android-sdk-command-line-tools-for-windows

流水账
Gupao