有没有一种方法来自动化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 

有些部分是从这个线程中的其他答案。