AAPT2 (AAPT 2)

AAPT2 (Android Asset Packaging Tool) ist ein Build-Tool, mit dem Android Studio und das Android Gradle-Plug-in die Ressourcen Ihrer App kompilieren und verpacken können. AAPT2 parst, indexiert und kompiliert die Ressourcen in ein Binärformat, das für die Android-Plattform optimiert ist.

Android Gradle-Plug-in 3.0.0 und höher aktiviert AAPT2 standardmäßig. Normalerweise müssen Sie aapt2 nicht selbst aufrufen. Wenn Sie jedoch Ihr Terminal und Ihr eigenes Build-System anstelle von Android Studio verwenden möchten, können Sie AAPT2 über die Befehlszeile verwenden. Sie können Build-Fehler im Zusammenhang mit AAPT2 auch über die Befehlszeile beheben. Suchen Sie dazu AAPT2 als eigenständiges Tool in den Android SDK Build Tools 26.0.2 und höher.

Verwenden Sie sdkmanager und führen Sie den folgenden Befehl aus, um Android SDK-Build-Tools über die Befehlszeile herunterzuladen:

sdkmanager "build-tools;build-tools-version"

Nachdem du die SDK-Build-Tools heruntergeladen hast, findest du AAPT2 unter android_sdk/build-tools/version/.

Da Versionen der Android SDK-Build-Tools nicht häufig veröffentlicht werden, ist die in Ihren SDK-Build-Tools enthaltene Version von AAPT2 möglicherweise nicht die neueste. Laden Sie AAPT2 von Google Maven herunter, um die neueste Version von AAPT2 zu erhalten.

Wenn Sie AAPT2 unter Linux oder Mac über die Befehlszeile verwenden möchten, führen Sie den Befehl aapt2 aus. Unter Windows führen Sie den Befehl aapt2.exe aus.

AAPT2 unterstützt durch die inkrementelle Kompilierung eine schnellere Kompilierung von Ressourcen. Für eine inkrementelle Kompilierung wird die Ressourcenverarbeitung in zwei Schritte unterteilt:

  • Kompilieren: Kompiliert Ressourcendateien in Binärformaten.
  • Link: führt alle kompilierten Dateien zusammen und verpackt sie in einem einzigen Paket.

Diese Trennung verbessert die Leistung bei inkrementellen Builds. Wenn beispielsweise Änderungen in einer einzelnen Datei vorgenommen wurden, müssen Sie nur diese Datei neu kompilieren.

AAPT2 von Google Maven herunterladen

Um die neueste Version von AAPT2 zu erhalten, das nicht in den Build-Tools enthalten ist, laden Sie AAPT2 wie folgt aus dem Maven-Repository von Google herunter:

  1. Rufen Sie im Repository-Index com.android.tools.build > aapt2 auf.
  2. Kopieren Sie den Namen der neuesten Version von AAPT2.
  3. Fügen Sie den kopierten Versionsnamen in die folgende URL ein und geben Sie das Zielbetriebssystem an: https://dl.google.com/dl/android/maven2/com/android/tools/build/aapt2/ aapt2-version/aapt2-aapt2-version- [windows | linux | osx].jar.

    Um beispielsweise Version 3.2.0-alpha18-4804415 für Windows herunterzuladen, verwenden Sie: https://dl.google.com/dl/android/maven2/com/android/tools/build/aapt2/ 3.2.0-alpha18-4804415/aapt2-3.2.0-alpha418-48-windows41.jar-alpha418-48

  4. Rufen Sie die URL in einem Browser auf. Der Download von AAPT2 beginnt in Kürze.

  5. Entpacken Sie die gerade heruntergeladene JAR-Datei.

    Die JAR-Datei sollte eine ausführbare aapt2-Datei und einige Bibliotheken enthalten, von denen die ausführbare Datei abhängig ist.

Kompilieren

AAPT2 unterstützt die Kompilierung aller Android-Ressourcentypen wie Drawables und XML-Dateien. Wenn Sie AAPT2 zum Kompilieren aufrufen, übergeben Sie pro Aufruf eine einzelne Ressourcendatei als Eingabe. AAPT2 parst dann die Datei und generiert eine Zwischendatei mit der Endung .flat.

Bei der Übergabe ganzer Verzeichnisse kompiliert AAPT2 alle Dateien im Verzeichnis neu, auch wenn sich nur eine Ressource geändert hat. Obwohl Sie Ressourcenverzeichnisse mit mehr als einer Ressourcendatei mit dem Flag --dir an AAPT2 übergeben können, profitieren Sie auf diese Weise nicht von den Vorteilen der inkrementellen Ressourcenkompilierung.

Die Ausgabedateitypen können sich je nach Eingabe unterscheiden, die Sie für die Kompilierung bereitstellen, wie in der folgenden Tabelle dargestellt:

Tabelle 1 Die Ein- und Ausgabedateitypen für die Kompilierung

Eingang Ausgang
XML-Ressourcendateien wie String und Style, die sich im Verzeichnis res/values/ befinden Ressourcentabelle mit *.arsc.flat als Erweiterung.
Alle anderen Ressourcendateien.

Alle Dateien außer den Dateien im Verzeichnis res/values/ werden in binäre XML-Dateien mit der Erweiterung *.flat konvertiert.

Außerdem werden alle PNG-Dateien standardmäßig verarbeitet und haben die Erweiterung *.png.flat . Wenn Sie sich gegen die Komprimierung von PNGs entscheiden, können Sie während der Kompilierung die Option --no-crunch verwenden.

Die AAPT2-Ausgabedateien sind keine ausführbaren Dateien. Sie müssen diese Binärdateien später in der Verknüpfungsphase als Eingabe hinzufü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:

aapt2 compile path-to-input-files [options] -o output-directory/

Im folgenden Beispiel kompiliert AAPT2 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 dem Namen 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, die im Drawable-Verzeichnis gespeichert ist, heißt jedoch drawable_img.png.flat.

Kompilierungsoptionen

Mit dem Befehl compile können Sie mehrere Optionen verwenden, wie in Tabelle 2 gezeigt:

Tabelle 2 Optionen für Kompilierungsbefehle

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, das nach Ressourcen gescannt werden soll.

Sie können dieses Flag zwar verwenden, um mehrere Ressourcendateien mit einem Befehl zu kompilieren, doch die Vorteile der inkrementellen Kompilierung werden dadurch deaktiviert. Daher sollte dieses Flag nicht für große Projekte verwendet werden.

--pseudo-localize Generiert pseudolokalisierte Versionen von Standardstrings 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, für die keine Reduzierung der Dateigröße erforderlich ist. Das Aktivieren dieser Option führt zu einer schnelleren Ausführung, erhöht aber die Größe der Ausgabedatei.

--legacy Behandelt Fehler, die zulässig sind, wenn frühere Versionen von AAPT als Warnungen verwendet werden.

Dieses Flag sollte für unerwartete Fehler bei der Kompilierungszeit verwendet werden. Informationen zum Beheben bekannter Verhaltensänderungen bei der Verwendung von AAPT2 finden Sie unter Verhaltensänderungen bei der Verwendung von AAPT2.

-zip file file ist eine ZIP-Datei mit dem Verzeichnis res, um nach Ressourcen zu suchen.
-output-text-symbols file Generiert eine Textdatei mit den Ressourcensymbolen in der angegebenen file.
-preserve-visibility-of-styleables Wenn dieses Flag angegeben ist, werden die gleichen Sichtbarkeitsregeln für Styleables angewendet, die für alle anderen Ressourcen verwendet werden. Andernfalls werden alle Styleables veröffentlicht.
-visibility [public|private|default|] Legt die Sichtbarkeit der kompilierten Ressourcen auf die angegebene Ebene fest.
-trace-folder folder Erzeugt ein JSON-Trace-Fragment systrace im angegebenen Ordner.
-source-path path Legt den Pfad der Quelldatei der kompilierten Ressourcendatei auf path fest.
-h Zeigt die Tools-Hilfe an.
-v Aktiviert ausführliches Logging.

In der Verknüpfungsphase führt AAPT2 alle Zwischendateien, die während der Kompilierungsphase generiert werden, zusammen, darunter Ressourcentabellen, binäre XML-Dateien und verarbeitete PNG-Dateien. Anschließend werden die Dateien in einem einzigen APK zusammengefasst. Während dieser Phase können außerdem andere Hilfsdateien wie R.java- und ProGuard-Regeldateien generiert werden. Das generierte APK enthält jedoch keinen DEX-Bytecode und ist nicht signiert. Du kannst 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.

Die allgemeine Syntax für die Verwendung von link lautet:

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

Mit dem Befehl link können Sie die folgenden Optionen verwenden:

Tabelle 3 Optionen für Linkbefehle

Option Beschreibung
-o path

Gibt den Ausgabepfad für das APK der verknüpften Ressource an.

Dies ist ein erforderliches Flag, da Sie den Pfad für das Ausgabe-APK 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 erforderliches 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.jar der Plattform oder zu anderen APKs wie framework-res.apk an, die beim Erstellen von Features nützlich sein können.

Dieses Flag ist erforderlich, wenn Sie in Ihren Ressourcendateien Attribute mit dem Namespace android verwenden.
-A directory Gibt ein Asset-Verzeichnis an, das in das APK aufgenommen werden soll.

In diesem Verzeichnis können Sie unverarbeitete Originaldateien speichern. Weitere Informationen finden Sie unter Auf Originaldateien zugreifen.

-R file Übergibt eine einzelne .flat-Datei mit overlay-Semantik an link, ohne das <add-resource>-Tag zu verwenden.

Wenn Sie eine Ressourcendatei bereitstellen, die eine vorhandene Datei überlagert, 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 von Ihnen angegebene Paket-ID muss größer oder gleich 0x7f sein, sofern sie nicht in Kombination mit --allow-reserved-package-id verwendet wird.

--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 --allow-reserved-package-id können Sie IDs zuweisen, die in den Bereich der reservierten Paket-IDs fallen.

Diese Option sollte nur für Pakete mit einer min-sdk-Version 26 oder niedriger verwendet werden.

--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 für Stil und Layout des SDK.
--no-version-vectors Deaktiviert die automatische Versionsverwaltung von Vektor-Drawables. Verwende dieses Flag nur, wenn du dein APK mit der Vector Drawable-Bibliothek erstellst.
--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 Aktiviert die Codierung von dünnbesetzten Einträgen mithilfe eines binären Suchbaums. Dies ist nützlich, um die APK-Größe zu optimieren, allerdings auf Kosten des Ressourcenabrufs.
-z Erfordert die Lokalisierung von Strings, die als „vorgeschlagen“ gekennzeichnet sind.
-c config Stellt eine durch Kommas getrennte Liste von Konfigurationen bereit.

Wenn Sie beispielsweise Abhängigkeiten von der Supportbibliothek haben, die Übersetzungen für mehrere Sprachen enthält, können Sie Ressourcen nur nach der jeweiligen Sprachkonfiguration filtern, z. B. Englisch oder Spanisch.

Sie müssen die Sprachkonfiguration mit einem aus zwei Buchstaben bestehenden ISO 639-1-Sprachcode definieren, gefolgt von einem aus zwei Buchstaben bestehenden ISO 3166-1-alpha-2-Regionscode mit vorangestelltem kleingeschriebenen „r“. Beispiel: en-rUS.

--preferred-density density AAPT2 kann die am besten übereinstimmende Dichte auswählen und alle anderen entfernen.

In Ihrer App stehen verschiedene Pixeldichte-Qualifier zur Verfügung, z. B. ldpi, hdpi und xhdpi. Wenn Sie eine bevorzugte Dichte angeben, wählt AAPT2 die am besten übereinstimmende Dichte aus und speichert sie in der Ressourcentabelle. Alle anderen Dichten werden entfernt.

--output-to-dir Gibt die APK-Inhalte in ein durch -o angegebenes Verzeichnis aus.

Wenn bei Verwendung dieses Flags Fehler auftreten, können Sie diese durch ein Upgrade auf Android SDK Build Tools 28.0.0 oder höher beheben.

--min-sdk-version min-sdk-version Legt die standardmäßige SDK-Mindestversion fest, die für AndroidManifest.xml verwendet werden soll.
--target-sdk-version target-sdk-version Legt die standardmäßige SDK-Zielversion fest, die für AndroidManifest.xml verwendet werden soll.
--version-code version-code Gibt den Versionscode an, der in AndroidManifest.xml eingeschleust werden soll, wenn keiner vorhanden ist.
--version-name version-name Gibt den Versionsnamen an, der in AndroidManifest.xml eingeschleust werden soll, wenn keiner vorhanden ist.
--revision-code revision-code Gibt den Überarbeitungscode an, der in die Datei AndroidManifest.xml eingeschleust werden soll, wenn keiner vorhanden ist.
--replace-version Wenn --version-code, --version-name oder --revision-code angegeben ist, ersetzen diese Werte alle bereits im Manifest vorhandenen Werte. 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 eingeschleust werden soll, wenn keiner vorhanden ist.
--compile-sdk-version-name compile-sdk-version-name Gibt den Versionsnamen an, der in die Datei AndroidManifest.xml eingeschleust werden soll, wenn keiner vorhanden ist.
--proto-format Generiert kompilierte Ressourcen im Protobuf-Format.

Geeignet als Eingabe für bundletool zum Generieren eines Android App Bundles.

--non-final-ids Generiert R.java mit nicht finalen 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 von Namen von Ressourcentypen und ihren ID-Zuordnungen unter dem angegebenen Pfad aus. Geeignet für die Verwendung mit --stable-ids.
--stable-ids outputfilename.ext Verwendet die mit --emit-ids generierte Datei, die die Liste der Namen der Ressourcentypen und der zugewiesenen IDs enthält.

Mit dieser Option können zugewiesene IDs stabil bleiben, auch wenn Sie während der Verknüpfung Ressourcen löschen oder neue hinzufügen.

--custom-package package_name Gibt das benutzerdefinierte Java-Paket an, unter dem R.java generiert werden soll.
--extra-packages package_name Erzeugt die gleiche R.java-Datei 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 R-Klasse 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 Verwendung des <add-resource>-Tags.
--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 --rename-manifest-package verwendet werden.

-0 extension

Gibt die Dateiendungen der Dateien an, die nicht komprimiert werden sollen.

--split path:config[,config[..]] Die Ressourcen werden basierend auf einer Reihe von Konfigurationen aufgeteilt, um eine andere Version des APKs zu generieren.

Sie müssen den Pfad zum Ausgabe-APK 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 einen minimalen Satz von ProGuard-Keep-Regeln.
--no-resource-removal Deaktiviert das automatische Entfernen von Ressourcen ohne Standardeinstellungen. Verwenden Sie diese Option nur, wenn Sie Laufzeitressourcen-Overlay-Pakete erstellen.
-x Legacy-Flag, das die Verwendung der Paketkennung 0x01 angibt.
--product products-list Gibt eine durch Kommas getrennte Liste von Produktnamen an, die beibehalten werden sollen.
--no-xml-namespaces Entfernt die XML-Namespace-Präfix- und -URI-Informationen aus der AndroidManifest.xml-Datei und den XML-Binärdateien in res/*.
--shared-lib Generiert eine gemeinsam genutzte Android-Laufzeitbibliothek.
--static-lib Erzeugt eine statische Android-Bibliothek.
--no-static-lib-packages Führt alle Bibliotheksressourcen im App-Paket zusammen.
--no-proguard-location-reference Verhindert, dass ProGuard-Regeldateien auf die Quelldatei verweisen.
--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, wird für öffentliche und private Symbole der Paketname der App verwendet.
--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 rohe Attributwerte in XML-Dateien bei.
--no-compress-regex regular-expression Erweiterungen, die mit regular-expression übereinstimmen, werden nicht komprimiert. Verwende das $-Symbol für das Zeilenende. Verwendet eine ECMAScript-Grammatik für reguläre Ausdrücke, bei der die Groß-/Kleinschreibung berücksichtigt wird.
--warn-manifest-validation Fehler bei der Manifest-Validierung werden als Warnungen behandelt.
--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, wodurch die Anwendung auch auf Produktionsgeräten debug-fähig wird.
--strict-visibility Overlays mit unterschiedlichen Sichtbarkeitsstufen sind nicht zulässig.
--exclude-sources Die Informationen der Quelldatei werden beim Generieren von Ressourcen im Protobuf-Format nicht partitioniert.
--trace-folder folder Erzeugt das JSON-Trace-Fragment systrace für das angegebene folder.
--merge-only Führt nur die Ressourcen zusammen, ohne Ressourcenverweise zu prüfen. Dieses Flag sollte nur mit dem Flag --static-lib verwendet werden.
-h Zeigt das Hilfemenü an.
-v Ermöglicht eine höhere Ausführlichkeit der Ausgabe.

Erfassen

dump wird zum Drucken von Informationen über das APK verwendet, das du mit dem Befehl link generiert hast.

Dump-Syntax

Die allgemeine Syntax für die Verwendung von dump lautet:

aapt2 dump sub-command filename.apk [options]

Im folgenden Beispiel werden Inhalte aus der Ressourcentabelle des angegebenen APKs gedruckt:

aapt2 dump resources output.apk

Dump-Unterbefehle

Geben Sie mit dem Befehl dump einen der folgenden Unterbefehle an:

Tabelle 4 Dump-Unterbefehle

UnterbefehlBeschreibung
apc Gibt den Inhalt des während der Kompilierung generierten AAPT2-Containers (APC) aus.
badging Druckt aus dem APK-Manifest extrahierte Informationen.
configurations Gibt jede Konfiguration aus, die von einer Ressource im APK verwendet wird.
overlayable Gibt die überlagbaren Ressourcen des APKs aus.
packagename Gibt den Paketnamen des APK aus.
permissions Gibt die aus dem APK-Manifest extrahierten Berechtigungen aus.
strings Gibt den Inhalt des Stringpools der Ressourcentabelle des APK aus.
styleparents Gibt die übergeordneten Stile der im APK verwendeten Stile aus.
resources Gibt den Inhalt der Ressourcentabelle des APK aus.
xmlstrings Gibt Strings aus der kompilierten XML-Datei des APK aus.
xmltree Gibt eine Struktur der kompilierten XML-Datei des APK aus.

Dump-Optionen

Verwenden Sie die folgenden Optionen mit dump:

Tabelle 5 Dump-Optionen

OptionBeschreibung
--no-values Unterdrückt die Ausgabe von Werten, wenn die Ressource angezeigt wird.
--file file Gibt eine Datei als Argument an, das aus dem APK kopiert werden soll.
-v Erhöht die Ausführlichkeit der Ausgabe.

Differenz

Mit diff kannst du zwei APKs vergleichen und mögliche Unterschiede erkennen.

Diff-Syntax

Die allgemeine Syntax für die Verwendung von diff lautet:

aapt2 diff first.apk second.apk

Für den Befehl diff gibt es keine Optionen.

Optimiere

optimize wird verwendet, um Optimierungen für die zusammengeführten Ressourcen und resources.arsc auszuführen, 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.

Optimize-Syntax

Die allgemeine Syntax für die Verwendung von optimize lautet:

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 Darstellung der flachen Tabelle durch einen kompakteren binären Suchbaum, was zu einem kleineren APK führt, allerdings auf Kosten der Abrufleistung:

aapt2 optimize -o output.apk --enable-sparse-encoding input.apk

Optionen optimieren

Mit optimize können Sie die folgenden Optionen verwenden:

Tabelle 6 Optionen optimieren

OptionBeschreibung
-o path Gibt den Ausgabepfad für das APK der verknüpften Ressource an.

Dies ist ein erforderliches Flag, da Sie den Pfad für das Ausgabe-APK angeben müssen, das die verknüpften Ressourcen enthalten kann.

-d directory Gibt den Pfad zum Ausgabeverzeichnis für Aufteilungen an.
-x path Gibt den Pfad zur XML-Konfigurationsdatei an.
-p Druckt die Multi-APK-Artefakte und beendet sie.
--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 der angegebenen Dichte nicht verwendet werden würden, werden aus dem APK entfernt.
--resources-config-path path

Gibt den Pfad zur Datei resources.cfg an, die die Liste der Ressourcen und Anweisungen für jede Ressource enthält.

Format: type/resource_name#[directive][,directive]

-c config[,config[..]] Gibt eine durch Kommas getrennte Liste von Konfigurationen an, die einbezogen werden sollen. Die Standardeinstellung sind alle Konfigurationen.
--split path:config[,config[..]] Die Ressourcen werden basierend auf einer Reihe von Konfigurationen aufgeteilt, um eine andere Version des APKs zu generieren.

Sie müssen den Pfad zum Ausgabe-APK zusammen mit den Konfigurationen angeben.

--keep-artifacts artifact[,artifact[..]] Gibt eine durch Kommas getrennte Liste von Artefakten an, die beibehalten werden sollen. Wenn keine angegeben sind, werden alle Artefakte beibehalten.
--enable-sparse-encoding Aktiviert die Codierung von dünnbesetzten Einträgen mithilfe eines binären Suchbaums. Diese Option ist nützlich, um die APK-Größe zu optimieren, allerdings auf Kosten des Ressourcenabrufs.
--collapse-resource-names Minimiert Ressourcennamen im Schlüsselstringpool auf einen einzelnen Wert. Ressourcen werden mithilfe der Anweisung no_collapse in einer durch --resources-config-path angegebenen Datei ausgenommen.
--shorten-resource-paths Verkürzt die Pfade der Ressourcen im APK.
--resource-path-shortening-map path Gibt den Pfad an, mit dem die Zuordnung alter Ressourcenpfade in gekürzte Pfade 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 einem Binärformat, das für APKs geeignet ist. Sie können auch das für AABs geeignete protobuf-Format angeben, indem Sie --proto-format angeben. Mit dem Befehl convert werden APKs zwischen den beiden Formaten konvertiert.

Syntax konvertieren

Die allgemeine Syntax für convert lautet:

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 erstellt, das Ressourcen im protobuf-Format enthält. Sie ersetzt die übliche einfache Tabellendarstellung durch einen kompakteren binären Suchbaum. Dies führt zu einem kleineren APK, allerdings auf Kosten der Abrufleistung:

aapt2 convert -o output.apk --output-format proto --enable-sparse-encoding input.apk

Konvertierungsoptionen

Verwenden Sie die folgenden Optionen mit convert:

Tabelle 7 Umwandlungsoptionen

OptionBeschreibung
-o path

Gibt den Ausgabepfad für das APK der verknüpften Ressource an.

Dies ist ein erforderliches Flag, da Sie den Pfad für das Ausgabe-APK 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 festgelegt ist, wird standardmäßig binary verwendet.
--enable-sparse-encoding Aktiviert die Codierung von dünnbesetzten Einträgen mithilfe eines binären Suchbaums. Diese Option ist nützlich, um die APK-Größe zu optimieren, allerdings auf Kosten des Ressourcenabrufs.
--keep-raw-values Behält rohe Attributwerte 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 zum Ausführen von Befehlen eingeführt. Im Daemon-Modus können Sie mehrere Befehle in eine einzige 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 mit einer leeren Zeile am Ende des Befehls stehen. Beenden Sie den Daemon-Modus, indem Sie Strg+D drücken.

Betrachten 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 eingegeben werden als:

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, mit der ein JSON-Trace-Fragment systrace für das angegebene folder generiert wird.

Version

Ermitteln Sie die Version von AAPT2, die Sie mit dem Befehl version verwenden:

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 Tools, das inzwischen eingestellt wird. AAPT2 sollte zwar sofort mit älteren Projekten funktionieren, in diesem Abschnitt werden jedoch einige Verhaltensänderungen beschrieben, die Sie kennen sollten.

Elementhierarchien im Android-Manifest

In früheren Versionen von AAPT wurden Elemente, die in falschen Knoten in der Datei AndroidManifest.xml verschachtelt waren, entweder ignoriert oder verursachten eine Warnung. Betrachten Sie zum Beispiel 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.

Bei Verwendung von AAPT2 erhalten Sie die folgende Fehlermeldung:

AndroidManifest.xml:15: error: unknown element <action> found.

Um das Problem zu beheben, müssen Sie dafür sorgen, dass Ihre Manifestelemente richtig verschachtelt sind. Weitere Informationen finden Sie in der Übersicht zum App Manifest.

Deklaration von Ressourcen

Sie können den Ressourcentyp 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>

Eine solche Deklaration eines Ressourcentyps führt zum 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>

Außerdem muss das übergeordnete Element beim Deklarieren eines <style>-Elements auch ein Stilressourcentyp sein. Andernfalls erhalten Sie eine Fehlermeldung, die in etwa so aussieht:

Error: (...) invalid resource type 'attr' for parent of style

Falsche Verwendung von @-Ressourcenreferenzsymbolen

AAPT2 gibt Build-Fehler aus, wenn Sie Ressourcenreferenzsymbole (@) weglassen oder falsch platzieren. Wenn Sie beispielsweise das Symbol 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, stürzt sie möglicherweise während der Laufzeit ab, ohne dass Fehler oder Warnungen angezeigt werden. Dieser Absturz kann auftreten, weil die R.java-Felder beim Erstellen der Bibliothek als final deklariert werden. Dadurch werden alle Ressourcen-IDs in den Klassen der Bibliothek inline angegeben.

AAPT2 benötigt beim Erstellen Ihrer Anwendung die Möglichkeit, IDs Bibliotheksressourcen neu zuzuweisen. Wenn die Bibliothek davon ausgeht, dass die IDs final sind, und sie in den Bibliotheks-DEX einfügt, liegt eine Laufzeitabweichung vor.

Um diesen Fehler zu beheben, bitten Sie den Bibliotheksautor, die Bibliothek mit der neuesten Version der Android SDK-Build-Tools neu zu erstellen und zu veröffentlichen.