Gibt es eine Möglichkeit, die Installation von Android SDK zu automatisieren?

207

Jetzt muss ich das Android SDK und den AVD Manager herunterladen und installieren und dann die APIs und Tools über die Benutzeroberfläche installieren. Gibt es eine Möglichkeit, diesen Prozess zu automatisieren?

dongshengcn
quelle
Mögliches Duplikat von Wie installiere ich Android SDK Build Tools in der Kommandozeile?
Ciro Santilli 法轮功 冠状 病 六四 事件 25
Mögliches Duplikat von "android update sdk" unter kopflosem Linux
Phunehehe

Antworten:

392

AKTUALISIEREN

In den neuesten Versionen sdkmanagerwird ein Befehlszeilentool eingeführt , mit dem Sie Pakete für das Android SDK anzeigen, installieren, aktualisieren und deinstallieren können.

Das sdkmanagerTool ist im Android SDK Tools-Paket ( 25.2.3 und höher ) enthalten und befindet sich in 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.

Also, um die Pakete zu aktualisieren, laufen

$ sdkmanager --update

die Lizenzen zu akzeptieren

$ yes | sdkmanager --licenses

ALTE ANTWORT

(Bitte beachten Sie: Der Android-Befehl ist veraltet!)

Je näher Sie der Automatisierung kommen können, desto wahrscheinlicher ist:

$ android update sdk --no-ui

Android bietet diese Optionen für automatische Updates:

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

Wenn Sie auflisten möchten, welche Pakete für die Installation verfügbar sind, können Sie diese verwenden

$ android list sdk

und Sie erhalten zum Beispiel eine geordnete Liste von Paketen

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

Sie können das Update auch nur auf eine gewünschte Komponente beschränken, wenn Sie die --filterOption verwenden

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

wobei die Komponente eine oder mehrere von ist

  • die von zurückgegebenen Zahlen android list sdk(dh 1 , auch als Paketindex bekannt )
  • Erweiterung
  • doc
  • extra
  • Plattform
  • Plattform-Tool
  • Stichprobe
  • Quelle
  • System-Image
  • Werkzeug

oder kann eine oder mehrere spezifische Bezeichner sein. Wenn Sie beispielsweise nur einen kleinen Satz bestimmter Pakete herunterladen möchten, können Sie dies tun:

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

und Sie erhalten nur die Plattform-Tools, API Level 16 und Support Package Jar. Dies ist sehr praktisch, wenn Sie nur eine Build-Maschine bauen und für das Herunterladen all der zusätzlichen Dinge bezahlen müssen, die Sie niemals verwenden werden.

Um die verfügbaren Optionen anzuzeigen, können Sie beispielsweise --help verwenden

$ 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
quelle
1
Ich erhalte all diese Eingabeaufforderungen von Drittanbietern, bei denen ich die Eingabetaste drücken muss, um fortzufahren / zu überspringen. Gibt es eine Möglichkeit, diese zu entfernen?
Somatik
2
Ich sehe keine "android.exe" für das Windows SDK. Wie würden Sie die Installation und Konfiguration des SDK unter Windows automatisieren?
Trevor Sullivan
1
Beachten Sie, dass für den Fall, dass ein Paket bereits installiert ist, der unsinnige Fehler wie Error: Ignoring unknown package filter 'tools'oder angezeigt wird Error: Ignoring unknown package filter 'android-17'.
Ivan Vučica
32
Um die Lizenz automatisch zu akzeptieren, wird in der nächsten Version ein --accept-licenseFlag hinzugefügt . In der Zwischenzeit können Sieecho "y" | android update sdk --no--ui
Snicolas
2
@Snicolas Ich habe ein Makefile geschrieben, das "erwarten" verwendet, um die Lizenzvereinbarungen vorerst automatisch zu akzeptieren. Es ist auf Github ( github.com/ken-noland/android-autoget-makefile )
Kenneth Noland
50

Das hat bei mir nicht funktioniert ...

echo "y" | android ....

Also bin ich hier gelandet:

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
quelle
2
Dies sieht der hier bereitgestellten Lösung sehr ähnlich: stackoverflow.com/a/6674626/3063884 ... ist eine Zuordnung erforderlich?
CJBS
2
@ CJBS Nein. Ich kam zu dem gleichen Schluss wie dieser Typ. Sobald Sie "erwarten" gelernt haben, ist dieses Ergebnis so ziemlich das einzige, das Sie sich einfallen lassen können ... aber danke, dass Sie die Zuschreibung trotzdem bereitgestellt haben.
Danb
4
Vielen Dank für das einfache Expect-Skript, das funktioniert, während dies nicht der Fall ist.
Klasse
Dies funktionierte erst, nachdem sudo entfernt und dann der Android-Tool-Pfad repariert wurde.
Pellet
44

ich benutze dies, um das sdk auf travis-ci zu installieren und zu aktualisieren

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
quelle
Funktioniert gut! Danke dir.
Gilm
2
Für mich wurde auch die Option -a benötigt, um alle im Filter angegebenen Pakete zu finden.
Alfoks
16

Um alle Lizenzen mit 'y' zu beantworten, können Sie dies im Skript versuchen:

(while :
do
  echo 'y'
  sleep 2
done) | android update sdk -u .....
npstr
quelle
10
Ich kann dies nicht bestätigen. Ich erhalte die Fehlermeldung "'JJJJJJJ' ist keine gültige Antwort". Deshalb bin ich mit einem Schlaf dazwischen auf die Lösung zurückgefallen.
Npstr
5

Für alle, die noch nach einer Methode suchen, um alle Android-Pakete herunterzuladen, habe ich ein Skript dafür geschrieben. Es werden alle nicht veralteten Pakete heruntergeladen .

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

Sie können es auch auf meinem Github-Repo sehen

Die gute:

  • Nicht abhängig von expect.
  • Kopflos.

Die Nachteile:

  • Sie müssen das Basis-SDK noch manuell installieren und androidin Ihren Pfad einfügen.
  • Skript funktioniert nur unter Unix.
Tai Le
quelle
4

In neueren Android-Versionen (zB 25.2.5) sollten wir sdkmanager verwenden (anstelle des androidBefehls)

Beispiel für die Installation eines Pakets:

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

Befehl zum Abrufen einer Liste aller verfügbaren Pakete:

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

Diese Webseite listet Download-Links für die SDK-Tools auf:

Hier ist ein Link zu einem Open-Source-Repository Docker-Android, das Android in einem Docker-Image installieren kann.

Die Antworten finden Sie auch in dieser SO-Frage: Akzeptieren Sie automatisch alle nützlichen SDK-Lizenzen .

TmTron
quelle
3

Ab dem Android Plugin für Gradle Version 2.2.0 werden fehlende SDK-Komponenten automatisch heruntergeladen .

sschuberth
quelle
2
Sie tun dies, aber Lizenzen werden nicht automatisch akzeptiert, was die Verwendung für CI von minimaler Bedeutung macht.
eAi
Mein zweiter Link enthält explizite Anweisungen zum "Exportieren Ihrer Lizenzen durch Kopieren über das akzeptierte Lizenzverzeichnis". Dies können Sie problemlos für Ihre CI-Build-Knoten tun.
Sschuberth
0

Ich habe ein Ruby-Skript zusammengestellt, das das SDK ohne Aufforderung herunterlädt und installiert, was möglicherweise hilfreich ist. https://github.com/ayvazj/andenv

Ayvazj
quelle
0

Noch ein Skript zum Herunterladen von nur benötigten, nicht {veralteten, Quell-, Emulator-Image-, Doc} -Paketen:

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

Einige Teile stammen aus anderen Antworten in diesem Thread.

Jokester
quelle
0

So automatisieren Sie die sdkmanager.bat --licensesEingabeaufforderung unter Windows (sagen wir, Sie installieren über die Automatisierung für die Build-Infrastruktur) ... Führen Sie sie nicht aus. Verschwenden Sie keine Zeit damit, herauszufinden, wie Sie hineinpfeifen ykönnen. Ich habe es versucht; erbärmlich scheitern.

Führen Sie es lieber einmal selbst aus und beachten Sie, dass darin Dateien generiert werden c:\android\android-sdk\licenses(wo Sie ausgeführt werden c:\android\android-sdk\tools\bin\sdkmanager.bat- Ihr Installationsstamm kann variieren).

Nehmen Sie diese Dateien und platzieren Sie sie an einem Ort, an dem Sie sie in Ihren automatisierten Setup-Skripten abrufen können. Persönlich ist ansible mein Gift, also:

# 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
quelle
0

Ich war auch darüber frustriert und habe ein Gradle-Plugin namens namens erstellt com.quittle.setup-android-sdk, das erkennt und installiert, was Sie brauchen. Es funktioniert unter Windows, OSX und Linux und erfordert keine zusätzlichen Abhängigkeiten, wenn Sie mit Gradle erstellen.

Wenn Sie interessiert sind, können Sie meine Dokumente hier einsehen: https://github.com/quittle/gradle-setup-android-sdk

quittle
quelle
-1

Für einen neuen Android-Entwickler, aber einen erfahrenen Java-Entwickler, ist es wirklich verwirrend zu wissen, WELCHE Abhängigkeiten, AUCH wenn Sie alle oben genannten Albträume überwinden. Mein Kollege hat mir geraten, Android Studio (das auf Intellij basiert :-) speziell zu verwendenwegen der oben genannten Albträume. Ich folgte seinem Rat. Aber ich habe die Standardeinstellungen für die Installation nicht akzeptiert und versucht, sie auf einem meiner Software-Laufwerke zu installieren. Es stellte sich als Albtraum heraus. Der SDK-Dialog schien zu hängen und war überhaupt nicht intuitiv. Deshalb bin ich hier gelandet. Nachdem ich das Obige gelesen hatte, versuchte ich es noch einmal mit Studio und dieses Mal akzeptierte ich ALLE Standardeinstellungen für die Installation. Hey PRESTO ... es hat sich in ein paar Dialogen ohne Aufforderung um alle SDK-Abhängigkeiten gekümmert (Kernabhängigkeiten, die ich vermute), z. B. Ctl-Shift-S und SKD. Ich würde es daher einem Neuling empfehlen. Hier der Beweis für den Pudding beim Herunterladen: Geben Sie hier die Bildbeschreibung ein

Die Version von sudio, die ich heruntergeladen und installiert habe: Geben Sie hier die Bildbeschreibung ein Version von Windows: Geben Sie hier die Bildbeschreibung ein Und hier, nachdem es seine guten Sachen gemacht hat: Geben Sie hier die Bildbeschreibung ein

Mit freundlichen Grüßen hoffe es funktioniert für Sie!

Beezer
quelle
Was ich später fand, war, dass es eigentlich nichts mit dem Ordner zu tun hat, in dem es installiert ist. Stellen Sie sicher, dass Ihre Internetverbindung und der Proxy ordnungsgemäß konfiguriert sind. Andernfalls wird nichts zur Installation verfügbar sein. Das war das Problem.
Beezer