AAPT2 (Android Asset Packaging Tool) ist ein Build-Tool, das von Android Studio und dem Android Gradle-Plug-in verwendet wird, um die Ressourcen Ihrer App zu kompilieren und zu verpacken. AAPT2 parst, indexiert und kompiliert die Ressourcen in ein binäres Format, das für die Android-Plattform optimiert ist.
In Android-Gradle-Plug-in 3.0.0 und höher ist AAPT2 standardmäßig aktiviert. Normalerweise müssen Sie aapt2 nicht selbst aufrufen. Wenn Sie jedoch lieber Ihr Terminal und Ihr eigenes Buildsystem anstelle von Android Studio verwenden möchten, können Sie AAPT2 über die Befehlszeile nutzen. Sie können Build-Fehler im Zusammenhang mit AAPT2 auch über die Befehlszeile beheben. Dazu finden Sie AAPT2 als eigenständiges Tool in den Android SDK Build Tools ab Version 26.0.2.
Wenn Sie die Android SDK Build Tools über die Befehlszeile herunterladen möchten, verwenden Sie sdkmanager und führen Sie den folgenden Befehl aus:
sdkmanager "build-tools;build-tools-version"
Nachdem Sie die SDK-Build-Tools heruntergeladen haben, finden Sie AAPT2 unter android_sdk/build-tools/version/.
Da Revisionen der Android SDK Build Tools nicht oft veröffentlicht werden, ist die in Ihren SDK Build Tools enthaltene Version von AAPT2 möglicherweise nicht die neueste. Die aktuelle Version von AAPT2 kann aus Google Maven heruntergeladen werden.
Wenn Sie AAPT2 über die Befehlszeile unter Linux oder Mac verwenden möchten, führen Sie den Befehl aapt2 aus.
Führen Sie unter Windows den Befehl aapt2.exe aus.
AAPT2 unterstützt die schnellere Kompilierung von Ressourcen durch die Möglichkeit der inkrementellen Kompilierung. Für die inkrementelle Kompilierung wird die Ressourcenverarbeitung in zwei Schritte unterteilt:
- Kompilieren: Kompiliert Ressourcendateien in binäre Formate.
- Link: Alle kompilierten Dateien werden zusammengeführt und in einem einzigen Paket verpackt.
Diese Trennung trägt dazu bei, die Leistung für inkrementelle Builds zu verbessern. Wenn beispielsweise Änderungen an einer einzelnen Datei vorgenommen wurden, müssen Sie nur diese Datei neu kompilieren.
AAPT2 von Google Maven herunterladen
Wenn Sie die neueste Version von AAPT2 verwenden möchten, die nicht in den Build-Tools enthalten ist, laden Sie AAPT2 aus dem Maven-Repository von Google herunter:
- Rufen Sie im Repository-Index com.android.tools.build > aapt2 auf.
- Kopieren Sie den Namen der neuesten Version von AAPT2.
Fügen Sie den kopierten Versionsnamen in die folgende URL ein und geben Sie Ihr Zielbetriebssystem an: https://dl.google.com/dl/android/maven2/com/android/tools/build/aapt2/ aapt2-version/aapt2-aapt2-version- [windows | linux | osx].jar
Wenn Sie beispielsweise die Version 3.2.0-alpha18-4804415 für Windows herunterladen möchten, verwenden Sie folgenden Link: https://dl.google.com/dl/android/maven2/com/android/tools/build/aapt2/ 3.2.0-alpha18-4804415/aapt2-3.2.0-alpha18-4804415-windows.jar
Rufen Sie die URL in einem Browser auf. Der Download von AAPT2 beginnt in Kürze.
Entpacken Sie die JAR-Datei, die Sie gerade heruntergeladen haben.
Die JAR-Datei sollte eine ausführbare Datei
aapt2und einige Bibliotheken enthalten, von denen die ausführbare Datei abhängt.
Kompilieren
AAPT2 unterstützt die Kompilierung aller Android-Ressourcentypen, z. B. Drawables und XML-Dateien. Wenn Sie AAPT2 für die Kompilierung aufrufen, übergeben Sie pro Aufruf eine einzelne Ressourcendatei als Eingabe. AAPT2 parst die Datei und generiert eine binäre Zwischendatei mit der Erweiterung .flat.
Wenn Sie ganze Verzeichnisse übergeben, kompiliert AAPT2 alle Dateien im Verzeichnis neu, auch wenn sich nur eine Ressource geändert hat. Sie können zwar mit dem Flag --dir Ressourcenverzeichnisse mit mehr als einer Ressourcendatei an AAPT2 übergeben, aber so profitieren Sie nicht von der inkrementellen Ressourcenkompilierung.
Die Ausgabedateitypen können je nach Eingabe für die Kompilierung variieren, wie in der folgenden Tabelle dargestellt:
Tabelle 1 Die Ein- und Ausgabedateitypen für die Kompilierung
| Eingabe | Ausgabe |
|---|---|
XML-Ressourcendateien wie String und Style im Verzeichnis res/values/
|
Ressourcentabelle mit *.arsc.flat als Erweiterung.
|
| Alle anderen Ressourcendateien. |
Alle Dateien außer den Dateien im Verzeichnis
Außerdem werden alle PNG-Dateien standardmäßig komprimiert und erhalten die Endung |
Die von AAPT2 ausgegebenen Dateien sind keine ausführbaren Dateien. Sie müssen diese Binärdateien später als Eingabe in die Link-Phase einfügen, um ein APK zu generieren. Die generierte APK-Datei ist jedoch keine ausführbare Datei, die Sie sofort auf einem Android-Gerät bereitstellen können, da sie keine DEX-Dateien enthält und nicht signiert ist.
Syntax kompilieren
Die allgemeine Syntax für die Verwendung von compile lautet so:
aapt2 compile path-to-input-files [options] -o output-directory/
Im folgenden Beispiel kompiliert AAPT2 die Ressourcendateien mit den Namen values.xml und myImage.png einzeln:
aapt2 compile project_root/module_root/src/main/res/values-en/strings.xml -o compiled/ aapt2 compile project_root/module_root/src/main/res/drawable/myImage.png -o compiled/
Wie in Tabelle 1 gezeigt, hängt der Name der Ausgabedatei vom Namen der Eingabedatei und des übergeordneten Verzeichnisses ab.
Im vorherigen Beispiel mit der Datei strings.xml als Eingabe benennt aapt2 die Ausgabedatei automatisch als values-en_strings.arsc.flat. Die kompilierte Drawable-Datei im Drawable-Verzeichnis heißt jedoch drawable_img.png.flat.
Kompilierungsoptionen
Mit dem Befehl compile können Sie verschiedene Optionen verwenden, wie in Tabelle 2 dargestellt:
Tabelle 2 Optionen für den Compile-Befehl
| Option | Beschreibung |
|---|---|
-o path
|
Gibt den Ausgabepfad für die kompilierten Ressourcen an. Dies ist ein erforderliches Flag, da Sie einen Pfad zu einem Verzeichnis angeben müssen, in dem AAPT2 die kompilierten Ressourcen ausgeben und speichern kann. |
--dir directory
|
Gibt das Verzeichnis an, in dem nach Ressourcen gesucht werden soll. Sie können dieses Flag zwar verwenden, um mehrere Ressourcendateien mit einem Befehl zu kompilieren, aber dadurch werden die Vorteile der inkrementellen Kompilierung deaktiviert. Daher sollte dieses Flag nicht für große Projekte verwendet werden. |
--pseudo-localize
|
Generiert pseudolokalisierte Versionen von Standard-Strings wie en-XA und en-XB.
|
--no-crunch
|
Deaktiviert die PNG-Verarbeitung.
Verwenden Sie diese Option, wenn Sie die PNG-Dateien bereits verarbeitet haben oder wenn Sie Debug-Builds erstellen, bei denen die Dateigröße nicht reduziert werden muss. Wenn Sie diese Option aktivieren, wird die Ausführung beschleunigt, die Ausgabedatei wird aber größer. |
--legacy
|
Behandelt Fehler, die bei der Verwendung früherer Versionen von AAPT zulässig sind, als Warnungen.
Dieses Flag sollte für unerwartete Kompilierungszeitfehler verwendet werden. Informationen zum Beheben bekannter Verhaltensänderungen, die bei der Verwendung von AAPT2 auftreten können, finden Sie unter Verhaltensänderungen bei der Verwendung von AAPT2. |
-zip file
|
file ist eine ZIP-Datei, die das Verzeichnis res enthält, in dem nach Ressourcen gesucht werden soll.
|
-output-text-symbols file
|
Generiert eine Textdatei mit den Ressourcensymbolen in der angegebenen |
-preserve-visibility-of-styleables
|
Falls angegeben, werden dieselben Sichtbarkeitsregeln für formatierbare Elemente angewendet, die für alle anderen Ressourcen verwendet werden. Andernfalls werden alle stylebaren Elemente öffentlich gemacht. |
-visibility [public|private|default|]
|
Legt die Sichtbarkeit der kompilierten Ressourcen auf die angegebene Ebene fest. |
-trace-folder folder
|
Generiert ein systrace-JSON-Trace-Fragment für den angegebenen |
-source-path path
|
Legt den Quellpfad der kompilierten Ressourcendatei auf |
-h
|
Zeigt die Hilfe für die Tools an. |
-v
|
Aktiviert das ausführliche Logging. |
Link
In der Link-Phase führt AAPT2 alle Zwischendateien zusammen, die in der Kompilierungsphase generiert werden, z. B. Ressourcentabellen, binäre XML-Dateien und verarbeitete PNG-Dateien. Anschließend werden die Dateien in einem einzelnen APK verpackt. Außerdem können in dieser Phase andere Hilfsdateien wie R.java und ProGuard-Regeldateien generiert werden. Das generierte APK enthält jedoch keinen DEX-Bytecode und ist nicht signiert. Sie können dieses APK nicht auf einem Gerät bereitstellen.
Wenn Sie das Android-Gradle-Plug-in nicht verwenden, um Ihre App über die Befehlszeile zu erstellen, können Sie andere Befehlszeilentools wie d8 verwenden, um Java-Bytecode in DEX-Bytecode zu kompilieren, und apksigner, um Ihr APK zu signieren.
Link-Syntax
Die allgemeine Syntax für die Verwendung von link lautet so:
aapt2 link path-to-input-files [options] -o outputdirectory/outputfilename.apk --manifest AndroidManifest.xml
Im folgenden Beispiel führt AAPT2 zwei Zwischendateien, drawable_Image.flat und values_values.arsc.flat, sowie die Datei AndroidManifest.xml zusammen. AAPT2 verknüpft das Ergebnis mit der Datei android.jar, die die im Paket android definierten Ressourcen enthält:
aapt2 link -o output.apk
-I android_sdk/platforms/android_version/android.jar
compiled/res/values_values.arsc.flat
compiled/res/drawable_Image.flat --manifest /path/to/AndroidManifest.xml -v
Linkoptionen
Mit dem Befehl link können Sie die folgenden Optionen verwenden:
Tabelle 3 Optionen für den Link-Befehl
| Option | Beschreibung |
|---|---|
-o path
|
Gibt den Ausgabepfad für die APK der verknüpften Ressource an. Dies ist ein erforderliches Flag, da Sie den Pfad für das Ausgabepaket angeben müssen, das die verknüpften Ressourcen enthalten kann. |
--manifest file
|
Gibt den Pfad zur Android-Manifestdatei an, die erstellt werden soll. Dies ist ein erforderlicher Flag, da die Manifestdatei wichtige Informationen zu Ihrer App enthält, z. B. den Paketnamen und die Anwendungs-ID. |
-I
|
Gibt den Pfad zum android in Ihren Ressourcendateien verwenden.
|
-A directory
|
Gibt ein Assets-Verzeichnis an, das im APK enthalten sein soll.
In diesem Verzeichnis können Sie Originaldateien speichern, die nicht verarbeitet wurden. Weitere Informationen finden Sie unter Auf Originaldateien zugreifen. |
-R file
|
Übergibt eine einzelne .flat-Datei an link und verwendet dabei die overlay-Semantik, ohne das <add-resource>-Tag zu verwenden.
Wenn Sie eine Ressourcendatei angeben, die eine vorhandene Datei überschreibt, wird die letzte in Konflikt stehende Ressource verwendet. |
--package-id package-id
|
Gibt die Paket-ID an, die für Ihre App verwendet werden soll.
Die angegebene Paket-ID muss größer oder gleich 0x7f sein, sofern sie nicht in Kombination mit |
--allow-reserved-package-id
|
Ermöglicht die Verwendung einer reservierten Paket-ID. Reservierte Paket-IDs sind IDs, die normalerweise gemeinsam genutzten Bibliotheken zugewiesen werden und im Bereich von 0x02 bis einschließlich 0x7e liegen. Mit Diese Option sollte nur für Pakete mit einer |
--java directory
|
Gibt das Verzeichnis an, in dem R.java generiert werden soll.
|
--proguard proguard_options
|
Generiert die Ausgabedatei für ProGuard-Regeln. |
--proguard-conditional-keep-rules
|
Generiert die Ausgabedatei für ProGuard-Regeln für den Haupt-DEX. |
--no-auto-version
|
Deaktiviert die automatische Versionsverwaltung des Style- und Layout-SDK. |
--no-version-vectors
|
Deaktiviert die automatische Versionsverwaltung von Vektordrawables. Verwenden Sie dieses Flag nur, wenn Sie Ihr APK mit der Vector Drawable Library erstellen. |
--no-version-transitions
|
Deaktiviert die automatische Versionsverwaltung von Übergangsressourcen. Verwenden Sie dieses Flag nur, wenn Sie Ihr APK mit der Transition Support Library erstellen. |
--no-resource-deduping
|
Deaktiviert die automatische Deduplizierung von Ressourcen mit identischen Werten in kompatiblen Konfigurationen. |
--enable-sparse-encoding
|
Ermöglicht die spärliche Codierung von Ressourceneinträgen. Dies führt zu einer Verringerung der APK-Größe, der Arbeitsspeichernutzung und der Startlatenz sowie zu einer geringen Erhöhung der einzelnen Ressourcensuchzeit nach dem Start. |
-z
|
Erfordert die Lokalisierung von Strings, die als „Vorschlag“ gekennzeichnet sind. |
-c config
|
Gibt eine durch Kommas getrennte Liste von Konfigurationen an.
Wenn Sie beispielsweise Abhängigkeiten von der Support-Bibliothek haben, die Übersetzungen für mehrere Sprachen enthält, können Sie Ressourcen nur für die angegebene Sprachkonfiguration filtern, z. B. Englisch oder Spanisch. Sie müssen die Sprachkonfiguration mit einem zweistelligen ISO 639-1-Sprachcode definieren, dem optional ein zweistelliger ISO 3166-1-Alpha-2-Regionscode vorangestellt werden kann, der mit einem Kleinbuchstaben „r“ beginnt. Beispiel: en-rUS. |
--preferred-density density
|
Ermöglicht es AAPT2, die am besten passende Dichte auszuwählen und alle anderen zu entfernen.
In Ihrer App können Sie verschiedene Qualifizierer für die Pixeldichte verwenden, z. B. „ldpi“, „hdpi“ und „xhdpi“. Wenn Sie eine bevorzugte Dichte angeben, wählt AAPT2 die am besten passende Dichte aus, speichert sie in der Ressourcentabelle und entfernt alle anderen. |
--output-to-dir
|
Gibt den APK-Inhalt in ein Verzeichnis aus, das durch -o angegeben wird.
Wenn Sie bei Verwendung dieses Flags Fehler erhalten, können Sie diese beheben, indem Sie ein Upgrade auf Android SDK Build Tools 28.0.0 oder höher durchführen. |
--min-sdk-version min-sdk-version
|
Legt die standardmäßige Mindest-SDK-Version für AndroidManifest.xml fest.
|
--target-sdk-version target-sdk-version
|
Legt die Standard-SDK-Zielversion fest, die für AndroidManifest.xml verwendet werden soll.
|
--version-code version-code
|
Gibt den Versionscode an, der in AndroidManifest.xml eingefügt werden soll, wenn keiner vorhanden ist.
|
--version-name version-name
|
Gibt den Versionsnamen an, der in AndroidManifest.xml eingefügt werden soll, wenn keiner vorhanden ist.
|
--revision-code revision-code
|
Gibt den Revisionscode an, der in die Datei AndroidManifest.xml eingefügt werden soll, wenn keiner vorhanden ist.
|
--replace-version
|
Wenn --version-code, --version-name oder --revision-code angegeben sind, werden alle Werte im Manifest durch diese Werte ersetzt. Standardmäßig ändert sich nichts, wenn diese Attribute bereits im Manifest definiert sind.
|
--compile-sdk-version-nacodeme compile-sdk-version-name
|
Gibt den Versionscode an, der in die Datei AndroidManifest.xml eingefügt werden soll, wenn keiner vorhanden ist.
|
--compile-sdk-version-name compile-sdk-version-name
|
Gibt den Versionsnamen an, der in die Datei AndroidManifest.xml eingefügt werden soll, wenn keiner vorhanden ist.
|
--proto-format
|
Generiert kompilierte Ressourcen im Protobuf-Format.
Geeignet als Eingabe für die
|
--non-final-ids
|
Generiert R.java mit nicht endgültigen Ressourcen-IDs. Verweise auf die IDs aus dem App-Code werden während der kotlinc- oder javac-Kompilierung nicht inline eingefügt.
|
--emit-ids path
|
Gibt eine Datei mit einer Liste der Namen von Ressourcentypen und deren ID-Zuweisungen am angegebenen Pfad aus. Diese Option eignet sich für die Verwendung mit --stable-ids.
|
--stable-ids outputfilename.ext
|
Verarbeitet die mit --emit-ids generierte Datei mit der Liste der Namen von Ressourcentypen und ihren zugewiesenen IDs.
Mit dieser Option bleiben zugewiesene IDs stabil, auch wenn Sie beim Verknüpfen neue Ressourcen hinzufügen oder vorhandene löschen. |
--custom-package package_name
|
Gibt das benutzerdefinierte Java-Paket an, in dem R.java generiert werden soll.
|
--extra-packages package_name
|
Generiert dieselbe R.java-Datei, aber mit unterschiedlichen Paketnamen.
|
--add-javadoc-annotation annotation
|
Fügt allen generierten Java-Klassen eine JavaDoc-Annotation hinzu. |
--output-text-symbols path
|
Generiert eine Textdatei mit den Ressourcensymbolen der Klasse R in der angegebenen Datei.
Sie müssen den Pfad zur Ausgabedatei angeben. |
--auto-add-overlay
|
Ermöglicht das Hinzufügen neuer Ressourcen in Overlays, ohne das <add-resource>-Tag zu verwenden.
|
--rename-manifest-package manifest-package
|
Benennt das Paket in der Datei AndroidManifest.xml um.
|
--rename-instrumentation-target-package instrumentation-
target-package
|
Ändert den Namen des Zielpakets für
instrumentation.
Diese Option sollte in Verbindung mit |
-0 extension
|
Gibt die Endungen von Dateien an, die nicht komprimiert werden sollen. |
--split path:config[,config[..]]
|
Teilt Ressourcen basierend auf einer Reihe von Konfigurationen auf, um eine andere Version des APK zu generieren.
Sie müssen den Pfad zum Ausgabepaket zusammen mit den Konfigurationen angeben. |
--proguard-main-dex file
|
Ausgabedatei für generierte ProGuard-Regeln für den Haupt-DEX. |
--proguard-minimal-keep-rules
|
Generiert eine minimale Gruppe von ProGuard-Keep-Regeln. |
--no-resource-removal
|
Deaktiviert das automatische Entfernen von Ressourcen ohne Standardwerte. Verwenden Sie diese Option nur, wenn Sie Laufzeit-Ressourcen-Overlay-Pakete erstellen. |
-x
|
Legacy-Flag, das die Verwendung der Paketkennung 0x01 angibt. |
--product products-list
|
Gibt eine durch Kommas getrennte Liste der beizubehaltenden Produktnamen an. |
--no-xml-namespaces
|
Entfernt das XML-Namespace-Präfix und die URI-Informationen aus der Datei AndroidManifest.xml und den XML-Binärdateien in res/*.
|
--shared-lib
|
Generiert eine gemeinsam genutzte Android-Laufzeitbibliothek. |
--static-lib
|
Generiert eine statische Android-Bibliothek. |
--no-static-lib-packages
|
Führt alle Bibliotheksressourcen unter dem Paket der App zusammen. |
--no-proguard-location-reference
|
Verhindert, dass ProGuard-Regeldateien einen Verweis auf die Quelldatei enthalten. |
--private-symbols package-name
|
package-name gibt den Paketnamen an, der beim Generieren von R.java für private Symbole verwendet werden soll. Wenn nicht angegeben, verwenden öffentliche und private Symbole den Paketnamen der App.
|
--override-styles-instead-of-overlaying
|
Bewirkt, dass in -R-Ressourcen definierte Stile vorherige Definitionen ersetzen, anstatt sie zusammenzuführen.
|
--rename-resources-package package-name
|
Benennt das Paket in der Ressourcentabelle in package-name um. |
--no-compress
|
Es werden keine Ressourcen komprimiert. |
--keep-raw-values
|
Behält Rohattributwerte in XML-Dateien bei. |
--no-compress-regex regular-expression
|
Erweiterungen, die mit regular-expression übereinstimmen, werden nicht komprimiert.
Verwenden Sie das Symbol $ für das Zeilenende. Verwendet eine ECMAScript-Grammatik für reguläre Ausdrücke, bei der die Groß-/Kleinschreibung beachtet wird.
|
--warn-manifest-validation
|
Behandelt Manifestvalidierungsfehler als Warnungen. |
--exclude-configs qualifier[,qualifier[..]]
|
Schließt Werte von Ressourcen aus, deren Konfigurationen die angegebenen Qualifizierer enthalten. |
--debug-mode
|
Fügt android:debuggable="true" in den Anwendungsknoten des Manifests ein, sodass die Anwendung auch auf Produktionsgeräten debuggt werden kann.
|
--strict-visibility
|
Es sind keine Overlays mit unterschiedlichen Sichtbarkeitsebenen möglich. |
--exclude-sources
|
Serialisiert keine Informationen zur Quelldatei, wenn Ressourcen im Protobuf-Format generiert werden. |
--trace-folder folder
|
Generiert das systrace-JSON-Trace-Fragment für den angegebenen folder.
|
--merge-only
|
Die Ressourcen werden nur zusammengeführt, ohne Ressourcenreferenzen zu prüfen. Dieses Flag sollte nur mit dem Flag --static-lib verwendet werden.
|
-h
|
Zeigt das Hilfemenü an. |
-v
|
Ermöglicht eine ausführlichere Ausgabe. |
Erfassen
dump wird verwendet, um Informationen zum APK auszugeben, das Sie mit dem Befehl link generiert haben.
Dump-Syntax
Die allgemeine Syntax für die Verwendung von dump lautet so:
aapt2 dump sub-command filename.apk [options]
Im folgenden Beispiel wird der Inhalt der Ressourcentabelle des angegebenen APK ausgegeben:
aapt2 dump resources output.apk
Unterbefehle für „dump“
Geben Sie mit dem Befehl dump einen der folgenden Unterbefehle an:
Tabelle 4. Unterbefehle für „dump“
| Unterbefehl | Beschreibung |
|---|---|
apc
|
Gibt den Inhalt des AAPT2-Containers (APC) aus, der während der Kompilierung generiert wurde. |
badging
|
Gibt Informationen aus dem Manifest der APK aus. |
configurations
|
Gibt jede Konfiguration aus, die von einer Ressource im APK verwendet wird. |
overlayable
|
Gibt die überlagerbaren Ressourcen des APKs aus. |
packagename
|
Gibt den Paketnamen des APK aus. |
permissions
|
Gibt die Berechtigungen aus, die aus dem Manifest der APK extrahiert wurden. |
strings
|
Gibt den Inhalt des String-Pools der Ressourcentabelle der APK aus. |
styleparents
|
Gibt die übergeordneten Elemente der im APK verwendeten Stile aus. |
resources
|
Gibt den Inhalt der Ressourcentabelle des APK aus. |
xmlstrings
|
Gibt Strings aus dem kompilierten XML der APK aus. |
xmltree
|
Gibt eine Struktur des kompilierten XML der APK aus. |
Dump-Optionen
Verwenden Sie die folgenden Optionen mit dump:
Tabelle 5. Dump-Optionen
| Option | Beschreibung |
|---|---|
--no-values
|
Unterdrückt die Ausgabe von Werten bei der Anzeige von Ressourcen. |
--file file
|
Gibt eine Datei als Argument an, die aus dem APK extrahiert werden soll. |
-v
|
Erhöht die Ausführlichkeit der Ausgabe. |
Unterschied
Mit diff können Sie zwei APKs vergleichen und Unterschiede zwischen ihnen ermitteln.
Diff-Syntax
Die allgemeine Syntax für die Verwendung von diff lautet so:
aapt2 diff first.apk second.apk
Für den Befehl diff gibt es keine Optionen.
Optimieren
Mit optimize werden Optimierungen für die zusammengeführten Ressourcen und resources.arsc ausgeführt, bevor sie in das APK gepackt werden. Durch diese Optimierung kann die APK-Größe je nach Größe und Anzahl der verwendeten Ressourcen um etwa 1–3 % reduziert werden.
Syntax optimieren
Die allgemeine Syntax für die Verwendung von optimize lautet so:
aapt2 optimize options file[,file[..]]
Im folgenden Beispiel werden die Ressourcen in input.apk optimiert und ein neues, optimiertes APK in output.apk erstellt. Sie ersetzt die übliche flache Tabellendarstellung durch eine kompaktere Darstellung, was zu einer Verkleinerung der APK-Größe, einer Reduzierung der Speichernutzung und der Startlatenz sowie zu einer geringfügigen Erhöhung der einzelnen Ressourcensuchzeit nach dem Start führt.
aapt2 optimize -o output.apk --enable-sparse-encoding input.apk
Optionen für die Optimierung
Sie können die folgenden Optionen mit optimize verwenden:
Tabelle 6. Optionen für die Optimierung
| Option | Beschreibung |
|---|---|
-o path
|
Gibt den Ausgabepfad für die APK der verknüpften Ressource an.
Dies ist ein erforderliches Flag, da Sie den Pfad für das Ausgabepaket angeben müssen, das die verknüpften Ressourcen enthalten kann. |
-d directory
|
Gibt den Pfad zum Ausgabeverzeichnis für Splits an. |
-x path
|
Gibt den Pfad zur XML-Konfigurationsdatei an. |
-p
|
Gibt die Multi-APK-Artefakte aus und beendet den Vorgang. |
--target-densities density[,density[..]]
|
Gibt eine durch Kommas getrennte Liste der Bildschirmdichten an, für die das APK optimiert ist. Alle Ressourcen, die auf Geräten mit den angegebenen Dichten nicht verwendet werden, werden aus dem APK entfernt. |
--resources-config-path path
|
Gibt den Pfad zur Format: type/resource_name#[directive][,directive] |
-c config[,config[..]]
|
Gibt eine durch Kommas getrennte Liste der Konfigurationen an, die eingeschlossen werden sollen. Standardmäßig sind alle Konfigurationen ausgewählt. |
--split path:config[,config[..]]
|
Teilt Ressourcen basierend auf einer Reihe von Konfigurationen auf, um eine andere Version des APK zu generieren.
Sie müssen den Pfad zum Ausgabepaket zusammen mit den Konfigurationen angeben. |
--keep-artifacts artifact[,artifact[..]]
|
Gibt eine durch Kommas getrennte Liste der beizubehaltenden Artefakte an. Wenn keine angegeben sind, werden alle Artefakte beibehalten. |
--enable-sparse-encoding
|
Ermöglicht die spärliche Codierung von Ressourceneinträgen. Dies führt zu einer Verringerung der APK-Größe, der Arbeitsspeichernutzung und der Startlatenz sowie zu einer geringen Erhöhung der einzelnen Ressourcensuchzeit nach dem Start. |
--collapse-resource-names
|
Fasst Ressourcennamen im Schlüsselstringpool zu einem einzelnen Wert zusammen.
Ressourcen werden mit der Anweisung no_collapse in einer Datei, die durch --resources-config-path angegeben wird, ausgenommen.
|
--shorten-resource-paths
|
Kürzt die Pfade von Ressourcen im APK. |
--resource-path-shortening-map path
|
Gibt den Pfad an, in dem die Zuordnung der alten Ressourcenpfade zu verkürzten Pfaden ausgegeben werden soll. |
-v
|
Erhöht die Ausführlichkeit der Ausgabe. |
-h
|
Zeigt die Tool-Hilfe an. |
Umwandeln
Standardmäßig kompiliert der AAPT-Befehl compile Ressourcen in ein binäres Format, das für APKs geeignet ist. Sie können auch das Protobuf-Format angeben, das für AABs geeignet ist, indem Sie --proto-format angeben. Mit dem Befehl convert werden APKs zwischen den beiden Formaten konvertiert.
Syntax umstellen
Die allgemeine Syntax für convert lautet so:
aapt2 convert -o output-file options file[,file[..]]
Im folgenden Beispiel werden die Ressourcen in input.apk konvertiert und ein neues APK in output.apk mit Ressourcen im Protobuf-Format erstellt. Sie ersetzt die übliche Darstellung in einer flachen Tabelle durch eine kompaktere Darstellung. Dadurch werden APK-Größe, Arbeitsspeichernutzung und Startlatenz reduziert und die
aapt2 convert -o output.apk --output-format proto --enable-sparse-encoding input.apk
Konvertierungsoptionen
Verwenden Sie die folgenden Optionen mit convert:
Tabelle 7. Konvertierungsoptionen
| Option | Beschreibung |
|---|---|
-o path
|
Gibt den Ausgabepfad für die APK der verknüpften Ressource an. Dies ist ein erforderliches Flag, da Sie den Pfad für das Ausgabepaket angeben müssen, das die verknüpften Ressourcen enthalten kann. |
--output-format [proto|binary]
|
Format der Ausgabe. Zulässige Werte sind proto und binary. Wenn nichts anderes festgelegt wird, wird standardmäßig binary verwendet.
|
--enable-sparse-encoding
|
Ermöglicht die spärliche Codierung von Ressourceneinträgen. Dies führt zu einer Verringerung der APK-Größe, der Arbeitsspeichernutzung und der Startlatenz sowie zu einer geringen Erhöhung der einzelnen Ressourcensuchzeit nach dem Start. |
--keep-raw-values
|
Behält Rohattributwerte in XML-Dateien bei. |
-v
|
Erhöht die Ausführlichkeit der Ausgabe. |
-h
|
Zeigt die Tool-Hilfe an. |
Daemon-Modus
Mit AAPT-Version 2.19 wurde der Daemon-Modus für die Ausführung von Befehlen eingeführt. Im Daemon-Modus können Sie mehrere Befehle in einer einzigen AAPT-Sitzung eingeben.
Daemon-Syntax
Starten Sie den Daemon-Modus mit dem folgenden Befehl:
aapt2 daemon
Sobald der Daemon-Modus ausgeführt wird, können Sie Befehle eingeben. Jedes Argument des Befehls muss in einer separaten Zeile stehen. Am Ende des Befehls muss eine leere Zeile eingefügt werden. Beenden Sie den Daemon-Modus mit Strg+D.
Beachten Sie die folgenden einzelnen compile-Befehle:
aapt2 compile project_root/module_root/src/main/res/values-en/strings.xml -o compiled/ aapt2 compile project_root/module_root/src/main/res/drawable/myImage.png -o compiled/
Diese Befehle können im Daemon-Modus so eingegeben werden:
aapt2 daemon Ready compile project_root/module_root/src/main/res/values-en/strings.xml -o compiled/ Done compile project_root/module_root/src/main/res/drawable/myImage.png -o compiled/ Done ^D Exiting daemon
Optionen für den Daemon-Modus
Die einzige Option für den Daemon-Modus ist --trace-folder folder. Dadurch wird ein systrace-JSON-Trace-Fragment für den angegebenen folder generiert.
Version
Ermitteln Sie die Version von AAPT2, die Sie verwenden, mit dem Befehl version:
aapt2 version Android Asset Packaging Tool (aapt) 2.19-8678579
Verhaltensänderungen bei Verwendung von AAPT2
Vor AAPT2 war AAPT die Standardversion des Android Asset Packaging Tool, das jetzt verworfen wurde. AAPT2 sollte sofort mit älteren Projekten funktionieren. In diesem Abschnitt werden jedoch einige Verhaltensänderungen beschrieben, die Sie beachten sollten.
Elementhierarchien im Android-Manifest
In früheren Versionen von AAPT wurden Elemente, die in der Datei AndroidManifest.xml in falschen Knoten verschachtelt waren, entweder ignoriert oder es wurde eine Warnung ausgegeben.
Betrachten Sie beispielsweise das folgende Beispiel:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myname.myapplication"> <application ... <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <action android:name="android.intent.action.CUSTOM" /> </activity> </application> </manifest>
In früheren Versionen von AAPT wurde das falsch platzierte <action>-Tag einfach ignoriert.
Mit AAPT2 erhalten Sie den folgenden Fehler:
AndroidManifest.xml:15: error: unknown element <action> found.
Achten Sie darauf, dass die Manifestelemente richtig verschachtelt sind, um das Problem zu beheben. Weitere Informationen finden Sie in der Übersicht über App-Manifeste.
Ressourcendeklaration
Sie können den Typ einer Ressource nicht mehr über das Attribut name angeben.
Im folgenden Beispiel wird ein attr-Ressourcenelement fälschlicherweise deklariert:
<style name="childStyle" parent="parentStyle"> <item name="attr/my_attr">@color/pink</item> </style>
Wenn Sie einen Ressourcentyp auf diese Weise deklarieren, erhalten Sie den folgenden Build-Fehler:
Error: style attribute 'attr/attr/my_attr (aka my.package:attr/attr/my_attr)' not found.
Um diesen Fehler zu beheben, deklarieren Sie den Typ explizit mit type="attr":
<style name="childStyle" parent="parentStyle"> <item type="attr" name="my_attr">@color/pink</item> </style>
Wenn Sie ein <style>-Element deklarieren, muss das übergeordnete Element außerdem ein Stilressourcentyp sein. Andernfalls wird ein Fehler wie der folgende angezeigt:
Error: (...) invalid resource type 'attr' for parent of style
Falsche Verwendung von @-Symbolen für Ressourcenreferenzen
AAPT2 gibt Build-Fehler aus, wenn Sie Ressourcenzuweisungssymbole (@) weglassen oder falsch platzieren. Wenn Sie das Symbol beispielsweise beim Angeben eines Stilattributs weglassen:
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> ... <!-- Note the missing '@' symbol when specifying the resource type. --> <item name="colorPrimary">color/colorPrimary</item> </style>
Beim Erstellen des Moduls gibt AAPT2 den folgenden Build-Fehler aus:
ERROR: expected color but got (raw string) color/colorPrimary
Wenn Sie das Symbol beim Zugriff auf eine Ressource aus dem Namespace android fälschlicherweise einfügen:
... <!-- When referencing resources from the 'android' namespace, omit the '@' symbol. --> <item name="@android:windowEnterAnimation"/>
Beim Erstellen des Moduls gibt AAPT2 den folgenden Build-Fehler aus:
Error: style attribute '@android:attr/windowEnterAnimation' not found
Falsche Konfiguration von Bibliotheken
Wenn Ihre App von einer Drittanbieterbibliothek abhängig ist, die mit älteren Versionen der Android SDK Build Tools erstellt wurde, kann es sein, dass Ihre App zur Laufzeit abstürzt, ohne dass Fehler oder Warnungen angezeigt werden. Dieser Absturz kann auftreten, weil die R.java-Felder beim Erstellen der Bibliothek als final deklariert werden. Daher sind alle Ressourcen-IDs in den Klassen der Bibliothek inline enthalten.
AAPT2 muss beim Erstellen Ihrer App IDs für Bibliotheksressourcen neu zuweisen können. Wenn die Bibliothek davon ausgeht, dass die IDs final sind, und sie in den DEX-Code der Bibliothek einfügt, kommt es zu einer Laufzeitabweichung.
Wenden Sie sich an den Autor der Bibliothek, um die Bibliothek mit der neuesten Version der Android SDK-Build-Tools neu zu erstellen und neu zu veröffentlichen.