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:
- W indeksie repozytorium otwórz com.android.tools.build > aapt2.
- Skopiuj nazwę najnowszej wersji AAPT2.
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
Otwórz adres URL w przeglądarce. Wkrótce rozpocznie się pobieranie AAPT2.
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:
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
Dodatkowo wszystkie pliki PNG są domyślnie obcięte i mają rozszerzenia |
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:
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 |
-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 |
-source-path path
|
Ustawia ścieżkę pliku źródłowego skompilowanego pliku zasobów jako |
-h
|
Wyświetla pomoc dotyczącą narzędzi. |
-v
|
Włącza szczegółowe zapisywanie w dzienniku. |
Link
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.
Składnia linku
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
Opcje połączenia
W poleceniu link
możesz używać tych opcji:
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 .
|
-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
|
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ą Tej opcji należy używać tylko w przypadku pakietów z |
--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
|
--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ą |
-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:
Polecenie podrzędne | Opis |
---|---|
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
:
Opcja | Opis |
---|---|
--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:
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. |
-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 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
:
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. |
--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ę.