Есть ли способ автоматизировать установку Android SDK?

StackOverflow https://stackoverflow.com/questions/4681697

  •  10-10-2019
  •  | 
  •  

Вопрос

Теперь я должен загрузить и установить Android SDK ABD AVD Manager, а затем установить API, инструменты через пользовательский интерфейс. Есть ли способ автоматизировать этот процесс?

Это было полезно?

Решение

ОБНОВИТЬ

Последние версии вводят 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 (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 list sdk (т.е. 1, также известный как индекс упаковки)
  • добавить
  • док
  • дополнительный
  • Платформа
  • платформа
  • образец
  • источник
  • системное изображение
  • инструмент

или может быть один или несколько конкретных идентификаторов. Например, если вы просто хотите загрузить небольшой набор определенных пакетов, вы можете сделать это:

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

И вы просто получите инструменты платформы, API -уровень 16 и поддержку пакета Jar. Это действительно удобно, если вы строите только сборку машины и придется платить за загрузку всех дополнительных вещей, которые вы никогда не будете использовать.

Чтобы увидеть доступные параметры, которые вы можете использовать -например, например,

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

Я использую это для установки и обновления SDK на Travis-Ci

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 .....

Для любого, кто все еще ищет метод для загрузки всех пакетов 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 Repo

Хорошо:

  • Не зависит от expect.
  • Обезглавленный.

Недостатки:

  • Вам все еще нужно установить базовый SDK вручную и положить android на ваш путь.
  • Скрипт работает только на UNIX.

Начиная с Плагин Android для Gradle Версия 2.2.0, отсутствующие компоненты SDK Получите загрузку автоматически.

В более новых версиях 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 который может установить Android на изображении Docker.

Вы также можете найти ответы в Этот вопрос: автоматически принимайте все лицензии SDK полезный.

Я собрал сценарий Ruby, который загружает и устанавливает SDK без подсказки, что может помочь.https://github.com/ayvazj/andenv

Еще один скрипт для загрузки, необходимый, не нуждающийся, не {устаревший, источник, эмулятор-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 Developer, но опытного разработчика Java, действительно изумительно знать, какие зависимости, даже если вы преодолеете все вышеперечисленные кошмары. Моя коллега посоветовал мне использовать Android Studio (которая основана на IntelliJ :-) конкретно Из -за вышеупомянутых кошмаров. Я последовал за его советом. Но я не принял по умолчанию для установки и попытался установить его в свой программный диск. Это оказалось кошмаром. Диалог SDK, казалось, повесился и вообще не был интуитивно понятным. Вот почему я оказался здесь. Прочитав вышесказанное, я попробовал Studio еще одну попытку, и на этот раз принял все значения по умолчанию для интуиции. Эй, Престо ... это позаботилось обо всех зависимостях SDK (основные, которые я предполагаю) в нескольких диалогах, не будучи побуждающими CTL-Shift-S и SKD. Поэтому я бы порекомендовал это новичкам. Здесь доказательство пудинга при загрузке:enter image description here

Версия Sudio, которую я загрузил и установил:enter image description hereВерсия Windows:enter image description hereИ здесь после того, как это сделало это хорошо:enter image description here

Искренне надеюсь, что это работает для вас !!

Чтобы автоматизировать sdkmanager.bat --licenses Направьте Windows (скажем, вы устанавливаете с помощью автоматизации для инфраструктуры сборки) ... не запускайте ее. Не тратьте время, пытаясь выяснить, как трубо y внутрь. Я старался; Abject Fail.

Скорее - запустите один раз, сами и обратите внимание, что он генерирует файлы в 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"}
    ...
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top