在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
,官方下载界面如下
相应的,下载studio无sdk版本
下载后解压到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
参数列出包名时,会有这种为了表格输出有省略号的时候
想列出完整包名,需要使用--verbose
参数,修改脚本最后一句为:
%SDK_MAN% %PARAM% --no_https --proxy=http --proxy_host=g.cn --proxy_port=80 --verbose
这样就能列出完整的包名了,如下图
从图中还能看到包之间有依赖关系,下载一个包时,其依赖的包也会被下载下来。
更新sdk tools
时,发现失败,日志如下:
经过google
,stackoverflow
上已经有解决办法,需要使用--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