Как установить Android SDK Build Tools в командной строке?


292

Я хочу настроить среду разработки Android из командной строки и столкнуться со следующей проблемой:

wget http://dl.google.com/android/android-sdk_r22.0.5-linux.tgz

после распаковки файла запустите

tools/android update sdk --no-ui

Тем не менее, он работает слишком медленно

Fetching https://dl-ssl.google.com/android/repository/addons_list-2.xml

В результате в папке build-tools ничего нет, а я хочу aapt и apkbuilder, так как я хочу собрать apk из командной строки без ant.

Ответы:


479

По умолчанию SDK Manager из командной строки не включает инструменты сборки в список. Они в "устаревшей" категории. Чтобы увидеть все доступные загрузки, используйте

android list sdk --all

А затем, чтобы получить один из пакетов в этом списке из командной строки, используйте:

android update sdk -u -a -t <package no.>

Где -u обозначает -no-ui, -a обозначает -all и -t обозначает -filter.

Если вам нужно установить несколько пакетов, сделайте:

Обновление Android SDK -U -a -t 1,2,3,4, .., N 

Где 1,2, .., n - номер пакета, указанный выше с помощью команды list


4
Если вам не хватает инструментов сборки, таких как 18.1.1, то это правильный способ установить его с помощью командной строки.
Cray

19
это отстой, они не упомянули --allвариант в официальных советах . Спасибо.
Александр Малахов

4
@DanielJonker Да, это так. Просто эхо "да" для команды, т.е. эхо да | android update sdk --all --filter tools --no-ui --force> / dev / null
nsg

4
echo "yes"можно сократить до echo "y", но это все равно не работает во всех случаях. В некоторых случаях вы можете получить более одного лицензионного приглашения в зависимости от фильтра и конкретных пакетов. echo "y"будет отвечать только на первый запрос, но не на остальные. Я пытаюсь заставить его работать с yesкомандой, но пока безуспешно.
i4niac

3
@AlexanderMalakhov Я согласен, если на вашей операционной системе есть утилита, ее использование - лучший вариант. Сначала я посмотрел на ожидаемое, но в моем случае мне нужно запустить скрипт на определенном дистрибутиве Linux, работающем в облаке AWS. Этот дистрибутив не имеет ожидаемой установки, и у меня недостаточно прав для его установки в рамках плана сборки. После осмотра лучшее решение, которое я нашел, это <pre> <code> # update Android SDK на безголовом сервере FILTER = tool, platform, android-20 (sleep 5 && while [1]; do sleep 1; echo y; done) ) \ | обновление для Android SDK --no-ui --all \ --filter $ {FILTER} </ code> </ pre>
i4niac

140

Как упоминалось в других ответах, вы можете использовать --filterопцию для ограничения установленных пакетов:

android update sdk --filter ...

Другие ответы не упоминают, что вы можете использовать постоянные строковые идентификаторы вместо индексов (которые будут меняться) для параметров фильтра. Это полезно для автоматической установки или установки по сценарию. Человек для --filterварианта:

... Это также принимает идентификаторы, возвращаемые 'list sdk --extended'.

android list sdk --all --extended :

Packages available for installation or update: 97
----------
id: 1 or "tools"
     Type: Tool
     Desc: Android SDK Tools, revision 22.6.2
----------
id: 2 or "platform-tools"
     Type: PlatformTool
     Desc: Android SDK Platform-tools, revision 19.0.1
----------
id: 3 or "build-tools-19.0.3"
     Type: BuildTool
     Desc: Android SDK Build-tools, revision 19.0.3

Затем вы можете использовать строковые идентификаторы в качестве параметров фильтра, чтобы точно указать версии, которые вы хотите:

android update sdk --filter tools,platform-tools,build-tools-19.0.3 и т.д


27
+1 за --extendedопцию, проясняющую, что устанавливать для скриптов CI.
nhaarman

16
android updateтакже потребуется --allопция, в противном случае отображается справка по использованию. Например: android update sdk --no-ui --all --filter build-tools-21.1.0(и +1 для --extendedопции, которая позволяет вам видеть псевдонимы как build-tools-21.1.0)
Petrus Repo

1
Где мужчина для --filterи --extendedвариантов?
Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功

2
Я согласен, что гораздо лучше использовать строку, а не число, которое не является фиксированным.
wisbucky

1
Я искал эту --extendedопцию, чтобы я мог написать скрипт и использовать его на моем Continuous Integration Server, где он мог бы обновить сами ресурсы sdk. Хороший совет!
Osayilgan

73

Android SDK ToolsПакет версии 25.2.3 (и выше) содержит новый инструмент - sdkmanager, который упрощает эту задачу установки инструментов сборки из командной строки.
Он находится в android_sdk/tools/binпапке.

Использование (из документации ):

sdkmanager packages [options]

packagesАргумент является путем SDK стиля, завернутый в кавычках (например, "build-tools;25.0.0"или "platforms;android-25"). Вы можете передать несколько путей пакета, разделенных пробелом, но каждый из них должен быть заключен в свой собственный набор кавычек.

Пример использования (на моем Mac):

alex@mbpro:~/sdk/tools/bin$ ls ../../build-tools/  
25.0.0/   
alex@mbpro:~/sdk/tools/bin$ ./sdkmanager "build-tools;25.0.2"  
done   
alex@mbpro:~/sdk/tools/bin$ ls ../../build-tools/  
25.0.0/ 25.0.2/

Вы также можете указать различные параметры , например, чтобы заставить все соединения использовать HTTP ( --no_https), или чтобы использовать прокси-сервер ( --proxy_host=addressи--proxy_port=port ).

Чтобы проверить доступные параметры, используйте --helpфлаг. На моей машине (Mac) вывод выглядит следующим образом:

alex@mbpro:~/sdk/tools/bin$ ./sdkmanager --help
Usage: 
  sdkmanager [--uninstall] [<common args>] \
    [--package_file <package-file>] [<packages>...]
  sdkmanager --update [<common args>]
  sdkmanager --list [<common args>]

In its first form, installs, or uninstalls, or updates 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), currently installed packages are
    updated to the latest version.
In its third form, all installed and available packages are printed out.

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.

1
Кто-нибудь еще получает Warning: Unknown argument --package_file?
ulidtko

3
@ulidtko Ошибка в документации по использованию. Правильный способ - добавить знак равенства, например --package_file=packages.txt.
Алекс Липов

К сожалению, это не упрощает задачу установки. Не все программисты на Android программируют на Linux без графического интерфейса. Некоторые из нас делают это в Windows и предпочитают пользовательский интерфейс, который работает как любое другое приложение Windows. Это движется назад, а не вперед
AaA

2
@AaA Упрощает задачу установки из командной строки . ОП явно заявил, что ищет решение командной строки , и поэтому ваш комментарий не имеет значения в этом контексте.
Алекс Липов

55

Инструменты сборки ADB не будут загружаться автоматически, по команде Android Update SDK --no-ui

Итак, для установки типа Buil-Tool (в консоли):

android list sdk --all

Запомните номер, который указан перед элементом, и выполните следующее:

android update sdk -u --all --filter <number>

Команды должны быть набраны в / YourFolder / android-sdk-linux / tools

Также для удаленной папки (например, сервер, открытый с помощью ssh) введите:

**./android** list sdk --all
**./android** update sdk -u --all --filter <number>

Для простого списка пакетов ADB введите в терминале:

android list sdk

для установки всех пакетов:

android update sdk --no-ui

Или с фильтрами (запятая является разделителем):

android update sdk --no-ui --filter 3,5,8,14

для старых устаревших SDK вы должны использовать --all. например, обновление Android SDK --no-ui --all --filter 27 для установки платформы-8
Fluke

так как установщик SDK продолжал падать, когда я использовал графический интерфейс, мне пришлось переключиться на командную строку, так что это действительно помогло. Спасибо.
Ивонн Аберроу

32

Отличным источником информации, с которой я столкнулся, пытаясь установить все компоненты Android SDK из командной строки, был этот Dockerfile. Внутри Dockerfile вы можете видеть, что автор выполняет установку одной команды platform toolsи build toolsбез какого-либо другого взаимодействия. В случае, если OP выдвинул, команда будет адаптирована к:

echo y | $ANDROID_HOME/tools/android update sdk --all --filter build-tools-21.1.0 --no-ui

Что делать, если я не хочу все пакеты? Просто хочу 21.1.0 .
Игорь Ганапольский

@IgorGanapolsky Возможно, вам стоит попробовать без --all флага
geoand

21

У меня было чертовски много времени на установку зависимостей android sdk через командную строку, и, поскольку документация, которая поставляется вместе с инструментами и онлайн, крайне не хватает, я решил опубликовать то, что обнаружил здесь.

Я работаю с android sdk r24.4.1для linux. Есть две команды, которые вы можете запустить, чтобы вывести список доступных пакетов:

android list sdk

и тем более исчерпывающим

android list sdk --all

Номера пакетов для конкретных пакетов отличаются для каждой команды выше! Например, первый перечисляет пакет API 23.1 revision 3как пакет, #3а второй перечисляет его как#29 .

Теперь есть два способа установки с помощью команды android.

tools/android update sdk --no-ui --filter <package number>

и

tools/android update sdk -u -a -t <package number>

Учитывая, что каждая команда установки может принять пакет # в качестве параметра, какой номер пакета вы используете? После долгих поисков в Интернете, проб и ошибок я обнаружил, что

android update sdk --no-ui --filter использует номера пакетов из android list sdk

и

android update sdk -u -a -t использует номера пакетов из android list sdk --all

Другими словами - для установки API 23.1 revision 3вы можете сделать либо:

android update sdk --no-ui --filter 3

или

android update sdk -u -a -t 29

Сумасшедший, но это работает.


1
-aэто короткая версия --all, поэтому он использует этот номер пакета. ( -uкоротко --no-uiи -tкоротко --filter.)
Дартмайм

Я верю тому, что говорит Ипс. Google, как известно, не держит их usage()текст в актуальном состоянии.
not2qubit

в Ubuntu я запустил: $ echo y | $ ANDROID_HOME / tools / android update sdk -u -a -t 27 Теперь, как подтвердить, что я обновился до Android 8?
Ашиш Карпе

$ ANDROID_HOME / tools / android list target | grep "На основе Android" На основе Android 4.0.3 (уровень API 15) На основе Android 4.1.2 (уровень API 16) На основе Android 4.2.2 (уровень API 17) На основе Android 4.3.1 (уровень API 18) Основано на Android 4.4.2 (уровень API 19) Основано на Android 4.4.2 (уровень API 19) Основано на Android 5.0.1 (уровень API 21) Основано на Android 5.1.1 (уровень API 22) Основано на Android 6.0 (API уровень 23) Основано на Android 7.0 (уровень API 24)
Ашиш Карпе

Причина, по которой я запустил: $ ANDROID_HOME / tools / android list sdk Пакеты, доступные для установки или обновления: 1 1- SDK Platform Android 8.1.0, API 27, редакция 1
Ашиш Карпе

20

Большинство ответов, кажется, игнорируют тот факт, что вам может потребоваться запустить обновление в автономной среде без прав суперпользователя, а это означает, что сценарий должен y/nавтоматически отвечать на все запросы лицензии.

Вот пример, который делает трюк.

FILTER=tool,platform,android-20,build-tools-20.0.0,android-19,android-19.0.1

( sleep 5 && while [ 1 ]; do sleep 1; echo y; done ) \
    | android update sdk --no-ui --all \
    --filter ${FILTER}

Независимо от того, сколько запросов вы получите, на все они будут даны ответы. Этот while/sleepцикл выглядит как симуляция команды yes , и на самом деле это почти так . Проблема в yesтом, что он заполняет стандартный вывод, 'y'и практически нет задержки между отправкой этих символов и версией, с которой мне приходилось иметь дело, не было никакой опции тайм-аута. Это «загрязнит» стандартный вывод, и скрипт не сможет жаловаться на неправильный ввод. Решение состоит в том, чтобы поместить задержку между отправкой 'y'на стандартный вывод, и это именно то, что while/sleepделает комбо.

expect по умолчанию недоступен в некоторых дистрибутивах Linux, и у меня не было возможности установить его как часть моих скриптов CI, поэтому пришлось использовать самое универсальное решение, и ничто не может быть более универсальным, чем простой скрипт bash, верно?

Фактически, я написал об этом в блоге ( NSBogan ), проверьте это для более подробной информации здесь, если вы заинтересованы.


--all установит все возможные SDK. Не идеально, если вы хотите ограничить конкретным фильтром.
Игорь Ганапольский

17

Если вы sdkmanagerустановили (я использую MAC)

запустить, sdkmanager --listчтобы увидеть список доступных пакетов.

Если вы хотите установить инструменты сборки, скопируйте предпочитаемую версию из списка доступных пакетов.

Чтобы установить предпочитаемую версию, запустите

sdkmanager "build-tools;27.0.3"

1
Спасибо. Оно работает! Команда «android» устарела с последней версией Android-sdk, мы должны использовать ./sdkmanager из каталога / tools / bin
JLavoie

8

Тем не менее, он работает слишком медленно

Да, у меня была такая же проблема. Некоторые из файлов загружаются очень медленно (или, по крайней мере, они были в последние пару дней). Если вы хотите скачать все, что не так много, вы можете с этим поделать.

В результате в папке build-tools ничего нет, а я хочу aapt и apkbuilder, так как я хочу собрать apk из командной строки без ant.

Вы позволили ему бежать до конца?

Одна вещь, которую вы можете сделать, это отфильтровать пакеты, которые загружаются с помощью -t коммутатора.

Например:

tools/android update sdk --no-ui -t platform-tool

Когда я попробовал это на днях, я установил версию 18.0.0 инструментов сборки. По какой-то причине последняя версия 18.0.1 не включена в этот фильтр, и единственный способ получить ее - это установить все вместе с --allкоммутатором.


2
Запустите это, чтобы получить доступные фильтры: «android update sdk -h» ... Фильтр, который ограничивает обновление указанными типами пакетов в виде разделенного запятыми списка [платформа, образ системы, инструмент, платформа -инструмент, док, образец, источник. Это также принимает идентификаторы, возвращаемые 'list sdk --extended'.
13

6

Я предпочитаю ставить скрипт, который устанавливает мои зависимости

Что-то вроде:

#!/usr/bin/env bash
#
# Install JUST the required dependencies for the project.
# May be used for ci or other team members.
#

for I in android-25 \
         build-tools-25.0.2  \
         tool \
         extra-android-m2repository \
         extra-android-support \
         extra-google-google_play_services \
         extra-google-m2repository;

 do echo y | android update sdk --no-ui --all --filter $I ; done

https://github.com/caipivara/android-scripts/blob/master/install-android-dependencies.sh


Спасибо, помогите сэкономить мне много времени.
utzcoz

4

У меня просто была эта проблема, поэтому я наконец написал грязное решение на 1 строку, прочитав и проанализировав список доступных инструментов:

 tools/android update sdk -u -t $(android list sdk | grep 'Android SDK Build-tools' | sed 's/ *\([0-9]\+\)\-.*/\1/')

Я переключил свой проект на сервисы play, он запросил лицензии гораздо больше, чем просто инструменты для сборки, поэтому это решение очень ограничено.
nurettin

Чувствуется гораздо более детерминированно, чем индексы, которые могут меняться со временем по мере развития версий ...
Августин Ридингер,

4

Вдохновленный ответами @ i4niac & @ Aurélien Lambert, это то, что я придумал

csv_update_numbers=$(./android list sdk --all | grep 'Android SDK Build-tools' | grep -v 'Obsolete' | sed 's/\(.*\)\- A.*/\1/'|sed '/^$/d'|sed -e 's/^[ \t]*//'| tr '\n' ',')
csv_update_numbers_without_trailing_comma=${csv_update_numbers%?}

( sleep 5 && while [ 1 ]; do sleep 1; echo y; done ) \
    | ./android update sdk --all -u -t $csv_update_numbers_without_trailing_comma

объяснение

  • получить разделенный запятыми список чисел, которые являются индексами пакетов инструментов сборки в результате выполнения android list sdk --allкоманды (Игнорирование устаревших пакетов).
  • каждые несколько миллисекунд продолжайте бросать вас в терминал, чтобы принять лицензии.

4

Загрузите Android SDK с developer.android.com (в настоящее время это файл объемом 149 Мб для ОС Windows). Стоит отметить, что android удалил графический интерфейс sdkmanager, но имеет версию sdkmanager для командной строки в папке bin, которая находится внутри папки tools.

  1. Находясь внутри папки с мусором, удерживайте нажатой клавишу Shift, щелкните правой кнопкой мыши, затем выберите здесь открыть командную строку. Shift + правый клик >> откройте командную строку здесь.
  2. Когда откроется командная строка, введите sdkmanagerнажмите Enter.
  3. Затем выполните тип sdkmanager(пробел), двойной дефис ( --), список типов sdkmanager --list (в этом списке перечислены все пакеты в менеджере SDK).
  4. Введите sdkmanager (пробел), затем имя пакета, нажмите ввод. Например. sdkmanager platform-tools (нажмите enter) Будет загружено лицензионное соглашение. С опциями (да / нет). Введите y, чтобы принять, и он загрузит указанный вами пакет.

Для получения дополнительной информации следуйте официальному документу здесь.

Надеюсь, это поможет. :)


4

Команда "Android" устарела.

Для инструментов командной строки используйте tools / bin / sdkmanager и tools / bin / avdmanager

Если вам не нужна Android Studio, вы можете загрузить основные инструменты командной строки Android с developer.android.com в разделе Только инструменты командной строки .

от CLI должно быть что-то вроде:

curl --output sdk-tools-linux.zip https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip

или

wget --output-document sdk-tools-linux.zip https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip

После этого просто распакуйте архив в целевую папку

unzip sdk-tools-linux.zip

И теперь мы можем установить все, что вам нужно ...

./tools/bin/sdkmanager --install 'build-tools;29.0.2' 'platform-tools' 'platforms;android-29' 'tools'

Вы можете получить полный список пакетов, используя команду ./tools/bin/sdkmanager --list

Некоторые пакеты требуют принятия лицензионного соглашения. вы можете принять его в интерактивном режиме или просто передать «y» потоку ввода, например, так (два соглашения на всякий случай):

echo -ne "y\ny" | ./tools/bin/sdkmanager --install 'system-images;android-29;default;x86_64'

И, конечно же, для вашего удобства вы можете экспортировать такие переменные, как ANDROID_HOME или ANDROID_SDK_ROOT (в том числе сделать это в ~ / .profile или ~ / .bash_profile) или исправить PATH. переменную - все это на ваше усмотрение.

Пример сценария:

mkdir /opt/android-sdk
cd /opt/android-sdk
curl --output sdk-tools-linux.zip https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip
unzip sdk-tools-linux.zip
echo -ne "y" | ./tools/bin/sdkmanager --install 'build-tools;29.0.2' 'platform-tools' 'platforms;android-29' 'tools'

Требования: curl (или wget) и распаковать

Исправление проблем:

если вы видите Warning: Could not create settings, вам нужно иметь toolsкаталог внутри cmdline-toolsкаталога внутри ANDROID_HOME (создайте его, если необходимо, с этим точным именем), см. Инструменты командной строки Android, sdkmanager всегда показывает: Предупреждение: не удалось создать настройки


2

Инструменты сборки не могут быть загружены автоматически по умолчанию, как сказал Нейт в https://stackoverflow.com/a/19416222/1104031 сообщении.

Но я написал небольшой инструмент, который сделает все для вас

Я использовал инструмент «ожидается» в качестве DanB в сообщении https://stackoverflow.com/a/17863931/1104031 . Вам нужно только Android-SDK и python27, expect.

Этот скрипт установит все инструменты сборки, все sdks и все, что вам нужно для автоматической сборки:

import subprocess,re,sys

w = subprocess.check_output(["android", "list", "sdk", "--all"])
lines = w.split("\n")
tools = filter(lambda x: "Build-tools" in x, lines)
filters = []
for tool in tools:
  m = re.search("^\s+([0-9]+)-", tool)
  tool_no = m.group(1)
  filters.append(tool_no)

if len(filters) == 0:
  raise Exception("Not found build tools")


filters.extend(['extra', 'platform', 'platform-tool', 'tool'])

filter = ",".join(filters)

expect= '''set timeout -1;
spawn android update sdk --no-ui --all --filter %s;
expect {
  "Do you accept the license" { exp_send "y\\r" ; exp_continue }
  eof
}''' % (filter)

print expect

ret = subprocess.call(["expect", "-c", expect])
sys.exit(ret)

Как насчет echo "yes" | ./android update sdk --no-https --no-ui --filter 1,6?
schemacs

1
Поправьте меня, если я ошибаюсь, но кажется, что этот скрипт перезагружает все при каждом запуске. Я попытался с параметром -u, но это не сработало: /
gbero

1

Как указано в других ответах, для инструментов сборки требуется установить --allфлаг. Вам также лучше использовать -tфлаг фильтра, чтобы избежать установки ВСЕХ пакетов, но нет способа отфильтровать все инструменты сборки.

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


1

Я попробовал это для обновления всех, и это сработало!

echo y | $ANDROID_HOME/tools/android update sdk --no-ui


-1

Android обновление SDK

Эта команда обновит и установит все последние версии инструментов SDK, инструментов сборки, инструментов платформы SDK.

Это работа для меня.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.