AAPT2

AAPT2 (Android Asset Packaging Tool) to narzędzie do kompilacji używane przez Android Studio i wtyczkę do Androida do obsługi Gradle do kompilowania i pakowania zasobów aplikacji. AAPT2 analizuje, indeksuje i kompiluje zasoby do formatu binarnego zoptymalizowanego pod kątem platformy Androida.

Wtyczka Androida do obsługi Gradle w wersji 3.0.0 i nowszych domyślnie włącza AAPT2. Zwykle nie musisz samodzielnie wywoływać aapt2. Jeśli jednak wolisz użyć terminala i własnego systemu kompilacji, a nie Android Studio, możesz użyć AAPT2 z poziomu wiersza poleceń. Błędy kompilacji związane z AAPT2 można też debugować z poziomu wiersza poleceń. Aby to zrobić, znajdź AAPT2 jako samodzielne narzędzie w Android SDK Build Tools w wersji 26.0.2 lub nowszej.

Aby pobrać narzędzia kompilacji pakietu Android SDK z wiersza poleceń, użyj sdkmanager i uruchom to polecenie:

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

Po pobraniu narzędzi do kompilacji SDK znajdź AAPT2 w android_sdk/build-tools/version/.

Narzędzia do kompilacji pakietu Android SDK nie są często publikowane, dlatego wersja AAPT2 uwzględniona w narzędziach do kompilacji SDK może nie być najnowsza. Jeśli chcesz zainstalować najnowszą wersję AAPT2, pobierz AAPT2 z Google Maven.

Aby użyć AAPT2 z poziomu wiersza poleceń w systemie Linux lub Mac, uruchom polecenie aapt2. W systemie Windows uruchom polecenie aapt2.exe.

AAPT2 zapewnia szybszą kompilację zasobów, umożliwiając kompilację przyrostową. Aby przeprowadzić kompilację przyrostową, przetwarzanie zasobów dzieli się na 2 kroki:

  • Kompiluj: kompiluje pliki zasobów do formatów binarnych.
  • Link: łączy wszystkie skompilowane pliki i pakuje je w jeden pakiet.

To rozdzielenie pomaga zwiększyć wydajność kompilacji przyrostowych. Na przykład, jeśli w jednym pliku są zmiany, musisz skompilować tylko ten plik.

Pobierz AAPT2 od Google Maven

Aby pobrać najnowszą wersję AAPT2, która nie jest dołączona do narzędzi do kompilacji, pobierz ją z repozytorium Maven Google w ten sposób:

  1. W indeksie repozytorium otwórz com.android.tools.build > aapt2.
  2. Skopiuj nazwę najnowszej wersji AAPT2.
  3. Wstaw skopiowaną nazwę wersji w tym adresie URL i określ docelowy system operacyjny: https://dl.google.com/dl/android/maven2/com/android/tools/build/aapt2/ aapt2-version/aapt2-aapt2-version- [windows | linux | osx].jar

    Aby na przykład pobrać wersję 3.2.0-alpha18-4804415 dla systemu Windows, użyj kodu: https://dl.google.com/dl/android/maven2/com/android/tools/build/aapt2/ 3.2.0-alpha18-4804415/aapt2-3.2.0-alpha418-480

  4. Otwórz adres URL w przeglądarce. Wkrótce rozpocznie się pobieranie AAPT2.

  5. Rozpakuj pobrany przed chwilą plik JAR.

    Plik JAR powinien zawierać plik wykonywalny aapt2 i kilka bibliotek, od których zależy ten plik.

Kompilacja

AAPT2 obsługuje kompilację wszystkich typów zasobów Androida, takich jak pliki rysunkowe i XML. Gdy wywołujesz AAPT2 w celu kompilacji, przekazuj 1 plik zasobów jako dane wejściowe na każde wywołanie. Następnie AAPT2 analizuje plik i generuje pośredni plik binarny z rozszerzeniem .flat.

Podczas przekazywania całych katalogów AAPT2 rekompiluje wszystkie pliki w katalogu nawet wtedy, gdy zmieni się tylko jeden zasób. Mimo że za pomocą flagi --dir możesz przekazywać do AAPT2 katalogi zasobów zawierające więcej niż 1 plik zasobów, nie korzystasz w ten sposób z korzyści związanych z przyrostową kompilacją zasobów.

Typy plików wyjściowych mogą się różnić w zależności od danych wejściowych, które podasz na potrzeby kompilacji, jak pokazano w tej tabeli:

Tabela 1. Typy plików wejściowych i wyjściowych do kompilacji

Wprowadź tekst Odpowiedź
Pliki zasobów XML, takie jak String i Style, znajdujące się w katalogu res/values/ Tabela zasobów z rozszerzeniem *.arsc.flat.
Wszystkie inne pliki zasobów.

Wszystkie pliki z wyjątkiem plików w katalogu res/values/ są konwertowane na binarne pliki XML z rozszerzeniami *.flat.

Dodatkowo wszystkie pliki PNG są domyślnie obcięte i mają rozszerzenia *.png.flat . Jeśli nie chcesz kompresować plików PNG, podczas kompilacji możesz używać opcji --no-crunch.

Pliki wyjściowe AAPT2 nie są plikami wykonywalnymi. Aby wygenerować pakiet APK, musisz później uwzględnić te pliki binarne jako dane wejściowe na etapie linku. Wygenerowany plik APK nie jest jednak plikiem wykonywalnym, który można od razu wdrożyć na urządzeniu z Androidem, ponieważ nie zawiera plików DEX i nie jest podpisany.

Składnia kompilacji

Ogólna składnia polecenia compile wygląda tak:

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

W poniższym przykładzie AAPT2 skompiluje pojedynczo pliki zasobów o nazwach values.xml i myImage.png:

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/

Jak pokazano w tabeli 1, nazwa pliku wyjściowego zależy od nazwy pliku wejściowego i nazwy jego katalogu nadrzędnego.

W poprzednim przykładzie z danymi wejściowymi strings.xml aapt2 automatycznie nadaje plikowi wyjściowemu nazwę values-en_strings.arsc.flat. Skompilowany plik rysunkowy przechowywany w katalogu rysowalnym nosi jednak nazwę drawable_img.png.flat.

Opcje kompilacji

Za pomocą polecenia compile możesz używać kilku opcji, jak pokazano w tabeli 2:

Tabela 2. Opcje kompilacji polecenia

Opcja Opis
-o path

Określa ścieżkę wyjściową skompilowanych zasobów.

Jest to flaga wymagana, ponieważ musisz określić ścieżkę do katalogu, w którym AAPT2 może wyświetlać i przechowywać skompilowane zasoby.

--dir directory

Określa katalog do przeskanowania w poszukiwaniu zasobów.

Mimo że możesz używać tej flagi do kompilowania wielu plików zasobów za pomocą jednego polecenia, wyłącza ona korzyści płynące z kompilacji przyrostowej. Dlatego tej flagi nie należy używać w przypadku dużych projektów.

--pseudo-localize Generuje pseudozlokalizowane wersje ciągów domyślnych, np. en-XA i en-XB.
--no-crunch Wyłącza przetwarzanie PNG.

Użyj tej opcji, jeśli pliki PNG zostały już przetworzone lub tworzysz kompilacje debugowania, które nie wymagają zmniejszania rozmiaru pliku. Włączenie tej opcji przyspiesza wykonywanie, ale zwiększa rozmiar pliku wyjściowego.

--legacy Traktuje błędy dopuszczalne w przypadku korzystania z wcześniejszych wersji AAPT jako ostrzeżeń.

Tej flagi należy używać w przypadku nieoczekiwanych błędów podczas kompilacji. Aby dowiedzieć się, jak rozwiązać znane zmiany działania, które mogą wystąpić podczas korzystania z AAPT2, przeczytaj artykuł Zmiany w działaniu po zastosowaniu AAPT2.

-zip file file to plik ZIP zawierający katalog res do przeskanowania w poszukiwaniu zasobów.
-output-text-symbols file Generuje plik tekstowy zawierający symbole zasobów w określonym pliku.
-preserve-visibility-of-styleables Jeśli określisz reguły widoczności, zostaną zastosowane do nich te same reguły widoczności, które są używane we wszystkich innych zasobach. W przeciwnym razie wszystkie style są publiczne.
-visibility [public|private|default|] Ustawia widoczność skompilowanych zasobów na określony poziom.
-trace-folder folder Generuje fragment logu czasu JSON systrace do określonego folderu.
-source-path path Ustawia ścieżkę pliku źródłowego skompilowanego pliku zasobów jako path.
-h Wyświetla pomoc dotyczącą narzędzi.
-v Włącza szczegółowe zapisywanie w dzienniku.

Na etapie połączenia AAPT2 scala wszystkie pliki pośrednie generowane podczas fazy kompilacji, takie jak tabele zasobów, binarne pliki XML i przetworzone pliki PNG, a następnie pakuje je w jeden plik APK. Na tym etapie można też wygenerować inne pliki pomocnicze, takie jak pliki reguł R.java i ProGuard. Wygenerowany plik APK nie zawiera jednak kodu bajtowego DEX i jest niepodpisany. Nie możesz wdrożyć tego pliku APK na urządzeniu.

Jeśli nie używasz wtyczki Androida do obsługi Gradle do tworzenia aplikacji z poziomu wiersza poleceń, możesz użyć innych narzędzi wiersza poleceń, takich jak d8, aby skompilować kod bajtowy Java w kod bajtowy Java i użyć narzędzia apksigner, aby podpisać plik APK.

Ogólna składnia funkcji link wygląda tak:

aapt2 link path-to-input-files [options] -o
outputdirectory/outputfilename.apk --manifest AndroidManifest.xml

W poniższym przykładzie AAPT2 scala 2 pliki pośrednie – drawable_Image.flat i values_values.arsc.flat, a także plik AndroidManifest.xml. AAPT2 łączy wynik z plikiem android.jar, który zawiera zasoby zdefiniowane w pakiecie android:

 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

W poleceniu link możesz używać tych opcji:

Tabela 3. Opcje polecenia linku

Opcja Opis
-o path

Określa ścieżkę wyjściową pliku APK powiązanego zasobu.

Jest to flaga wymagana, ponieważ musisz określić ścieżkę wyjściowego pliku APK, który może zawierać połączone zasoby.

--manifest file

Określa ścieżkę do skompilowanego pliku manifestu Androida.

Jest to flaga wymagana, ponieważ plik manifestu zawiera kluczowe informacje o aplikacji, takie jak nazwa pakietu i identyfikator aplikacji.

-I

Podaje ścieżkę do pliku APK android.jar platformy lub innych plików APK, takich jak framework-res.apk, które mogą być przydatne podczas tworzenia funkcji.

Ta flaga jest wymagana, jeśli w plikach zasobów używasz atrybutów z przestrzenią nazw android.
-A directory Określa katalog zasobów, który ma zostać uwzględniony w pliku APK.

W tym katalogu możesz przechowywać oryginalne, nieprzetworzone pliki. Więcej informacji znajdziesz w artykule Uzyskiwanie dostępu do oryginalnych plików.

-R file Przekazuje pojedynczy plik .flat do link z użyciem semantyki overlay bez użycia tagu <add-resource>.

Gdy udostępniasz plik zasobów, który nakłada się na istniejący plik, używany jest ostatni podany zasób będący w konflikcie.

--package-id package-id Określa identyfikator pakietu dla aplikacji.

Podany identyfikator pakietu musi być większy lub równy 0x7f, chyba że używasz go w połączeniu z --allow-reserved-package-id.

--allow-reserved-package-id

Zezwala na użycie zarezerwowanego identyfikatora pakietu.

Zarezerwowane identyfikatory pakietów to identyfikatory, które są zwykle przypisywane do bibliotek udostępnionych i mieszczą się w zakresie od 0x02 do 0x7e włącznie. Za pomocą --allow-reserved-package-id możesz przypisywać identyfikatory, które należą do zakresu zarezerwowanych identyfikatorów pakietów.

Tej opcji należy używać tylko w przypadku pakietów z min-sdk w wersji 26 lub starszej.

--java directory Określa katalog, w którym mają zostać wygenerowane R.java.
--proguard proguard_options Generuje plik wyjściowy dla reguł ProGuard.
--proguard-conditional-keep-rules Generuje plik wyjściowy dla reguł ProGuard dla głównego pliku DEX.
--no-auto-version Wyłącza automatyczną obsługę wersji pakietu SDK stylu i układu.
--no-version-vectors Wyłącza automatyczną obsługę wersji elementów rysowanych wektorowych. Używaj tej flagi tylko podczas tworzenia pliku APK za pomocą biblioteki rysowalnych wektorowo.
--no-version-transitions Wyłącza automatyczną obsługę wersji zasobów przenoszenia. Tej flagi możesz używać tylko wtedy, gdy tworzysz plik APK za pomocą biblioteki obsługi przenoszenia.
--no-resource-deduping Wyłącza automatyczne usuwanie duplikatów zasobów o identycznych wartościach w zgodnych konfiguracjach.
--enable-sparse-encoding Włącza kodowanie rozproszonych wpisów za pomocą drzewa wyszukiwania binarnego. Jest to pomocne w przypadku optymalizacji rozmiaru pliku APK, ale kosztem wydajności pobierania zasobów.
-z Wymaga lokalizacji ciągów oznaczonych jako „suggested” (sugerowane).
-c config Zawiera rozdzielaną przecinkami listę konfiguracji.

Jeśli na przykład używasz zależności od biblioteki pomocy, która zawiera tłumaczenia na wiele języków, możesz filtrować zasoby tylko pod kątem danej konfiguracji języka, np. angielskiego lub hiszpańskiego.

Konfigurację języka musisz zdefiniować za pomocą dwuliterowego kodu języka w standardzie ISO 639-1, po którym następuje opcjonalnie dwuliterowy kod regionu w standardzie ISO 3166-1-alpha-2, po którym następuje mała litera „r”. Na przykład pl-rUS.

--preferred-density density Umożliwia AAPT2 wybranie najbliższej gęstości dopasowania i usunięcie wszystkich innych.

W aplikacji dostępnych jest kilka kwalifikatorów gęstości pikseli, np. ldpi, hdpi i xhdpi. Gdy określisz preferowaną gęstość, AAPT2 wybierze i zapisze najbliższą gęstość dopasowania w tabeli zasobów, a wszystkie pozostałe usuwa.

--output-to-dir Przekazuje zawartość pliku APK do katalogu określonego przez -o.

Jeśli po użyciu tej flagi pojawią się błędy, możesz je naprawić, uaktualniając Android SDK Build Tools do wersji 28.0.0 lub nowszej.

--min-sdk-version min-sdk-version Ustawia domyślną minimalną wersję pakietu SDK używaną w przypadku AndroidManifest.xml.
--target-sdk-version target-sdk-version Ustawia domyślną docelową wersję pakietu SDK używaną w przypadku AndroidManifest.xml.
--version-code version-code Określa kod wersji, który ma być wstrzyknięty do elementu AndroidManifest.xml, jeśli nie ma podanego kodu.
--version-name version-name Określa nazwę wersji do wstrzyknięcia do funkcji AndroidManifest.xml, jeśli jej nie ma.
--revision-code revision-code Określa kod wersji, który ma być wstrzykiwany do pliku AndroidManifest.xml, jeśli nie ma żadnego kodu.
--replace-version Jeśli określono --version-code, --version-name lub --revision-code, te wartości zastąpią dowolną wartość znajdującą się już w pliku manifestu. Domyślnie nic się nie zmienia, jeśli w pliku manifestu są już określone te atrybuty.
--compile-sdk-version-nacodeme compile-sdk-version-name Określa kod wersji, który ma być wstrzykiwany do pliku AndroidManifest.xml, jeśli nie ma podanego kodu.
--compile-sdk-version-name compile-sdk-version-name Określa nazwę wersji do wstrzyknięcia do pliku AndroidManifest.xml, jeśli nie podano żadnej.
--proto-format Generuje skompilowane zasoby w formacie Protobuf.

nadaje się jako dane wejściowe do bundletool przy generowaniu pakietu Android App Bundle.

--non-final-ids Generuje obiekt R.java z nieostatecznymi identyfikatorami zasobów. Odniesienia do identyfikatorów z kodu aplikacji nie są wbudowane podczas kompilacji kotlinc lub javac.
--emit-ids path Emituje plik o podanej ścieżce z listą nazw typów zasobów i ich mapowań identyfikatorów. Można jej używać z urządzeniem --stable-ids.
--stable-ids outputfilename.ext Przetwarza plik wygenerowany za pomocą funkcji --emit-ids, który zawiera listę nazw typów zasobów i przypisanych do nich identyfikatorów.

Ta opcja sprawia, że przypisane identyfikatory pozostają stabilne nawet wtedy, gdy podczas łączenia usuniesz lub dodasz nowe zasoby.

--custom-package package_name Określa niestandardowy pakiet Javy, w którym ma zostać wygenerowany plik R.java.
--extra-packages package_name Generuje ten sam plik R.java, ale z różnymi nazwami pakietów.
--add-javadoc-annotation annotation Dodaje adnotację JavaDoc do wszystkich wygenerowanych klas Java.
--output-text-symbols path Generuje plik tekstowy zawierający symbole zasobów klasy R w podanym pliku.

Musisz podać ścieżkę do pliku wyjściowego.

--auto-add-overlay Umożliwia dodawanie nowych zasobów do nakładek bez użycia tagu <add-resource>.
--rename-manifest-package manifest-package Zmienia nazwę pakietu w pliku AndroidManifest.xml.
--rename-instrumentation-target-package instrumentation- target-package Zmienia nazwę pakietu docelowego na instrumentation.

Tej opcji należy używać w połączeniu z właściwością --rename-manifest-package.

-0 extension

Określa rozszerzenia plików, których nie chcesz skompresować.

--split path:config[,config[..]] Dzieli zasoby na podstawie zestawu konfiguracji w celu wygenerowania innej wersji pliku APK.

Musisz podać ścieżkę do wyjściowego pliku APK wraz z zestawem konfiguracji.

--proguard-main-dex file Plik wyjściowy wygenerowanych reguł ProGuard dla głównego pliku DEX.
--proguard-minimal-keep-rules Generuje minimalny zestaw reguł przechowywania ProGuard.
--no-resource-removal Wyłącza automatyczne usuwanie zasobów bez wartości domyślnych. Tej opcji należy używać tylko podczas tworzenia pakietów nakładek zasobów środowiska wykonawczego.
-x Flaga starszej wersji, która określa użycie identyfikatora pakietu 0x01.
--product products-list Określa rozdzieloną przecinkami listę nazw produktów do zachowania.
--no-xml-namespaces Usuwa prefiks przestrzeni nazw XML i informacje o identyfikatorze URI z pliku AndroidManifest.xml i plików binarnych XML w res/*.
--shared-lib Generuje udostępnianą bibliotekę środowiska wykonawczego Androida.
--static-lib Generuje statyczną bibliotekę Androida.
--no-static-lib-packages Scala wszystkie zasoby biblioteki w ramach pakietu aplikacji.
--no-proguard-location-reference Uniemożliwia plikom z regułami ProGuard odwołanie do pliku źródłowego.
--private-symbols package-name package-name określa nazwę pakietu, która ma być używana podczas generowania R.java dla symboli prywatnych. Jeśli go nie podasz, symbole publiczne i prywatne będą używać nazwy pakietu aplikacji.
--override-styles-instead-of-overlaying Powoduje, że style zdefiniowane w zasobach -R zastępują poprzednie definicje zamiast ich scalania.
--rename-resources-package package-name Zmienia nazwę pakietu w tabeli zasobów na package-name.
--no-compress Nie kompresuje żadnych zasobów.
--keep-raw-values Zachowuje nieprzetworzone wartości atrybutów w plikach XML.
--no-compress-regex regular-expression Nie kompresuje rozszerzeń pasujących do regular-expression. Na końcu wiersza użyj symbolu $. Wykorzystuje gramatyka wyrażeń regularnych ECMAScript z uwzględnieniem wielkości liter.
--warn-manifest-validation Traktuje błędy weryfikacji pliku manifestu jako ostrzeżenia.
--exclude-configs qualifier[,qualifier[..]] Wyklucza wartości zasobów, których konfiguracje zawierają określone kwalifikatory.
--debug-mode Wstawia android:debuggable="true" do węzła aplikacji pliku manifestu, co umożliwia debugowanie aplikacji nawet na urządzeniach produkcyjnych.
--strict-visibility Nakładki o różnych poziomach widoczności nie są dozwolone.
--exclude-sources Nie serializuje informacji o plikach źródłowych podczas generowania zasobów w formacie Protobuf.
--trace-folder folder Generuje fragment logu JSON systrace dla określonego pliku folder.
--merge-only Scala tylko zasoby bez weryfikacji odwołań do zasobów. Tej flagi należy używać tylko z flagą --static-lib.
-h Wyświetla menu pomocy.
-v Włącza większą szczegółowość danych wyjściowych.

Zrzuć

dump służy do drukowania informacji o pliku APK wygenerowanym za pomocą polecenia link.

Składnia zrzutu

Ogólna składnia funkcji dump wygląda tak:

aapt2 dump sub-command filename.apk [options]

Ten przykładowy kod wyświetla treść z tabeli zasobów określonego pliku APK:

aapt2 dump resources output.apk

Zrzuć podpolecenia

W poleceniu dump określ jedno z tych poleceń podrzędnych:

Tabela 4. Zrzuć podpolecenia

Polecenie podrzędneOpis
apc Drukuje zawartość kontenera AAPT2 (APC) wygenerowanego podczas kompilacji.
badging Drukuje informacje wyodrębnione z pliku manifestu pakietu APK.
configurations Drukuje każdą konfigurację używaną przez zasób w pliku APK.
overlayable Drukuje dostępne do nakładania zasoby pliku APK.
packagename Drukuje nazwę pakietu APK.
permissions Drukuje uprawnienia wyodrębnione z pliku manifestu pakietu APK.
strings Drukuje zawartość puli ciągów znaków w tabeli zasobów pakietu APK.
styleparents Drukuje elementy nadrzędne stylów używanych w pliku APK.
resources Drukuje zawartość tabeli zasobów pakietu APK.
xmlstrings Drukuje ciągi znaków ze skompilowanego pliku XML pakietu APK.
xmltree Drukuje drzewo skompilowanego pliku XML pakietu APK.

Opcje zrzutu

Użyj tych opcji w polu dump:

Tabela 5. Opcje zrzutu

OpcjaOpis
--no-values Pomija dane wyjściowe wartości podczas wyświetlania zasobu.
--file file Określa plik jako argument do zrzutu z pakietu APK.
-v Zwiększa szczegółowość danych wyjściowych.

Różnice

Użyj narzędzia diff, aby porównać 2 pliki APK i wykryć różnice między nimi.

Składnia różnic

Ogólna składnia funkcji diff wygląda tak:

aapt2 diff first.apk second.apk

Nie ma opcji dla polecenia diff.

Optymalizuj

optimize służy do optymalizacji scalonych zasobów i resources.arsc przed ich spakowaniem do pliku APK. Ta optymalizacja może zmniejszyć rozmiar pliku APK o około 1–3% w zależności od rozmiaru i liczby używanych zasobów.

Optymalizuj składnię

Ogólna składnia funkcji optimize wygląda tak:

aapt2 optimize options file[,file[..]]

Ten przykład optymalizuje zasoby w input.apk i tworzy nowy, zoptymalizowany plik APK w usłudze output.apk. Zastępuje on zwykłą tabelę płaską bardziej kompaktowym drzewem wyszukiwania binarnego, dzięki czemu plik APK jest mniejszy, a koszt pobierania jest mniejszy:

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

Opcje optymalizacji

W optimize możesz używać tych opcji:

Tabela 6. Opcje optymalizacji

OpcjaOpis
-o path Określa ścieżkę wyjściową pliku APK powiązanego zasobu.

Jest to flaga wymagana, ponieważ musisz określić ścieżkę wyjściowego pliku APK, który może zawierać połączone zasoby.

-d directory Określa ścieżkę do katalogu wyjściowego na potrzeby podziałów.
-x path Określa ścieżkę do pliku konfiguracji XML.
-p Drukuje artefakty z wieloma plikami APK i kończy działanie.
--target-densities density[,density[..]] Określa rozdzieloną przecinkami listę gęstości ekranu, pod kątem których plik APK jest zoptymalizowany. Wszystkie zasoby, które nie byłyby używane na urządzeniach o danej gęstości, są usuwane z pliku APK.
--resources-config-path path

Określa ścieżkę do pliku resources.cfg zawierającego listę zasobów i dyrektyw do poszczególnych zasobów.

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

-c config[,config[..]] Określa rozdzieloną przecinkami listę konfiguracji do uwzględnienia. Wartością domyślną są wszystkie konfiguracje.
--split path:config[,config[..]] Dzieli zasoby na podstawie zestawu konfiguracji w celu wygenerowania innej wersji pliku APK.

Musisz podać ścieżkę do wyjściowego pliku APK wraz z zestawem konfiguracji.

--keep-artifacts artifact[,artifact[..]] Określa rozdzieloną przecinkami listę artefaktów do zachowania. Jeśli nie podasz żadnej wartości, wszystkie artefakty zostaną zachowane.
--enable-sparse-encoding Włącza kodowanie rozproszonych wpisów za pomocą drzewa wyszukiwania binarnego. Ta opcja jest przydatna do optymalizacji rozmiaru pliku APK, ale wiąże się z kosztem wydajności pobierania zasobów.
--collapse-resource-names Zwiń nazwy zasobów do pojedynczej wartości w puli ciągów kluczy. Zasoby są wykluczane przy użyciu dyrektywy no_collapse w pliku wskazanym w zasadzie --resources-config-path.
--shorten-resource-paths Skraca ścieżki zasobów w pliku APK.
--resource-path-shortening-map path Określa ścieżkę do wyświetlenia mapy starych ścieżek zasobów na skrócone ścieżki.
-v Zwiększa szczegółowość danych wyjściowych.
-h Wyświetla pomoc do narzędzia.

Konwertuj

Domyślnie polecenie compile AAPT kompiluje zasoby do formatu binarnego odpowiedniego dla plików APK. Możesz też określić format protobufa odpowiedni dla pakietu aplikacji na Androida, określając parametr --proto-format. Polecenie convert konwertuje pliki APK między tymi dwoma formatami.

Konwertuj składnię

Ogólna składnia convert wygląda tak:

aapt2 convert -o output-file options file[,file[..]]

Poniższy przykład konwertuje zasoby w input.apk i tworzy nowy plik APK w output.apk, który zawiera zasoby w formacie protobuf. Zastępuje ona zwykłą reprezentację płaskiej tabeli bardziej kompaktowym drzewem wyszukiwania binarnego, dzięki czemu plik APK jest mniejszy, a jego pobieranie jest większe:

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

Opcje konwersji

Użyj tych opcji w polu convert:

Tabela 7. Opcje konwersji

OpcjaOpis
-o path

Określa ścieżkę wyjściową pliku APK powiązanego zasobu.

Jest to flaga wymagana, ponieważ musisz określić ścieżkę wyjściowego pliku APK, który może zawierać połączone zasoby.

--output-format [proto|binary] Format danych wyjściowych. Akceptowane wartości to proto i binary. Jeśli nie jest skonfigurowana, domyślnie przyjmuje wartość binary.
--enable-sparse-encoding Włącza kodowanie rozproszonych wpisów za pomocą drzewa wyszukiwania binarnego. Ta opcja jest przydatna do optymalizacji rozmiaru pliku APK, ale wiąże się z kosztem wydajności pobierania zasobów.
--keep-raw-values Zachowuje nieprzetworzone wartości atrybutów w plikach XML.
-v Zwiększa szczegółowość danych wyjściowych.
-h Wyświetla pomoc do narzędzia.

Tryb demona

W AAPT w wersji 2.19 wprowadziliśmy tryb demona do wydawania poleceń. Tryb demona pozwala wpisać wiele poleceń w ramach jednej sesji AAPT.

Składnia demonów

Uruchom tryb demona za pomocą tego polecenia:

aapt2 daemon

Po uruchomieniu trybu demona możesz wpisywać polecenia. Każdy argument polecenia musi znajdować się w osobnym wierszu, a na końcu polecenia musi być pusty wiersz. Aby wyjść z trybu demona, naciśnij Ctrl+D.

Weź pod uwagę te indywidualne polecenia compile:

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/

W trybie demona te polecenia można wpisywać jako:

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

Opcje trybu demona

Pojedynczą opcją dla trybu demona jest --trace-folder folder, co generuje fragment śledzenia JSON systrace dla określonego folder.

Wersja

Określ wersję AAPT2, której używasz, za pomocą polecenia version:

aapt2 version
Android Asset Packaging Tool (aapt) 2.19-8678579

Zmiany w działaniu po zastosowaniu AAPT2

Przed AAPT2 AAPT była domyślną wersją narzędzia Android Asset Packaging Tool, który został już wycofany. Chociaż AAPT2 powinna od razu działać w starszych projektach, w tej sekcji opisujemy pewne zmiany w działaniach, o których warto wiedzieć.

Hierarchie elementów w pliku manifestu Androida

W poprzednich wersjach AAPT elementy zagnieżdżone w nieprawidłowych węzłach w pliku AndroidManifest.xml były ignorowane lub powodowały wyświetlanie ostrzeżenia. Przeanalizujmy następujący przykład:

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

Poprzednie wersje AAPT ignorowały nieprawidłowy tag <action>.

W przypadku AAPT2 pojawia się ten błąd:

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

Aby rozwiązać ten problem, upewnij się, że elementy manifestu są prawidłowo zagnieżdżone. Więcej informacji znajdziesz w omówieniu pliku manifestu aplikacji.

Deklaracja zasobów

Nie możesz już wskazywać typu zasobu w atrybucie name. Ten przykład nieprawidłowo deklaruje element zasobu attr:

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

Zadeklarowanie w ten sposób typu zasobu powoduje ten błąd kompilacji:

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

Aby naprawić ten błąd, jawnie zadeklaruj typ za pomocą funkcji type="attr":

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

Dodatkowo podczas deklarowania elementu <style> jego element nadrzędny również musi być typem zasobu typu. W przeciwnym razie pojawi się błąd podobny do tego:

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

Nieprawidłowe użycie symboli odniesienia do zasobu @

AAPT2 generuje błędy kompilacji, gdy pominiesz lub nieprawidłowo umieścisz symbole referencyjne do zasobów (@). Na przykład jeśli pominiesz ten symbol podczas określania atrybutu stylu:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
  ...
  <!-- Note the missing '@' symbol when specifying the resource type. -->
  <item name="colorPrimary">color/colorPrimary</item>
</style>

Podczas tworzenia modułu AAPT2 generuje następujący błąd kompilacji:

ERROR: expected color but got (raw string) color/colorPrimary

Jeśli podczas uzyskiwania dostępu do zasobu z przestrzeni nazw android nieprawidłowo wstawisz ten symbol:

...
<!-- When referencing resources from the 'android' namespace, omit the '@' symbol. -->
<item name="@android:windowEnterAnimation"/>

Podczas tworzenia modułu AAPT2 generuje następujący błąd kompilacji:

Error: style attribute '@android:attr/windowEnterAnimation' not found

Nieprawidłowa konfiguracja bibliotek

Jeśli Twoja aplikacja korzysta z biblioteki zewnętrznej, która została utworzona przy użyciu starszych wersji narzędzi do kompilacji Android SDK, może ona ulec awarii w czasie działania bez wyświetlania żadnych błędów ani ostrzeżeń. Ta awaria może wystąpić, ponieważ podczas tworzenia biblioteki pola R.java mają wartość final. W efekcie wszystkie identyfikatory zasobów są wbudowane w klasy biblioteki.

Podczas tworzenia aplikacji AAPT2 wymaga ponownego przypisania identyfikatorów do zasobów biblioteki. Jeśli biblioteka zakłada, że identyfikatory to final, i umieszcza je w pliku DEX, występuje niedopasowanie środowiska wykonawczego.

Aby naprawić ten błąd, skontaktuj się z autorem biblioteki w celu jej ponownego utworzenia przy użyciu najnowszej wersji narzędzi do kompilacji Android SDK, a następnie ponownie opublikuj bibliotekę.