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:
- W indeksie repozytorium przejdź do com.android.tools.build > aapt2.
- Skopiuj nazwę najnowszej wersji AAPT2.
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
Otwórz adres URL w przeglądarce. Pobieranie AAPT2 wkrótce się rozpocznie.
Rozpakuj pobrany przed chwilą plik JAR.
Plik JAR powinien zawierać plik wykonywalny
aapt2i 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
Dodatkowo wszystkie pliki PNG są domyślnie kompresowane i mają rozszerzenie |
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.xml i myImage.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-XA i en-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 |
-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 |
-source-path path
|
Ustawia ścieżkę pliku źródłowego skompilowanego pliku zasobów na |
-h
|
Wyświetla pomoc dotyczącą narzędzi. |
-v
|
Włącza logowanie szczegółowe. |
Link
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.
Składnia linku
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.flat i values_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
Opcje połączenia
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.
|
-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
|
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
Tej opcji należy używać tylko w przypadku pakietów w wersji |
--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
|
--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ą |
-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
| Podpolecenie | Opis |
|---|---|
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
| Opcja | Opis |
|---|---|
--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
| 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. |
-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 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
| 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. |
--output-format [proto|binary]
|
Format danych wyjściowych. Akceptowane wartości to proto i binary. 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.