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


当前回答

对于那些还在寻找下载所有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存储库中看到它

优点:

不依赖期望。 无头的。

缺点:

你仍然需要手动安装基本的SDK,并将android放到你的路径中。 该脚本只能在Unix上运行。

其他回答

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

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

我听从了他的建议。

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

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

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

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

我下载并安装的Studio版本:

windows版本:

在它做了好事之后:

要在Windows上自动化sdkmanager.bat——license提示符(假设您正在通过自动化安装构建基础设施)…不要运行它。不要浪费时间试图弄清楚如何将y插入其中。我试着;可怜的失败。

相反,自己运行一次,并注意它会生成文件到C:\android\android-sdk\licenses(在这里您正在运行C:\android\android-sdk\tools\bin\sdkmanager.bat -您的安装根可能不同)。

获取这些文件,并将它们放在您可以在自动设置脚本中获取它们的地方。就我个人而言,Ansible是我的毒药,所以

# Note to future-us:
# These are magical files generated by running `c:/android/android-sdk/tools/bin/sdkmanager.bat --licenses`
# This, delightfully, is interactive, and wants to _actually_ read the keyboard buffer.
# That's reputedly possible via SendKeys. I elected to not try that.
# So, instead:
# 1) remote to an instance like a cave-dweller
# 2) run `c:/android/android-sdk/tools/bin/sdkmanager.bat --licenses` in a prompt.
# 3) _actually type_ `y` however many godforsaken times you need to.
# 4) meticulously harvest `c:/android/android-sdk/licenses/*` to this task.
#    (you don't need the newline that they thoughtfully put before the hash in each file).
- name: set up android licenses by hand
  win_lineinfile:
    path: c:/android/android-sdk/licenses/{{ item.name }}
    line: "{{ item.line }}"
    create: true
  with_items:
    - {name: "android-googletv-license", line: "SOME HASH"}
    - {name: "android-sdk-license", line: "SOME OTHER HASH"}
    ...

一个脚本只下载需要的,非{过时的,source, emultor -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

有些部分摘自其他答案。

对于那些还在寻找下载所有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存储库中看到它

优点:

不依赖期望。 无头的。

缺点:

你仍然需要手动安装基本的SDK,并将android放到你的路径中。 该脚本只能在Unix上运行。

我用这个在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