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:
- 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 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
Rufen Sie die URL in einem Browser auf. Der Download von AAPT2 beginnt in Kürze.
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:
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
Außerdem werden alle PNG-Dateien standardmäßig verarbeitet und haben die Erweiterung |
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:
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 |
-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 |
-source-path path
|
Legt den Pfad der Quelldatei der kompilierten Ressourcendatei auf |
-h
|
Zeigt die Tools-Hilfe an. |
-v
|
Aktiviert ausführliches Logging. |
Verknüpfen
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.
Link syntax
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
Linkoptionen
Mit dem Befehl link
können Sie die folgenden Optionen verwenden:
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 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
|
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 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
|
--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 |
-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:
Unterbefehl | Beschreibung |
---|---|
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
:
Option | Beschreibung |
---|---|
--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:
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. |
-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 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
:
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. |
--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.