Czy istnieje sposób na zautomatyzowanie instalacji systemu Android SDK?

Odpowiedzi:

392

AKTUALIZACJA

Najnowsze wersje wprowadzają sdkmanagernarzędzie wiersza polecenia, które pozwala wyświetlać, instalować, aktualizować i odinstalowywać pakiety dla zestawu Android SDK.

sdkmanagerNarzędzie jest w Android SDK Tools opakowaniu ( 25.2.3 i wyższe ) i znajduje się w 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.

więc, aby zaktualizować uruchomione pakiety

$ sdkmanager --update

zaakceptować licencje

$ yes | sdkmanager --licenses

STARA ODPOWIEDŹ

(Uwaga: polecenie systemu Android jest przestarzałe!)

Prawdopodobnie bliżej automatyzacji jest:

$ android update sdk --no-ui

Android zapewnia następujące opcje automatycznych aktualizacji:

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

Jeśli chcesz wyświetlić listę pakietów dostępnych do instalacji, możesz użyć

$ android list sdk

a otrzymasz na przykład uporządkowaną listę paczek

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

Możesz także ograniczyć aktualizację tylko do żądanego komponentu, jeśli skorzystasz z tej --filteropcji

$ android update sdk --filter <component> --no-ui

gdzie komponent jest jednym lub więcej z nich

  • liczby zwrócone przez android list sdk(tj. 1 , znany również jako indeks pakietu )
  • dodatek
  • dok
  • dodatkowy
  • Platforma
  • narzędzie platformy
  • próba
  • źródło
  • obraz systemu
  • narzędzie

lub może być jednym lub więcej szczegółowymi identyfikatorami. Na przykład, jeśli chcesz pobrać mały zestaw określonych pakietów, możesz to zrobić:

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

a dostaniesz tylko narzędzia platformy, interfejs API na poziomie 16 i słoik z pakietem wsparcia. Jest to bardzo przydatne, jeśli budujesz tylko maszynę do kompilacji i musiałbyś zapłacić za pobranie wszystkich dodatkowych rzeczy, których nigdy nie użyjesz.

Aby zobaczyć dostępne opcje, możesz na przykład użyć --help

$ 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]
Diego Torres Milano
źródło
1
Dostaję te wszystkie zewnętrzne monity „Uwierzytelnianie witryny”, w których muszę nacisnąć Enter, aby kontynuować / pominąć, czy jest sposób, aby się ich pozbyć?
Somatik
2
Nie widzę „android.exe” dla zestawu Windows SDK - jak zautomatyzować instalację i konfigurację zestawu SDK w systemie Windows?
Trevor Sullivan
1
Pamiętaj, że jeśli pakiet jest już zainstalowany, pojawia się bezsensowny błąd, taki jak Error: Ignoring unknown package filter 'tools'lub Error: Ignoring unknown package filter 'android-17'.
Ivan Vučica,
32
Aby automatycznie zaakceptować licencję, następna wersja doda --accept-licenseflagę. Tymczasem możeszecho "y" | android update sdk --no--ui
Snicolas
2
@Snicolas Napisałem plik makefile, który używa „spodziewaj się”, aby automatycznie akceptować na razie umowy licencyjne. Jest na github ( github.com/ken-noland/android-autoget-makefile )
Kenneth Noland
50

To nie działało dla mnie ...

echo "y" | android ....

więc skończyłem tutaj:

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
}
'
Danb
źródło
2
Wygląda to bardzo podobnie do rozwiązania podanego tutaj: stackoverflow.com/a/6674626/3063884 ... czy wymagana jest identyfikacja ?
CJBS
2
@CJBS Nie. Doszedłem do tego samego wniosku, co facet. Gdy nauczysz się „oczekiwać”, ten wynik jest właściwie jedynym, jaki możesz wymyślić… ale dzięki za podanie atrybucji.
danb
4
Dzięki za prosty skrypt skryptowy, działa, a tak nie.
klasa
Działa to tylko po usunięciu sudo, a następnie ustaleniu ścieżki narzędzia Android.
Pellet
44

używam tego, aby zainstalować i zaktualizować SDK na 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
Elmer
źródło
Działa dobrze! Dziękuję Ci.
gilm
2
Dla mnie potrzebna była również opcja -a, aby można było znaleźć wszystkie pakiety określone w filtrze.
alfoks
16

Aby odpowiedzieć na wszystkie licencje za pomocą „y”, możesz wypróbować to w skrypcie:

(while :
do
  echo 'y'
  sleep 2
done) | android update sdk -u .....
npstr
źródło
10
Nie mogę potwierdzić, że działa. Występuje błąd brzmiący: „„ rrrrrrr ”nie jest prawidłową odpowiedzią”, dlatego wróciłem do rozwiązania ze snem pomiędzy.
npstr
5

Dla każdego, kto wciąż szuka metody pobierania wszystkich pakietów Androida, napisałem skrypt, aby to zrobić. Pobierze wszystkie nieaktualne pakiety.

#!/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

Możesz go również zobaczyć na moim repozytorium Github

Dobra:

  • Nie zależy od expect.
  • Bezgłowy.

Wady:

  • Nadal musisz ręcznie zainstalować podstawowy zestaw SDK i umieścić go androidna swojej ścieżce.
  • Skrypt działa tylko na Uniksie.
Tai Le
źródło
4

W nowszych wersjach Androida (np. 25.2.5) Powinniśmy używać sdkmanager (zamiast androidpolecenia)

Przykład instalacji pakietu:

android-sdk/tools/bin/sdkmanager "extras;android;m2repository"

Polecenie, aby uzyskać listę wszystkich dostępnych pakietów:

 android-sdk/tools/bin/sdkmanager --verbose --list

Ta strona zawiera listę linków do pobrania dla narzędzi SDK:

Oto link do dokera -Androida repozytorium open source, który może zainstalować Androida na obrazie Docker.

Odpowiedzi na te pytania można także znaleźć w odpowiedzi na pytanie SO: Automatycznie akceptuj wszystkie licencje SDK przydatne.

TmTron
źródło
3

Począwszy od wtyczki dla systemu Android w wersji 2.2.0, brakujące elementy zestawu SDK są pobierane automatycznie .

sschuberth
źródło
2
Robią to, ale licencje nie są akceptowane automatycznie, co sprawia, że ​​użycie CI jest minimalne.
eAi
Mój drugi link zawiera wyraźne instrukcje dotyczące „eksportowania licencji przez skopiowanie do katalogu zaakceptowanych licencji”. Jest to coś, co możesz łatwo zrobić dla swoich węzłów kompilacji CI.
sschuberth
0

Potrzebny był jeszcze inny skrypt do pobrania, pakiety inne niż {obsolute, source, emulator-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

Niektóre części pochodzą z innych odpowiedzi w tym wątku.

Jokester
źródło
0

Aby zautomatyzować sdkmanager.bat --licensesmonit w systemie Windows (powiedz, że instalujesz za pomocą automatyzacji infrastruktury kompilacji) ... Nie uruchamiaj go. Nie marnuj czasu, próbując wymyślić, jak do niego podłączyć y. Próbowałem; abject fail.

Raczej - uruchom go sam i zwróć uwagę, że generuje pliki do c:\android\android-sdk\licenses(tam, gdzie działasz)c:\android\android-sdk\tools\bin\sdkmanager.bat - instalator może się różnić).

Weź te pliki i umieść je w miejscu, z którego możesz je pobrać w skryptach automatycznej instalacji. Osobiście odpowiedź jest moją trucizną, więc:

# 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"}
    ...
Peter Mounce
źródło
0

Sfrustrowałem się tym i zbudowałem wtyczkę Gradle o nazwie com.quittle.setup-android-sdk, która wykryje i zainstaluje to, czego potrzebujesz. Działa w systemach Windows, OSX i Linux i nie wymaga żadnych dodatkowych zależności, jeśli tworzysz w Gradle.

Jeśli jesteś zainteresowany, możesz sprawdzić moje dokumenty tutaj: https://github.com/quittle/gradle-setup-android-sdk

quittle
źródło
-1

Dla początkującego programisty Androida, ale doświadczonego programisty Java, to naprawdę oszałamiające jest wiedzieć, JAKIE zależności, NAWET jeśli przejdziesz wszystkie powyższe koszmary. Mój kolega doradził mi korzystanie z Android Studio (opartego na Intellijskim :-) specjalniez powodu powyższych koszmarów. Postępowałem zgodnie z jego radą. Ale nie zaakceptowałem domyślnych ustawień instalacji i próbowałem zainstalować ją na moim dysku z oprogramowaniem. Okazało się, że to koszmar. Dialog SDK wydawał się zawiesić i wcale nie był intuicyjny. Właśnie dlatego tu trafiłem. Po przeczytaniu powyższego podałem Studio jeszcze raz i tym razem zaakceptowałem WSZYSTKIE ustawienia domyślne instalacji. Hej, PRESTO ... zadbałem o wszystkie zależności SDK (zgaduję, że podstawowe) w kilku dialogach bez monitu, np. Ctl-Shift-S i SKD. Dlatego poleciłbym to nowicjuszowi. Oto dowód pobrania puddingu: wprowadź opis zdjęcia tutaj

Pobrałem i zainstalowałem wersję sudio: wprowadź opis zdjęcia tutaj Wersja systemu Windows: wprowadź opis zdjęcia tutaj A potem zrobiła swoje dobre rzeczy: wprowadź opis zdjęcia tutaj

Szczerze mam nadzieję, że to zadziała dla Ciebie !!

Beezer
źródło
Później odkryłem, że nie ma to nic wspólnego z folderem, w którym jest zainstalowany. Upewnij się, że twoje połączenie internetowe i, na podstawie wniosku, serwer proxy są poprawnie skonfigurowane. W przeciwnym razie nie zobaczysz nic dostępnego do zainstalowania. To był problem.
Beezer