Як встановити Android SDK Build Tools в командному рядку?


292

Я хочу налаштувати середовище Android Dev з командного рядка і зіткнутися з такою проблемою:

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

Результатом є те, що у інструментах збирання папок нічого не потрібно, і я хочу - aapt та apkbuilder, оскільки я хочу створити apk з командного рядка без ant.

Відповіді:


479

За замовчуванням менеджер SDK з командного рядка не включає інструменти збирання у списку. Вони в категорії "застарілі". Щоб переглянути всі доступні завантаження, використовуйте

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 - номер пакета, перелічений із командою списку вище


4
Якщо у вас відсутні інструменти збирання типу 18.1.1, це правильний спосіб встановити його за допомогою командного рядка.
Cray

19
це якось відстійно, вони не згадували --allваріант в офіційних порадах . Дякую.
Олександр Малахов

4
@DanielJonker Так, так. Просто повторіть "так" команді, тобто відлуння так | android update sdk --all - інструменти фільтра --no-ui --force> / dev / null
nsg

4
echo "yes"можна скоротити echo "y", але це не працює у всіх випадках. У деяких випадках ви можете отримати більше одного запиту на отримання ліцензії, залежно від фільтра та конкретних пакетів. echo "y"відповість лише на перше підказку, але не на решту. Я намагаюся змусити це працювати з yesкомандою без успіху досі.
i4niac

3
@AlexanderMalakhov Я погоджуюся, якщо ваша хост ОС має утиліту, використання її - найкращий варіант. Я спочатку подивився на очікування, але в моєму випадку мені доведеться запустити сценарій на певному дистрибутиві Linux, який працює в хмарі AWS. Цей дистрибутив не передбачає встановлення, і я не маю достатньо прав, щоб встановити його як частину плану складання. Озирнувшись, найкраще рішення, яке я знайшов, - це <pre> <code> # оновити Android SDK на безголовому сервері FILTER = інструмент, платформа та android-20 (сон 5 &&, поки [1]; спати 1; відлуння у; зроблено ) \ | android update 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варіантів?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

2
Я згоден, набагато краще використовувати рядок, а не число, яке не фіксується.
wisbucky

1
Я шукав цей --extendedваріант, щоб я міг написати сценарій і використовувати його на своєму сервері безперервної інтеграції, де він може оновити ресурси sdk. Гарна порада!
osayilgan

73

Версія 25.2.3 (і вище) Android SDK Toolsпакета містить новий інструмент - sdkmanager - який спрощує цю задачу встановлення build-інструментів з командного рядка.
Він знаходиться в 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 без GUI. Деякі з нас роблять це в Windows і віддають перевагу інтерфейс користувача, який працює, як і всі інші програми Windows. Це рухається назад, а не вперед
AaA

2
@AaA Це спрощує завдання установки з командного рядка . ОП чітко заявив, що він шукає рішення командного рядка , і тому ваш коментар не має значення в цьому контексті.
Олексій Липов

55

ADB Build-Tools не завантажуватиметься автоматично, командою оновлення Android 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

для старих застарілих sdks потрібно використовувати --all. наприклад, оновлення android sdk --no-ui --all --filter 27 для встановлення платформи-8
Fluke

Оскільки інсталятор SDK продовжував збої, коли я використовував графічний інтерфейс, мені довелося перейти на командний рядок, тому це справді допомогло. Дякую.
Івонна Абруроу

32

Чудовим джерелом інформації, на яку я потрапив, намагаючись встановити все, що стосується Android SDK з командного рядка, був цей Dockerfile. Всередині Dockerfile видно, що автор виконує одну команду для встановлення platform toolsта build toolsбез будь-якої іншої взаємодії. У випадку, якщо введено ОП, команда буде адаптована до:

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

Що робити, якщо я не хочу всіх пакетів? Просто хочу 21.1.0 .
ІгорГанапольський

@IgorGanapolsky Можливо, вам варто спробувати без --allпрапора
geoand

21

У мене був просто чорт часу, коли отримувати андроїд-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.)
darthmaim

Я вважаю, що говорить Ips. Google, як відомо, не підтримує їх usage()текст в курсі реальності.
not2qubit

на ubuntu я побіг: $ echo y | $ ANDROID_HOME / інструменти / оновлення для android sdk -u -a -t 27 Тепер, як підтвердити, що я був оновлений до Android 8?
Ашіш Карпе

$ ANDROID_HOME / інструменти / цільовий список андроїд | 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)
Ashish Karpe

Причина, коли я бігав: $ ANDROID_HOME / інструменти / список андроїд sdk Пакети, доступні для встановлення або оновлення: 1 1- SDK Платформа Android 8.1.0, API 27, версія 1
Ashish Karpe

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полягає в тому, що вона заповнює stdout, 'y'і практично немає затримки між надсиланням цих символів та версією, з якою мені довелося мати справу, не було жодного варіанту тайм-ауту. Це "забруднить" stdout, і сценарій не зможе скаржитися на неправильне введення. Рішення полягає у встановленні затримки між відправкою 'y'до stdout, і саме це 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

Однак він занадто повільний у бігу

Так, у мене була така ж проблема. Деякі завантаження файлів надзвичайно повільні (або, принаймні, вони були за останні пару днів). Якщо ви хочете завантажити все, що ви не можете зробити з цим.

Результатом є те, що у інструментах збирання папок нічого не потрібно, і я хочу - 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" ... Фільтр, який обмежує оновлення вказаними типами пакунків у вигляді списку, розділеного комами [платформа, система-зображення, інструмент, платформа -tool, doc, зразок, джерело]. Це також приймає ідентифікатори, повернені 'list sdk --extended'.
алеб

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


Спасибі, допоможіть зекономити мені багато часу.
utzcoz

4

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

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

Я переключив свій проект на ігрові сервіси, він попросив ліцензії набагато більше, ніж просто побудувати інструменти, тому це рішення дуже обмежене.
Нуреттін

Відчуває себе набагато детермінованішим, ніж індекси, які можуть змінюватися з часом у міру розвитку версій ...
Августин Рідінгер

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 (його наразі файл 149mb для ОС Windows). Варто зазначити, що Android видалив графічний інтерфейс sdkmanager, але має версію командного рядка sdkmanager у папці bin, яка знаходиться всередині папки інструментів.

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

Докладніше див. Офіційний документ тут

Я сподіваюся, що це допомагає. :)


4

Команда "android" застаріла.

Для інструментів командного рядка використовуйте інструменти / bin / sdkmanager та інструменти / 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) та unzip

Вирішення проблем:

якщо ви бачите Warning: Could not create settings, ви повинні мати toolsкаталог всередині cmdline-toolsкаталогу всередині ANDROID_HOME (створити його , якщо необхідно з цим точним назвою) см інструменти командного рядка Android sdkmanager завжди показують: Попередження: Не вдалося створити налаштування


2

Інструменти побудови не можна завантажувати автоматично за замовчуванням, як сказав Нейт у https://stackoverflow.com/a/19416222/1104031 публікації.

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

У 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?
схеми

1
Виправте мене, якщо я помиляюся, але здається, що цей скрипт повторно завантажує все щоразу, коли він працює. Я спробував з парам -у, але, здавалося, не вийшло: /
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.