有没有一种方法来自动化android sdk安装?
现在我要下载并安装Android SDK abd AVD Manager,然后通过UI安装这些APIs,工具。 有没有办法使这个过程自动化?
越接近自动化可能是:
$ android update sdk --no-ui
android为自动更新提供了这些选项:
Action "update sdk": Updates the SDK by suggesting new platforms to install if available. Options: -f --force Forces replacement of a package or its parts, even if something has been modified -u --no-ui Updates from command-line (does not display the GUI) -o --obsolete Installs obsolete packages -t --filter A filter that limits the update to the specified types of packages in the form of a comma-separated list of [platform, tool, platform-tool, doc, sample, extra] -s --no-https Uses HTTP instead of HTTPS (the default) for downloads -n --dry-mode Simulates the update but does not download or install anything
如果您想列出哪些软件包可用于安装,您可以使用
$ android list sdk
你会得到一个有序的软件包列表,例如
Packages available for installation or update: 9 1- ARM EABI v7a System Image, Android API 15, revision 2 2- Intel x86 Atom System Image, Android API 15, revision 1 3- Android Support, revision 8 4- Google AdMob Ads SDK, revision 6 5- Google Analytics SDK, revision 2 6- Google Play APK Expansion Library, revision 1 7- Google Play Billing Library, revision 2 8- Google Play Licensing Library, revision 2 9- Google Web Driver, revision 2
如果使用--filter
选项,也可以将更新限制为所需的组件
$ android update sdk --filter <component> --no-ui
其中组件是一个或多个
-
android list sdk
返回的数字(也就是1 ,也就是包的索引 ) - 加上
- DOC
- 额外
- 平台
- 平台工具
- 样品
- 资源
- 系统映像
- 工具
或者可以是一个或多个特定的标识符。 例如,如果你只是想下载一小组特定的软件包,你可以这样做:
$ android update sdk -u --filter platform-tools,android-16,extra-android-support
你只需要获得平台工具,API级别16和支持包jar。 如果您只是构build一台生成器,这将非常方便,并且必须支付下载所有额外的东西,你永远不会使用。
例如,要查看可用的选项,可以使用–help
$ android --help list sdk Usage: android [global options] list sdk [action options] Global options: -h --help : Help on a specific command. -v --verbose : Verbose mode, shows errors, warnings and all messages. --clear-cache: Clear the SDK Manager repository manifest cache. -s --silent : Silent mode, shows errors only. Action "list sdk": Lists remote SDK repository. Options: -o --obsolete : Deprecated. Please use --all instead. -a --all : Lists all available packages (including obsolete and installed ones) --proxy-host: HTTP/HTTPS proxy host (overrides settings if defined) --proxy-port: HTTP/HTTPS proxy port (overrides settings if defined) -s --no-https : Uses HTTP instead of HTTPS (the default) for downloads. -e --extended : Displays extended details on each package -u --no-ui : Displays list result on console (no GUI) [Default: true]
UPDATE
最新版本介绍sdkmanager
,一个命令行工具,允许您查看,安装,更新和卸载Android SDK包。
sdkmanager
工具在Android SDK工具包( 25.2.3及更高版本 )中提供,位于android_sdk/tools/bin/
。
sdkmanager [--uninstall] [<common args>] [--package_file <file>] [<packages>...] sdkmanager --update [<common args>] sdkmanager --list [<common args>] sdkmanager --licenses [<common args>] In its first form, installs, or uninstalls, or updates packages. By default, the listed packages are installed or (if already installed) updated to the latest version. --uninstall: uninstalled listed packages. <package> is a sdk-style path (eg "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), all installed packages are updated to the latest version. In its third form, all installed and available packages are printed out. In its fourth form (with --licenses), show and offer the option to accept licenses for all available packages that have not already been accepted. 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.
所以,要更新包运行
$ sdkmanager --update
接受许可证
$ yes | sdkmanager --licenses
这不适合我…
echo "y" | android ....
所以我最终在这里:
expect -c ' set timeout -1 ; spawn sudo /opt/android-sdk/tools/android update sdk -u; expect { "Do you accept the license" { exp_send "y\r" ; exp_continue } eof } '
我用它来安装和更新travis-ci上的sdk
curl --location http://dl.google.com/android/android-sdk_r22.3-linux.tgz | tar -x -z -C $HOME export ANDROID_HOME=$HOME/android-sdk-linux export PATH=$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools ( sleep 5 && while [ 1 ]; do sleep 1; echo y; done ) | android update sdk --no-ui --filter platform-tool,android-19,sysimg-19,build-tools-19.0.1
要用“y”回答所有的许可证,你可以在脚本中试试这个:
(while : do echo 'y' sleep 2 done) | android update sdk -u .....
对于任何一个仍在search下载所有Android软件包的方法,我已经写了一个脚本来做到这一点。 它将下载所有非废弃的软件包。
#!/binbash # Install all non-obsolete android sdk packages. # author: Tai Le Tien (letientai299 at gmail.com) function install_sdk { android update sdk -u -s -a -t "$1" } function fetch_non_obsoled_package_indices { # Fetch the sdk list using non-https connections android list sdk -u -s -a |\ # Filter obsoleted packages sed '/\(Obsolete\)/d' |\ # Filter to take only the index number of package sed 's/^[ ]*\([0-9]*\).*/\1/' |\ # Remove the empty lines sed -n 's/^[^ $]/\0/p' } for package_index in $(fetch_non_obsoled_package_indices) do echo "=====================================================================" echo "Start to install package: ${package_index}" echo "=====================================================================" # Auto accept license echo -e "y" | install_sdk "${package_index}" echo echo done
你也可以在我的Github回购中看到它
好:
- 不依赖于
expect
。 - 无头。
缺点:
- 你仍然需要手动安装基本的SDK,并把
android
放到你的path中。 - 脚本只适用于Unix。
从Android插件Gradle版本2.2.0开始,缺lessSDK组件会自动下载 。
在较新的Android版本(例如25.2.5
)中,我们应该使用sdkmanager (而不是android
命令)
安装包的示例:
android-sdk/tools/bin/sdkmanager "extras;android;m2repository"
命令获取所有可用软件包的列表:
android-sdk/tools/bin/sdkmanager --verbose --list
这个网页列出了SDK工具的下载链接:
这里是一个开源的仓库docker-android的链接 ,可以将android安装在Docker镜像中。
你也可以在这里find答案问题:自动接受所有有用的SDK许可证 。
我把一个ruby脚本放在一起,下载并安装SDK,而不会提示哪一个可能有帮助。 https://github.com/ayvazj/andenv
还有另一个脚本需要下载,非{obsolute,source,emulator-image,doc}包:
#!/bin/bash set -e # cd into where tools/android can be found if [[ -d "$ANDROID_HOME" ]]; then cd "$ANDROID_HOME" elif [[ -x "$(dirname "$0")/tools/android" ]]; then cd "$(dirname "$0")" else echo "FAILED: Cannot find ANDROID_HOME/tools/android" exit 1 fi android () { "$(dirname $0)/tools/android" "$@" } needed_packages () { android list sdk -u -s -e \ | grep '^id:' \ | cut -d'"' -f2 \ | grep -v 'source' \ | grep -v 'sys-img' \ | grep -v 'doc' \ | paste -d, -s - } main () { (while : ; do echo 'y' sleep 1 done) | android update sdk -u -s -a -t "$(needed_packages)" } main
有些部分是从这个线程中的其他答案。