AAPT2 (AAPT 2)

AAPT2 (Android Asset Packaging Tool) ist ein Build-Tool, das von Android Studio Android-Gradle-Plug-in zum Kompilieren und Verpacken der Ressourcen AAPT2 parst, indexiert, und kompiliert die Ressourcen in einem Binärformat, das für den Android-Plattform.

Ab Android-Gradle-Plug-in 3.0.0 wird AAPT2 standardmäßig aktiviert. Ich normalerweise nicht selbst aapt2 aufrufen. Wenn Sie jedoch Ihr Terminal und Ihr eigenes Build-System anstelle von Android Studio verwenden, können Sie AAPT2 über die Befehlszeile ausführen. Du kannst auch Build-Fehler im Zusammenhang mit AAPT2 beheben über die Befehlszeile eingeben. Suchen Sie dazu AAPT2 als eigenständiges Tool in Android SDK Build Tools 26.0.2 und höher.

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

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

Nachdem du die SDK Build Tools heruntergeladen hast, suche AAPT2 in android_sdk/build-tools/version/

Weil Versionen der Android SDK Build Tools nicht veröffentlicht werden Häufig ist die in deinen SDK-Build-Tools enthaltene Version von AAPT2 möglicherweise nicht die auf dem neuesten Stand. Um die neueste Version von AAPT2 zu erhalten, laden Sie AAPT2 von Google Maven herunter.

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 eine schnellere Kompilierung von Ressourcen, indem inkrementelle Kompilierung. Um eine inkrementelle Kompilierung zu erreichen, ist die Ressourcenverarbeitung in zwei Schritte unterteilt:

  • Kompilieren: Die Ressourcendateien werden in Binärformate kompiliert.
  • Link: Führt alle kompilierten Dateien zusammen und verpackt sie zu einer einzigen Datei Paket.

Diese Trennung trägt dazu bei, die Leistung inkrementeller Builds zu verbessern. Beispiel: Wenn eine einzelne Datei Änderungen enthält, müssen Sie nur diese Datei neu kompilieren.

AAPT2 von Google Maven herunterladen

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

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

    Um beispielsweise die 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-alpha18-4804415-windows.jar

  4. Rufen Sie die URL in einem Browser auf. AAPT2 wird in Kürze heruntergeladen.

  5. Entpacken Sie die gerade heruntergeladene JAR-Datei.

    Die JAR-Datei sollte eine ausführbare aapt2 und einige Bibliotheken enthalten, die vom ausgeführt werden kann.

Kompilieren

AAPT2 unterstützt die Kompilierung aller Android-Ressourcentypen wie und XML-Dateien. Wenn Sie AAPT2 zur Kompilierung aufrufen, übergeben Sie eine einzelne Ressourcendatei als Eingabe pro Aufruf. AAPT2 parst die Datei dann. und generiert eine Zwischenbinärdatei mit der Erweiterung .flat.

Bei der Übergabe ganzer Verzeichnisse kompiliert AAPT2 alle Dateien im Verzeichnis neu auch wenn sich nur eine Ressource geändert hat. Sie können zwar Ressourcen Verzeichnisse mit mehr als einer Ressourcendatei in AAPT2 über das --dir können Sie auf diese Weise nicht von den Vorteilen der inkrementellen Ressourcenkompilierung profitieren.

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 Ausgabedatei Typen für die Kompilierung

Eingang Ausgabe
XML-Ressourcendateien wie String und Stil, im Verzeichnis res/values/ 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 *.flat-Erweiterungen konvertiert.

Außerdem werden alle PNG-Dateien standardmäßig verarbeitet und übernehmen die Erweiterung *.png.flat . Wenn Sie PNGs nicht komprimieren möchten, können Sie die Methode --no-crunch-Option während der Kompilierung.

Die von AAPT2 ausgegebenen Dateien sind keine ausführbaren Dateien und müssen später eingefügt werden Binärdateien als Eingabe in die Verknüpfungsphase ein, um ein APK zu generieren. Die Die generierte APK-Datei ist keine ausführbare Datei, die du auf einem Android-Gerät bereitstellen kannst. da es keine DEX-Dateien enthält und nicht unterzeichnet.

Syntax kompilieren

Die allgemeine Syntax zur Verwendung von compile lautet so:

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 dargestellt, hängt der Name der Ausgabedatei von der Eingabe filename und den Namen des übergeordneten Verzeichnisses.

Für das vorherige Beispiel mit der Datei strings.xml als Eingabe aapt2 automatisch nennt die Ausgabedatei values-en_strings.arsc.flat. Die kompilierten Die im Drawable-Verzeichnis gespeicherte Drawable-Datei heißt drawable_img.png.flat.

Optionen kompilieren

Es gibt mehrere Optionen, die Sie mit dem Befehl compile verwenden können: in Tabelle 2:

Tabelle 2: Befehlsoptionen kompilieren

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, in dem AAPT2 die kompilierten Ressourcen ausgeben und speichern kann.

--dir directory

Gibt das Verzeichnis an, das nach Ressourcen durchsucht werden soll.

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

--pseudo-localize Generiert pseudolocalized 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 erstellen Debug-Builds, die keine Dateigrößenreduzierung erfordern. Das Aktivieren dieser Option führt zu einer schnelleren Ausführung, erhöht aber auch die Ausgabe Dateigröße.

--legacy Behandelt Fehler, die bei Verwendung früherer Versionen von AAPT zulässig sind, wie Warnungen.

Dieses Flag sollte für unerwartete Kompilierungszeitfehler verwendet werden. Lösung Verhaltensänderungen bei Verwendung von AAPT2, Verhaltensänderungen bei Verwendung von AAPT2

-zip file file ist eine ZIP-Datei mit dem Verzeichnis res, nach dem gesucht werden soll. Ressourcen.
-output-text-symbols file Erstellt eine Textdatei mit den Ressourcensymbolen im angegebenen file.
-preserve-visibility-of-styleables Falls angegeben, werden dieselben Sichtbarkeitsregeln auf 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 das angegebene Level fest.
-trace-folder folder Erzeugt ein systrace-JSON-Trace-Fragment im angegebenen Ordner.
-source-path path Legt den Pfad der kompilierten Ressource auf path fest.
-h Zeigt die Hilfe für Tools an.
-v Aktiviert die ausführliche Protokollierung.

In der Verknüpfungsphase führt AAPT2 alle Zwischendateien zusammen, die von der Kompilierung in der Phase erzeugt, wie Ressourcentabellen, binäre XML-Dateien und verarbeitete PNGs. und packt die Dateien dann in einem einzigen APK. Darüber hinaus haben andere Zusätzliche Dateien wie R.java- und ProGuard-Regeldateien können generiert werden. während dieser Phase. 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, App über die Befehlszeile erstellen, können Sie andere Befehlszeilentools wie d8 zum Kompilieren verwenden Java-Bytecode in DEX-Bytecode und apksigner um Ihr APK zu signieren.

Die allgemeine Syntax zur 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 zusammen, drawable_Image.flat und values_values.arsc.flat sowie die AndroidManifest.xml-Datei. AAPT2 verknüpft das Ergebnis mit dem android.jar -Datei, 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, 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 deiner App wie der Paketname und die App ID.

-I

Gibt den Pfad zum android.jar der Plattform oder zu anderen APKs an, z. B. framework-res.apk, die beim Erstellen Funktionen.

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

In diesem Verzeichnis können Sie nicht verarbeitete Originaldateien speichern. Bis Weitere Informationen, Lesen <ph type="x-smartling-placeholder"></ph> Zugriff auf Originaldateien

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

Wenn Sie eine Ressourcendatei bereitstellen, die eine vorhandene Datei überlagert, die zuletzt angegebene in Konflikt stehende Ressource verwendet wird.

--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 es sei denn, er wird in Kombination mit --allow-reserved-package-id

--allow-reserved-package-id

Ermöglicht die Verwendung einer reservierten Paket-ID.

Reservierte Paket-IDs sind IDs, die normalerweise gemeinsam genutzten und im Bereich von 0x02 bis einschließlich 0x7e. Durch die Verwendung von --allow-reserved-package-id können Sie IDs zuweisen, die im Bereich der reservierten Paket-IDs liegt.

Diese Option sollte nur für Pakete mit der min-sdk-Version von 26 oder niedriger.

--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 SDK-Versionsverwaltung für Stil und Layout.
--no-version-vectors Deaktiviert die automatische Versionsverwaltung von Vektor-Drawables. Verwenden Sie dieses Flag nur, wenn Sie Ihr APK mit dem Vector Drawable erstellen. Mediathek.
--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 kompatible Konfigurationen.
--enable-sparse-encoding Ermöglicht die Codierung von Einträgen mit geringer Dichte mithilfe eines binären Suchbaums. Dies ist nützlich für die Optimierung der APK-Größe, allerdings auf Kosten der Ressourcen. die Datenabrufleistung.
-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, Übersetzungen für mehrere Sprachen enthält, können Sie nach Ressourcen filtern. nur für die gegebene Sprachkonfiguration, z. B. Englisch oder Spanisch.

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

--preferred-density density Ermöglicht es AAPT2, eine möglichst passende Dichte auszuwählen und zu entfernen alle anderen herauszufiltern.

Es gibt mehrere Pixeldichte-Qualifier, die Sie in Ihrer App verwenden können. wie ldpi, hdpi und xhdpi. Wenn Sie eine bevorzugte Dichte festlegen, AAPT2 wählt die nächstgelegene übereinstimmende Dichte aus und speichert sie in der Ressource und entfernt alle anderen.

--output-to-dir Gibt den APK-Inhalt in ein Verzeichnis aus, das durch -o angegeben wird.

Wenn Sie mit diesem Flag Fehler erhalten, können Sie sie beheben, indem Sie ein Upgrade ausführen auf Android SDK Build Tools 28.0.0 oder höher.

--min-sdk-version min-sdk-version Legt die niedrigste SDK-Standardversion für die Verwendung fest AndroidManifest.xml
--target-sdk-version target-sdk-version Legt die SDK-Standardversion für die Verwendung fest AndroidManifest.xml
--version-code version-code Gibt den Versionscode an, in den eingeschleust werden soll AndroidManifest.xml, wenn keiner vorhanden ist.
--version-name version-name Gibt den Versionsnamen an, in den eingefügt werden soll AndroidManifest.xml, wenn keiner vorhanden ist.
--revision-code revision-code Gibt den Überarbeitungscode an, in den eingeschleust werden soll Datei AndroidManifest.xml, wenn keine vorhanden ist.
--replace-version Wenn --version-code, --version-name oder --revision-code angegeben sind, ersetzen diese Werte alle Werte bereits im Manifest enthalten. Standardmäßig ändert sich nichts, wenn das Manifest definiert diese Attribute bereits.
--compile-sdk-version-nacodeme compile-sdk-version-name Gibt den Versionscode an, in den eingeschleust werden soll Datei AndroidManifest.xml, wenn keine vorhanden ist.
--compile-sdk-version-name compile-sdk-version-name Gibt den Versionsnamen an, in den eingefügt werden soll Datei AndroidManifest.xml, wenn keine vorhanden ist.
--proto-format Erzeugt kompilierte Ressourcen im Protobuf-Format.

Geeignet als Eingabe für <ph type="x-smartling-placeholder"></ph> bundletool zum Generieren eines Android App Bundles.

--non-final-ids Generiert R.java mit nicht endgültigen Ressourcen-IDs. Verweise auf Die IDs aus dem App-Code werden während kotlinc oder javac nicht eingefügt Kompilierung.
--emit-ids path Gibt eine Datei unter dem angegebenen Pfad mit einer Liste von Namen von Ressourcentypen und ihre ID-Zuordnungen. Dies ist zur Verwendung mit --stable-ids geeignet.
--stable-ids outputfilename.ext Verwendet die mit --emit-ids generierte Datei, die den Liste mit Namen von Ressourcentypen und ihren zugewiesenen IDs.

Mit dieser Option bleiben zugewiesene IDs auch nach dem Löschen stabil oder neue Ressourcen beim Verknüpfen hinzufügen.

--custom-package package_name Gibt das benutzerdefinierte Java-Paket an, unter dem R.java generiert werden soll.
--extra-packages package_name Generiert die gleiche R.java-Datei, aber mit einem anderen Paket Namen.
--add-javadoc-annotation annotation Fügt allen generierten Java-Klassen eine JavaDoc-Anmerkung 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 zu Overlays ohne die <add-resource>-Tag.
--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 <ph type="x-smartling-placeholder"></ph> instrumentation

Diese Option sollte in Verbindung mit --rename-manifest-package

-0 extension

Gibt die Dateiendungen an, die nicht komprimiert werden sollen.

--split path:config[,config[..]] Teilt Ressourcen basierend auf einer Reihe von Konfigurationen auf, um ein anderes Version der APK-Datei.

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

--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. Diese Option verwenden 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 der Produktnamen an, die beibehalten werden sollen.
--no-xml-namespaces Entfernt das Präfix des XML-Namespace und die URI-Informationen aus AndroidManifest.xml-Datei und 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 App-Paket zusammen.
--no-proguard-location-reference Verhindert, dass ProGuard-Regeldateien einen Verweis auf die Quelldatei haben.
--private-symbols package-name package-name gibt den Paketnamen an, der beim Generieren verwendet werden soll R.java für private Symbole. Wenn nicht angegeben, werden öffentlich und privaten Symbolen den Paketnamen der App.
--override-styles-instead-of-overlaying Bewirkt, dass in -R Ressourcen definierte Stile vorherige Definitionen ersetzen statt 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 unverarbeitete Attributwerte 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 zwischen Groß- und Kleinschreibung zu unterscheiden.
--warn-manifest-validation Behandelt Fehler bei der Manifestvalidierung als Warnungen.
--exclude-configs qualifier[,qualifier[..]] Schließt Werte von Ressourcen aus, deren Konfigurationen die angegebenen Qualifier.
--debug-mode Fügt android:debuggable="true" in den Anwendungsknoten ein des Manifests, sodass die Anwendung auch in der Produktionsumgebung Geräte.
--strict-visibility Overlays mit unterschiedlichen Sichtbarkeitsstufen sind nicht zulässig.
--exclude-sources Quelldateiinformationen werden nicht serialisiert, wenn Ressourcen generiert werden in Protobuf-Format.
--trace-folder folder Generiert das JSON-Trace-Fragment systrace für die angegebene folder.
--merge-only Führt nur die Ressourcen zusammen, ohne Ressourcenverweise zu prüfen. Dieses Flag sollte nur mit dem Parameter --static-lib verwendet werden melden.
-h Zeigt das Hilfemenü an.
-v Ermöglicht eine erhöhte Ausführlichkeit der Ausgabe.

Erfassen

Mit dump werden Informationen zum APK gedruckt, das du mithilfe des link-Befehl.

Dump-Syntax

Die allgemeine Syntax zur Verwendung von dump lautet so:

aapt2 dump sub-command filename.apk [options]

Im folgenden Beispiel werden Inhalte aus der Ressourcentabelle der angegebenen APK:

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 AAPT2-Containers (APC) aus, der während Kompilierung.
badging Druckt Informationen, die aus dem Manifest des APK extrahiert wurden.
configurations Gibt jede Konfiguration aus, die von einer Ressource im APK verwendet wird.
overlayable Gibt die einblendbaren Ressourcen des APK aus.
packagename Gibt den Paketnamen des APK aus.
permissions Druckt die aus dem Manifest des APK extrahierten Berechtigungen.
strings Gibt den Inhalt des Ressourcentabellen-Stringpools des APK aus.
styleparents Gibt die übergeordneten Stile aus, die im APK verwendet werden.
resources Gibt den Inhalt der Ressourcentabelle des APK aus.
xmlstrings Druckt Strings aus dem kompilierten XML-Code des APK aus.
xmltree Druckt eine Baumstruktur des kompilierten XML-Codes des APK.

Dumpoptionen

Verwenden Sie die folgenden Optionen mit dump:

Tabelle 5 Dumpoptionen

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

Unterschied

Verwende diff, um zwei APKs zu vergleichen und Unterschiede zwischen ihnen zu identifizieren.

Differenz-Syntax

Die allgemeine Syntax zur 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, bevor sie in das APK gepackt werden. Diese Optimierung die APK-Größe um etwa 1–3 % reduzieren, je nach Größe und Anzahl der die genutzt werden.

Optimize-Syntax

Die allgemeine Syntax zur 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. Sie ersetzt die übliche Darstellung in einer flachen Tabelle. mit einem kompakteren binären Suchbaum, was zu einem kleineren APK auf der Kosten für die Abrufleistung:

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

Optimize-Optionen

Mit optimize können Sie die folgenden Optionen verwenden:

Tabelle 6 Optimize-Optionen

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, 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 wird beendet.
--target-densities density[,density[..]] Gibt eine durch Kommas getrennte Liste der Bildschirmdichten an, die das APK ist optimiert ist. Alle Ressourcen, die auf den Geräten der werden aus dem APK entfernt.
--resources-config-path path

Gibt den Pfad zur Datei resources.cfg an, die die Liste der Ressourcen und Anweisungen zu jeder Ressource.

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

-c config[,config[..]] Gibt eine durch Kommas getrennte Liste der einzuschließenden Konfigurationen an. Die Standardeinstellung ist „Alle“. Konfigurationen.
--split path:config[,config[..]] Teilt Ressourcen basierend auf einer Reihe von Konfigurationen auf, um ein anderes Version der APK-Datei.

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

--keep-artifacts artifact[,artifact[..]] Gibt eine durch Kommas getrennte Liste der Artefakte an, die beibehalten werden sollen. Sind keine angegeben, werden alle Artefakte beibehalten.
--enable-sparse-encoding Ermöglicht die Codierung dünnbesetzter Einträge mithilfe eines binären Suchbaums. Diese Option ist nützlich für die Optimierung der APK-Größe, erfordert jedoch beim Abrufen von Ressourcen.
--collapse-resource-names Minimiert Ressourcennamen auf einen einzelnen Wert im Schlüsselstringpool. Ressourcen werden mithilfe der no_collapse-Anweisung ausgenommen in eine durch --resources-config-path angegebene Datei.
--shorten-resource-paths Verkürzt die Pfade von Ressourcen im APK.
--resource-path-shortening-map path Gibt den Pfad für die Ausgabe der Zuordnung alter Ressourcenpfade zu verkürzten Pfaden an.
-v Erhöht die Ausführlichkeit der Ausgabe.
-h Zeigt die Hilfe zum Tool 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 protobuf-Format angeben der für AABs geeignet ist, indem Sie --proto-format angeben. Das convert werden APKs zwischen den beiden Formaten konvertiert.

Syntax konvertieren

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. Sie ersetzt die üblichen Darstellung einer flachen Tabelle mit einer kompakteren binären Suchstruktur, die in einem kleineren APK 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, 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 Ermöglicht die Codierung dünnbesetzter Einträge mithilfe eines binären Suchbaums. Diese Option ist nützlich für die Optimierung der APK-Größe, erfordert jedoch beim Abrufen von Ressourcen.
--keep-raw-values Behält unverarbeitete Attributwerte in XML-Dateien bei.
-v Erhöht die Ausführlichkeit der Ausgabe.
-h Zeigt die Hilfe zum Tool an.

Daemon-Modus

Mit AAPT-Version 2.19 wurde der Daemon-Modus für die Ausgabe von Befehlen eingeführt. Mit dem Daemon-Modus mehrere Befehle in einer 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 -Befehl muss sich in einer separaten Zeile mit einer Leerzeile am Ende des Befehls befinden. 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, die ein systrace-JSON generiert Trace-Fragment auf die angegebene folder.

Version

Bestimme die Version von AAPT2, die du mit dem Befehl version verwendest:

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, die mittlerweile eingestellt wurde. Obwohl AAPT2 sofort mit älteren Projekten enthält, werden in diesem Abschnitt einige Verhaltensänderungen beschrieben, die Sie bewusst sind.

Elementhierarchien im Android-Manifest

In früheren Versionen von AAPT waren Elemente, die in falschen Knoten in der AndroidManifest.xml Datei wurde entweder ignoriert oder es wurde eine Warnung ausgegeben. Hier ein 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 des AAPT wurde das falsch platzierte <action>-Tag einfach ignoriert.

Mit AAPT2 wird der folgende Fehler angezeigt:

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 den App-Manifest-Übersicht.

Angabe 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>

Die Deklaration eines Ressourcentyps auf diese Weise führt zu folgendem Build-Fehler:

Error: style attribute 'attr/attr/my_attr (aka my.package:attr/attr/my_attr)'
not found.

Um diesen Fehler zu beheben, müssen Sie den Typ explizit mit type="attr" deklarieren:

<style name="childStyle" parent="parentStyle">
  <item type="attr" name="my_attr">@color/pink</item>
</style>

Außerdem muss beim Deklarieren eines <style>-Elements das übergeordnete Element ebenfalls ein Ressourcentyp des Stils. 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 eine Ressource weglassen oder falsch platzieren Referenzsymbole (@). Wenn Sie z. B. das Symbol weglassen, durch Angabe eines Stilattributs:

<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:

...
<!-- 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 der Bibliotheken

Wenn Ihre App von einer Bibliothek eines Drittanbieters abhängig ist, die mit älteren Versionen der Android SDK-Build-Tools verwenden, App während der Laufzeit abstürzen kann, ohne dass Fehler oder Warnungen angezeigt werden. Dieser Absturz kann auftreten, weil die R.java-Felder während der Erstellung der Bibliothek hat final deklariert. Daher werden alle Ressourcen-IDs in den in der Bibliothek an.

AAPT2 setzt voraus, dass die IDs den Bibliotheksressourcen beim Erstellen von für Ihre App. Wenn die Bibliothek annimmt, dass die IDs final sind, und sie inline eingefügt werden, Bibliothek DEX enthält, liegt eine Abweichung der Laufzeit vor.

Bitten Sie den Autor der Bibliothek, die Bibliothek neu zu erstellen, um diesen Fehler zu beheben Verwenden Sie die neueste Version der Android SDK Build Tools und veröffentlichen Sie die Bibliothek.