AAPT2

AAPT2 (Android Asset Packaging Tool) to narzędzie do kompilacji, którego Android Studio i wtyczka Androida do Gradle używają do kompilowania i pakowania zasobów aplikacji. AAPT2 analizuje, indeksuje i kompiluje zasoby do formatu binarnego zoptymalizowanego pod kątem platformy Android.

Wtyczka Androida do obsługi Gradle w wersji 3.0.0 i nowszej domyślnie włącza AAPT2. Zwykle nie musisz samodzielnie wywoływać funkcji aapt2. Jeśli jednak wolisz używać terminala i własnego systemu kompilacji zamiast Androida Studio, możesz użyć narzędzia AAPT2 z poziomu wiersza poleceń. Błędy kompilacji związane z narzędziem AAPT2 możesz 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 do 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 pakietu SDK znajdź AAPT2 w folderze android_sdk/build-tools/version/.

Wersje narzędzi Android SDK Build Tools nie są publikowane często, więc wersja AAPT2 dołączona do tych narzędzi może nie być najnowsza. Aby pobrać najnowszą wersję AAPT2, pobierz AAPT2 z Google Maven.

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

AAPT2 obsługuje szybszą kompilację zasobów, umożliwiając kompilację przyrostową. Aby przeprowadzić kompilację przyrostową, przetwarzanie zasobów jest dzielone na 2 etapy:

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

Ten podział pomaga zwiększyć skuteczność przyrostowych kompilacji. Jeśli na przykład zmiany zostaną wprowadzone w jednym pliku, musisz ponownie skompilować tylko ten plik.

Pobieranie AAPT2 z Google Maven

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

  1. W indeksie repozytorium przejdź do com.android.tools.build > aapt2.
  2. Skopiuj nazwę najnowszej wersji AAPT2.
  3. Wklej skopiowaną nazwę wersji do tego adresu 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 na Windowsa, użyj tego linku: 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. Otwórz adres URL w przeglądarce. Pobieranie AAPT2 wkrótce się rozpocznie.

  5. Rozpakuj pobrany przed chwilą plik JAR.

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

Kompilacja

AAPT2 obsługuje kompilację wszystkich typów zasobów Androida, takich jak pliki rysunków i XML. Gdy wywołujesz AAPT2 do kompilacji, w każdym wywołaniu przekaż jako dane wejściowe pojedynczy plik zasobu. Następnie AAPT2 analizuje plik i generuje pośredni plik binarny z rozszerzeniem .flat.

Podczas przekazywania całych katalogów AAPT2 ponownie kompiluje wszystkie pliki w katalogu, nawet jeśli zmienił się tylko jeden zasób. Chociaż możesz przekazywać do AAPT2 katalogi zasobów zawierające więcej niż 1 plik zasobu za pomocą flagi --dir, nie uzyskasz w ten sposób korzyści z przyrostowej kompilacji zasobów.

Typy plików wyjściowych mogą się różnić w zależności od danych wejściowych podanych do kompilacji, jak pokazano w tabeli poniżej:

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

Urządzenie wejściowe Urządzenie wyjściowe
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 inne niż pliki w katalogu res/values/ są konwertowane na binarne pliki XML z rozszerzeniem *.flat.

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

Pliki wyjściowe AAPT2 nie są plikami wykonywalnymi. Musisz je później uwzględnić jako dane wejściowe w fazie łączenia, aby wygenerować plik APK. 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 używania compile jest taka:

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

W poniższym przykładzie AAPT2 kompiluje pliki zasobów o nazwach values.xmlmyImage.png oddzielnie:

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 przypadku powyższego przykładu, w którym plik wejściowy to strings.xml, aapt2 automatycznie nadaje plikowi wyjściowemu nazwę values-en_strings.arsc.flat. Skompilowany plik drawable przechowywany w katalogu drawable ma jednak nazwę drawable_img.png.flat.

Opcje kompilacji

Z poleceniem compile możesz używać kilku opcji, jak pokazano w tabeli 2:

Tabela 2. Opcje polecenia kompilacji

Opcja Opis
-o path

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

Jest to wymagana flaga, ponieważ musisz podać ścieżkę do katalogu, w którym AAPT2 może zapisywać skompilowane zasoby.

--dir directory

Określa katalog do skanowania pod kątem zasobów.

Chociaż możesz użyć tej flagi do skompilowania wielu plików zasobów za pomocą jednego polecenia, wyłącza ona zalety kompilacji przyrostowej. Dlatego nie należy używać tego flagi w przypadku dużych projektów.

--pseudo-localize Generuje pseudolokalizowane wersje domyślnych ciągów znaków, np. en-XAen-XB.
--no-crunch Wyłącza przetwarzanie plików PNG.

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

--legacy Traktuje błędy, które są dopuszczalne w starszych wersjach AAPT, jako ostrzeżenia.

Tej flagi należy używać w przypadku nieoczekiwanych błędów kompilacji. Aby rozwiązać problemy ze znanymi zmianami w działaniu, które mogą wystąpić podczas korzystania z AAPT2, przeczytaj artykuł Zmiany w działaniu podczas korzystania z AAPT2.

-zip file file to plik ZIP zawierający katalog res, w którym będą skanowane zasoby.
-output-text-symbols file Generuje plik tekstowy zawierający symbole zasobów w określonym pliku.
-preserve-visibility-of-styleables Jeśli zostanie określona, stosuje te same reguły widoczności w przypadku elementów, które można dostosowywać i które są używane we wszystkich innych zasobach. W przeciwnym razie wszystkie elementy podlegające stylowi zostaną upublicznione.
-visibility [public|private|default|] Ustawia widoczność skompilowanych zasobów na określonym poziomie.
-trace-folder folder Generuje systracefragment śladu JSON w określonym folderze.
-source-path path Ustawia ścieżkę pliku źródłowego skompilowanego pliku zasobów na path.
-h Wyświetla pomoc dotyczącą narzędzi.
-v Włącza logowanie szczegółowe.

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

Jeśli nie używasz wtyczki Androida do Gradle, aby kompilować aplikację z wiersza poleceń, możesz użyć innych narzędzi wiersza poleceń, np. d8 do kompilowania kodu bajtowego Java do kodu bajtowego DEX i apksigner do podpisywania pliku APK.

Ogólna składnia używania link jest taka:

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.flatvalues_values.arsc.flat oraz plik AndroidManifest.xml. AAPT2 łączy wynik z android.jar plikiem, 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

Z poleceniem link możesz używać tych opcji:

Tabela 3. Opcje polecenia linku

Opcja Opis
-o path

Określa ścieżkę wyjściową do połączonego zasobu APK.

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

--manifest file

Określa ścieżkę do pliku manifestu Androida, który ma zostać utworzony.

Jest to wymagany tag, ponieważ plik manifestu zawiera podstawowe informacje o aplikacji, takie jak nazwa pakietu i identyfikator aplikacji.

-I

Zawiera ścieżkę do android.jar platformy lub innych plików APK, np. framework-res.apk, co może być przydatne podczas tworzenia funkcji.

Ten flag jest wymagany, 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.

Możesz używać tego katalogu do przechowywania oryginalnych, nieprzetworzonych plików. Więcej informacji znajdziesz w artykule Dostęp do oryginalnych plików.

-R file Przekazuje pojedynczy plik .flat do link, używając semantyki overlay bez użycia tagu <add-resource>.

Jeśli podasz plik zasobu, który nakłada się na istniejący plik, użyty zostanie ostatni podany zasób, który powoduje konflikt.

--package-id package-id Określa identyfikator pakietu, który ma być używany w aplikacji.

Określony identyfikator pakietu musi być większy lub równy 0x7f, chyba że jest używany w połączeniu z --allow-reserved-package-id.

--allow-reserved-package-id

Zezwala na używanie zastrzeżonego identyfikatora pakietu.

Zarezerwowane identyfikatory pakietów to identyfikatory, które są zwykle przypisywane do bibliotek współdzielonych i mieszczą się w zakresie od 0x02 do 0x7e włącznie. Używając --allow-reserved-package-id, możesz przypisywać identyfikatory, które mieszczą się w zakresie zarezerwowanych identyfikatorów pakietów.

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

--java directory Określa katalog, w którym ma zostać wygenerowany plik R.java.
--proguard proguard_options Generuje plik wyjściowy reguł ProGuard.
--proguard-conditional-keep-rules Generuje plik wyjściowy reguł ProGuard dla głównego pliku DEX.
--no-auto-version Wyłącza automatyczne wersjonowanie SDK stylu i układu.
--no-version-vectors Wyłącza automatyczne wersjonowanie rysunków wektorowych. Używaj tego parametru tylko wtedy, gdy tworzysz plik APK za pomocą biblioteki Vector Drawable.
--no-version-transitions Wyłącza automatyczne tworzenie wersji zasobów przejścia. Używaj tego parametru tylko podczas kompilowania pliku APK za pomocą biblioteki Transition Support.
--no-resource-deduping Wyłącza automatyczne usuwanie duplikatów zasobów o identycznych wartościach w przypadku zgodnych konfiguracji.
--enable-sparse-encoding Umożliwia rzadkie kodowanie wpisów zasobów. Prowadzi to do zmniejszenia rozmiaru pliku APK, zużycia pamięci i opóźnienia uruchamiania oraz niewielkiego wydłużenia czasu wyszukiwania poszczególnych zasobów po uruchomieniu.
-z Wymaga przetłumaczenia ciągów oznaczonych jako „sugerowane”.
-c config Zawiera rozdzielaną przecinkami listę konfiguracji.

Jeśli na przykład masz zależności od biblioteki pomocy, która zawiera tłumaczenia na wiele języków, możesz filtrować zasoby tylko dla danej konfiguracji językowej, np. angielskiej lub hiszpańskiej.

Musisz zdefiniować konfigurację języka za pomocą dwuliterowego kodu języka ISO 639-1, opcjonalnie uzupełnionego o dwuliterowy kod regionu ISO 3166-1-alfa-2 poprzedzony małą literą „r”. Na przykład en-rUS.

--preferred-density density Umożliwia AAPT2 wybranie najbliższej pasującej gęstości i usunięcie wszystkich pozostałych.

W aplikacji możesz używać kilku kwalifikatorów gęstości pikseli, takich jak ldpi, hdpi i xhdpi. Gdy określisz preferowaną gęstość, narzędzie AAPT2 wybierze i zapisze w tabeli zasobów najbliższą pasującą gęstość, a wszystkie pozostałe usunie.

--output-to-dir Wyświetla zawartość pliku APK w katalogu określonym przez -o.

Jeśli podczas korzystania z tego flagi wystąpią błędy, możesz je rozwiązać, aktualizując narzędzia Android SDK Build Tools do wersji 28.0.0 lub nowszej.

--min-sdk-version min-sdk-version Ustawia domyślną minimalną wersję pakietu SDK do użycia w przypadku AndroidManifest.xml.
--target-sdk-version target-sdk-version Ustawia domyślną wersję pakietu SDK, która ma być używana w przypadku AndroidManifest.xml.
--version-code version-code Określa kod wersji, który ma zostać wstrzyknięty do AndroidManifest.xml, jeśli nie jest on obecny.
--version-name version-name Określa nazwę wersji, która ma zostać wstawiona do elementu AndroidManifest.xml, jeśli nie jest on obecny.
--revision-code revision-code Określa kod wersji, który ma zostać wstawiony do pliku AndroidManifest.xml, jeśli nie ma w nim żadnego kodu.
--replace-version Jeśli określono wartości --version-code, --version-name lub --revision-code, zastępują one wszystkie wartości, które są już w pliku manifestu. Domyślnie nic się nie zmienia, jeśli plik manifestu już definiuje te atrybuty.
--compile-sdk-version-nacodeme compile-sdk-version-name Określa kod wersji, który ma zostać wstawiony do pliku AndroidManifest.xml, jeśli nie ma w nim kodu wersji.
--compile-sdk-version-name compile-sdk-version-name Określa nazwę wersji, która ma zostać wstawiona do pliku AndroidManifest.xml, jeśli nie ma w nim nazwy.
--proto-format Generuje skompilowane zasoby w formacie Protobuf.

Nadaje się jako dane wejściowe dla bundletool do generowania pakietu Android App Bundle.

--non-final-ids Generuje R.java z nieostatecznymi identyfikatorami zasobów. Odwołania do identyfikatorów z kodu aplikacji nie są wstawiane podczas kompilacji kotlinc ani javac.
--emit-ids path Tworzy plik w podanej ścieżce z listą nazw typów zasobów i ich mapowań identyfikatorów. Jest to odpowiednie do użycia z --stable-ids.
--stable-ids outputfilename.ext Korzysta z pliku wygenerowanego za pomocą narzędzia --emit-ids, który zawiera listę nazw typów zasobów i przypisanych do nich identyfikatorów.

Ta opcja pozwala zachować stabilność przypisanych identyfikatorów 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 element R.java.
--extra-packages package_name Generuje ten sam plik R.java, ale z innymi 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 określonym pliku.

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

--auto-add-overlay Umożliwia dodawanie nowych zasobów w nakładkach bez używania 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 opcją --rename-manifest-package.

-0 extension

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

--split path:config[,config[..]] Dzieli zasoby na podstawie zestawu konfiguracji, aby wygenerować inną wersję 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ł ProGuard keep.
--no-resource-removal Wyłącza automatyczne usuwanie zasobów bez wartości domyślnych. Używaj tej opcji tylko podczas tworzenia pakietów nakładek zasobów środowiska wykonawczego.
-x Starsza flaga, 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 AndroidManifest.xml.res/*
--shared-lib Generuje udostępnioną bibliotekę środowiska wykonawczego Androida.
--static-lib Generuje statyczną bibliotekę Androida.
--no-static-lib-packages Łączy wszystkie zasoby biblioteki w pakiecie aplikacji.
--no-proguard-location-reference Zapobiega odwoływaniu się plików reguł ProGuard 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 nie zostanie określona, symbole publiczne i prywatne będą używać nazwy pakietu aplikacji.
--override-styles-instead-of-overlaying Powoduje, że style zdefiniowane w -R zasobach zastępują poprzednie definicje, a nie są z nimi łączone.
--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 surowe wartości atrybutów w plikach XML.
--no-compress-regex regular-expression Nie kompresuje rozszerzeń pasujących do wzorca regular-expression. Użyj symbolu $ na końcu wiersza. Używa składni wyrażeń regularnych ECMAScript z uwzględnianiem 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 w manifeście, dzięki czemu aplikację można debugować nawet na urządzeniach produkcyjnych.
--strict-visibility Nie zezwala na nakładki o różnych poziomach widoczności.
--exclude-sources Nie serializuje informacji o pliku źródłowym podczas generowania zasobów w formacie Protobuf.
--trace-folder folder Generuje fragment śladu JSON systrace do określonego folder.
--merge-only Łączy tylko zasoby bez weryfikowania odwołań do zasobów. Tej flagi należy używać tylko z flagą --static-lib.
-h Wyświetla menu pomocy.
-v Zwiększa 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 używania dump jest taka:

aapt2 dump sub-command filename.apk [options]

Poniższy przykład wyświetla zawartość tabeli zasobów określonego pliku APK:

aapt2 dump resources output.apk

Polecenia podrzędne zrzutu

W poleceniu dump podaj jedno z tych poleceń:

Tabela 4. Polecenia podrzędne zrzutu

PodpolecenieOpis
apc Drukuje zawartość kontenera AAPT2 (APC) wygenerowanego podczas kompilacji.
badging Wyświetla informacje wyodrębnione z pliku manifestu APK.
configurations Wyświetla każdą konfigurację używaną przez zasób w pliku APK.
overlayable Wyświetla zasoby APK, które można nakładać.
packagename Wyświetla nazwę pakietu APK.
permissions Wyświetla uprawnienia wyodrębnione z pliku manifestu APK.
strings Wyświetla zawartość puli ciągów znaków w tabeli zasobów pliku APK.
styleparents Wyświetla elementy nadrzędne stylów używanych w pliku APK.
resources Drukuje zawartość tabeli zasobów pliku APK.
xmlstrings Wyświetla ciągi tekstowe ze skompilowanego pliku XML w pliku APK.
xmltree Drukuje drzewo skompilowanego pliku XML APK.

Opcje zrzutu

Użyj tych opcji w przypadku dump:

Tabela 5. Opcje zrzutu

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

Różnice

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

Składnia różnic

Ogólna składnia używania diff jest taka:

aapt2 diff first.apk second.apk

Polecenie diff nie ma żadnych opcji.

Optymalizuj

optimize służy do przeprowadzania optymalizacji scalonych zasobów i resources.arsc przed spakowaniem ich 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.

Optymalizacja składni

Ogólna składnia używania optimize jest taka:

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

Poniższy przykład optymalizuje zasoby w input.apk i tworzy nowy, zoptymalizowany plik APK w output.apk. Zastępuje zwykłą reprezentację tabeli płaskiej bardziej kompaktową reprezentacją, co prowadzi do zmniejszenia rozmiaru pliku APK, zużycia pamięci i opóźnienia przy uruchamianiu oraz niewielkiego wzrostu czasu wyszukiwania poszczególnych zasobów po uruchomieniu.

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

Opcje optymalizacji

W przypadku urządzenia optimize możesz użyć tych opcji:

Tabela 6. Opcje optymalizacji

OpcjaOpis
-o path Określa ścieżkę wyjściową do połączonego zasobu APK.

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

-d directory Określa ścieżkę do katalogu wyjściowego podziałów.
-x path Określa ścieżkę do pliku konfiguracji XML.
-p Wyświetla artefakty zestawu wielu plików APK i kończy działanie.
--target-densities density[,density[..]] Określa listę rozdzieloną przecinkami gęstości ekranu, dla 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 instrukcje dotyczące każdego z nich.

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

-c config[,config[..]] Określa rozdzielaną przecinkami listę konfiguracji do uwzględnienia. Domyślnie są to wszystkie konfiguracje.
--split path:config[,config[..]] Dzieli zasoby na podstawie zestawu konfiguracji, aby wygenerować inną wersję 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 żadnych wartości, wszystkie artefakty zostaną zachowane.
--enable-sparse-encoding Umożliwia rzadkie kodowanie wpisów zasobów. Prowadzi to do zmniejszenia rozmiaru pliku APK, zużycia pamięci i opóźnienia uruchamiania oraz niewielkiego wydłużenia czasu wyszukiwania poszczególnych zasobów po uruchomieniu.
--collapse-resource-names Zmniejsza liczbę nazw zasobów do jednej wartości w puli ciągów kluczy. Zasoby są wykluczane za pomocą dyrektywy no_collapse w pliku określonym przez --resources-config-path.
--shorten-resource-paths Skraca ścieżki zasobów w pliku APK.
--resource-path-shortening-map path Określa ścieżkę, w której ma zostać zapisana mapa starych ścieżek zasobów do skróconych ścieżek.
-v Zwiększa szczegółowość danych wyjściowych.
-h Wyświetla pomoc dotyczącą narzędzia.

Konwertowanie

Domyślnie polecenie AAPT compile kompiluje zasoby do formatu binarnego, który jest odpowiedni dla plików APK. Możesz też określić format protobuf, który jest odpowiedni dla pakietów AAB, podając --proto-format. Polecenie convert konwertuje pakiety APK między tymi dwoma formatami.

Konwertowanie składni

Ogólna składnia convert jest taka:

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

W tym przykładzie zasoby w input.apk są konwertowane i tworzony jest nowy plik APK w output.apk zawierający zasoby w formacie protobuf. Zastępuje ona zwykłą reprezentację w postaci płaskiej tabeli bardziej kompaktową reprezentacją, co prowadzi do zmniejszenia rozmiaru pliku APK, zużycia pamięci i opóźnienia uruchamiania oraz niewielkiego wzrostu

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

Opcje konwersji

Użyj tych opcji w przypadku convert:

Tabela 7. Opcje konwersji

OpcjaOpis
-o path

Określa ścieżkę wyjściową do połączonego zasobu APK.

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

--output-format [proto|binary] Format danych wyjściowych. Akceptowane wartości to protobinary. Jeśli nie jest ustawiony, przyjmuje się domyślnie binary.
--enable-sparse-encoding Umożliwia rzadkie kodowanie wpisów zasobów. Prowadzi to do zmniejszenia rozmiaru pliku APK, zużycia pamięci i opóźnienia uruchamiania oraz niewielkiego wydłużenia czasu wyszukiwania poszczególnych zasobów po uruchomieniu.
--keep-raw-values Zachowuje surowe wartości atrybutów w plikach XML.
-v Zwiększa szczegółowość danych wyjściowych.
-h Wyświetla pomoc dotyczącą narzędzia.

Tryb demona

W wersji 2.19 narzędzia AAPT wprowadzono tryb demona do wydawania poleceń. Tryb demona umożliwia wpisywanie wielu poleceń w ramach jednej sesji AAPT.

Składnia demona

Uruchom tryb demona za pomocą tego polecenia:

aapt2 daemon

Gdy tryb demona jest uruchomiony, 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, wpisz Control+D.

Rozważ te 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/

Polecenia te można wprowadzać w trybie demona w ten sposób:

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

Jedyną opcją trybu demona jest --trace-folder folder, która generuje fragment śledzenia systrace JSON do określonego folder.

Wersja

Sprawdź, której wersji AAPT2 używasz, za pomocą polecenia version:

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

Zmiany w działaniu podczas korzystania z AAPT2

Przed AAPT2 domyślną wersją narzędzia do pakowania zasobów Androida (Android Asset Packaging Tool) było AAPT, które jest obecnie wycofywane. Chociaż AAPT2 powinien od razu działać w przypadku starszych projektów, w tej sekcji opisujemy niektóre zmiany w działaniu, 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 plikuAndroidManifest.xml były ignorowane lub powodowały wyświetlenie ostrzeżenia. Rozważmy na przykład taką sytuację:

<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 po prostu ignorowały nieprawidłowo umieszczony tag <action>.

W przypadku AAPT2 wyświetla się ten błąd:

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

Aby rozwiązać ten problem, upewnij się, że elementy pliku 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 za pomocą atrybutu name. W tym przykładzie element zasobu attr jest zadeklarowany nieprawidłowo:

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

Zadeklarowanie typu zasobu w ten sposób spowoduje wystąpienie tego błędu kompilacji:

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

Aby rozwiązać ten błąd, jawnie zadeklaruj typ za pomocą 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 musi być też zasobem typu style. W przeciwnym razie pojawi się błąd podobny do tego:

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

Nieprawidłowe użycie symboli odwołania do zasobu @

AAPT2 zgłasza błędy kompilacji, gdy pominiesz lub nieprawidłowo umieścisz symbole odwołań do zasobów (@). Na przykład jeśli pominiesz 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 kompilowania modułu AAPT2 zgłasza ten 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 uwzględnisz symbol:

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

Podczas kompilowania modułu AAPT2 zgłasza ten błąd kompilacji:

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

Nieprawidłowa konfiguracja bibliotek

Jeśli Twoja aplikacja jest zależna od biblioteki innej firmy, która została utworzona przy użyciu starszych wersji narzędzi do kompilacji pakietu SDK Androida, może ona ulec awarii w czasie działania bez wyświetlania błędów ani ostrzeżeń. Ten błąd może wystąpić, ponieważ podczas tworzenia biblioteki pola R.java są deklarowane jako final. W rezultacie wszystkie identyfikatory zasobów są wstawiane w klasach biblioteki.

AAPT2 musi mieć możliwość ponownego przypisywania identyfikatorów do zasobów biblioteki podczas tworzenia aplikacji. Jeśli biblioteka zakłada, że identyfikatory to final, i wstawia je w kodzie DEX biblioteki, występuje niezgodność w czasie działania.

Aby rozwiązać ten problem, skontaktuj się z autorem biblioteki i poproś go o przebudowanie jej za pomocą najnowszej wersji narzędzi do kompilacji pakietu Android SDK oraz ponowne opublikowanie biblioteki.