现在我要下载并安装Android SDK和AVD管理器,然后通过UI安装api、工具。有没有办法使这个过程自动化?


当前回答

要回答所有带有'y'的许可证,您可以在脚本中尝试这样做:

(while :
do
  echo 'y'
  sleep 2
done) | android update sdk -u .....

其他回答

在更新的Android版本(例如25.2.5)中,我们应该使用sdkmanager(而不是Android命令)。

安装包示例:

android-sdk/tools/bin/sdkmanager "extras;android;m2repository"

命令获取所有可用包的列表:

android-sdk/tools/bin/sdkmanager --verbose --list

此网页列出了SDK-tools的下载链接:

这里有一个链接到一个开源存储库Docker -android,它可以在Docker镜像中安装android。

你也可以在这个SO问题中找到答案:自动接受所有有用的SDK许可证。

更新

最新版本引入了sdkmanager,这是一个命令行工具,允许您查看、安装、更新和卸载Android SDK包。

sdkmanager工具在Android SDK Tools(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 (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), 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

旧的答案

(请注意:android命令已弃用!)

你离自动化越近的可能是:

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列表SDK返回的数字(即1,也称为包索引) 附加组件 医生 额外的 平台 platform-tool 样本 源 系统映像 工具

或可以是一个或多个特定的标识符。例如,如果你只想下载一小部分特定的软件包,你可以这样做:

android update sdk -u --filter platform-tools,android-16,extra-android-support

您将获得平台工具、API级别16和支持包JAR文件。如果您只是构建一个构建机器,并且必须为下载所有您永远不会使用的额外内容付费,那么这非常方便。

要查看您可以使用的可用选项,例如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]

这对我没用……

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
}
'

从Android Plugin for Gradle version 2.2.0开始,丢失的SDK组件会自动下载。

对于新手Android开发人员和经验丰富的Java开发人员来说,即使您克服了前面回答的所有噩梦,也很难知道哪些依赖项。

我的一个同事建议我使用Android Studio(它是基于IntelliJ IDEA的:-),因为上面的噩梦。

我听从了他的建议。

但我不接受默认安装,并试图将其安装在我的软件驱动器中。结果却是一场噩梦。SDK对话框似乎挂起了,一点也不直观。所以我才会来这里。

在阅读了上面的内容后,我再次尝试Studio,这一次它接受了安装的所有默认设置。

您看……它在几个对话中处理了所有SDK依赖项(我猜是核心的),而没有提示,即Ctrl + Shift + S和SDK。

因此,我向新手推荐它。下面是布丁下载后的证明:

我下载并安装的Studio版本:

windows版本:

在它做了好事之后: