Есть ли способ автоматизировать установку Android SDK?
-
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. Поэтому я бы порекомендовал это новичкам. Здесь доказательство пудинга при загрузке:
Версия Sudio, которую я загрузил и установил:Версия Windows:И здесь после того, как это сделало это хорошо:
Искренне надеюсь, что это работает для вас !!
Чтобы автоматизировать 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"}
...