AAPT2 (Android Asset Packaging Tool) — это инструмент сборки, который Android Studio и плагин Android Gradle используют для компиляции и упаковки ресурсов вашего приложения. AAPT2 анализирует, индексирует и компилирует ресурсы в двоичный формат, оптимизированный для платформы Android.
Плагин Android Gradle 3.0.0 и выше по умолчанию включает AAPT2. Обычно вам не нужно самостоятельно вызывать aapt2
. Однако если вы предпочитаете использовать свой терминал и собственную систему сборки вместо Android Studio, вы можете использовать AAPT2 из командной строки. Вы также можете отладить ошибки сборки, связанные с AAPT2, из командной строки. Для этого найдите AAPT2 как отдельный инструмент в Android SDK Build Tools 26.0.2 и более поздних версиях.
Чтобы загрузить инструменты сборки Android SDK из командной строки, используйте sdkmanager
и выполните следующую команду:
sdkmanager "build-tools;build-tools-version"
Загрузив инструменты сборки SDK, найдите AAPT2 в android_sdk /build-tools/ version /
.
Поскольку версии инструментов сборки Android SDK выпускаются нечасто, версия AAPT2, включенная в ваши инструменты сборки SDK, может быть не последней. Чтобы получить последнюю версию AAPT2, загрузите AAPT2 из Google Maven .
Чтобы использовать AAPT2 из командной строки в Linux или Mac, выполните команду aapt2
. В Windows запустите команду aapt2.exe
.
AAPT2 поддерживает более быструю компиляцию ресурсов за счет инкрементной компиляции. Для выполнения инкрементной компиляции обработка ресурсов разделена на два этапа:
- Компилировать : компилирует файлы ресурсов в двоичные форматы.
- Ссылка : объединяет все скомпилированные файлы и упаковывает их в один пакет.
Такое разделение помогает повысить производительность инкрементных сборок. Например, если есть изменения в одном файле, вам нужно перекомпилировать только этот файл.
Загрузите AAPT2 из Google Maven
Чтобы получить новейшую версию AAPT2, не включенную в инструменты сборки, загрузите AAPT2 из репозитория Google Maven следующим образом:
- В индексе репозитория перейдите к com.android.tools.build > aapt2 .
- Скопируйте имя последней версии AAPT2.
Вставьте имя версии, которое вы скопировали, в следующий URL-адрес и укажите целевую операционную систему: https://dl.google.com/dl/android/maven2/com/android/tools/build/aapt2/aapt2-version / aapt2-version aapt2-version . aapt2-version - [windows | linux | osx] .jar
Например, чтобы загрузить версию 3.2.0-alpha18-4804415 для Windows, используйте: 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
Перейдите по URL-адресу в браузере. Загрузка AAPT2 начнется в ближайшее время.
Распакуйте только что скачанный JAR-файл.
Файл JAR должен содержать исполняемый файл
aapt2
и некоторые библиотеки, от которых зависит этот исполняемый файл.
Скомпилировать
AAPT2 поддерживает компиляцию всех типов ресурсов Android , таких как графические объекты и XML-файлы. Когда вы вызываете AAPT2 для компиляции, передайте один файл ресурсов в качестве входных данных для каждого вызова. Затем AAPT2 анализирует файл и генерирует промежуточный двоичный файл с расширением .flat
.
При передаче целых каталогов AAPT2 перекомпилирует все файлы в каталоге, даже если изменился только один ресурс. Хотя вы можете передавать в AAPT2 каталоги ресурсов, содержащие более одного файла ресурсов, с помощью флага --dir
, таким образом вы не получите преимуществ от инкрементной компиляции ресурсов.
Типы выходных файлов могут различаться в зависимости от входных данных, которые вы предоставляете для компиляции, как показано в следующей таблице:
Вход | Выход |
---|---|
Файлы ресурсов XML, такие как String и Style , расположенные в каталоге res/values/ | Таблица ресурсов с расширением *.arsc.flat . |
Все остальные файлы ресурсов. | Все файлы, кроме файлов в каталоге Кроме того, все файлы PNG по умолчанию сжимаются и имеют расширения |
Выходные файлы AAPT2 не являются исполняемыми, и вам придется позже включить эти двоичные файлы в качестве входных данных на этапе компоновки для создания APK. Однако сгенерированный APK-файл не является исполняемым файлом, который можно сразу развернуть на устройстве Android, поскольку он не содержит файлов DEX и не подписан.
Синтаксис компиляции
Общий синтаксис использования compile
следующий:
aapt2 compile path-to-input-files [options] -o output-directory/
В следующем примере AAPT2 компилирует файлы ресурсов с values.xml
и 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/
Как показано в таблице 1, имя выходного файла зависит от имени входного файла и имени его родительского каталога.
В предыдущем примере с файлом strings.xml
в качестве входных данных aapt2
автоматически присваивает выходному файлу имя values-en_strings.arsc.flat
. Flat . Однако скомпилированный файл с возможностью рисования, хранящийся в каталоге с возможностью рисования, называется drawable_img.png.flat
.
Варианты компиляции
Есть несколько опций, которые вы можете использовать с командой compile
, как показано в таблице 2:
Вариант | Описание |
---|---|
-o path | Указывает выходной путь для скомпилированных ресурсов. Это обязательный флаг, поскольку вы должны указать путь к каталогу, в котором AAPT2 может выводить и хранить скомпилированные ресурсы. |
--dir directory | Указывает каталог для сканирования ресурсов. Хотя вы можете использовать этот флаг для компиляции нескольких файлов ресурсов с помощью одной команды, он отключает преимущества инкрементальной компиляции. Поэтому этот флаг не следует использовать для крупных проектов. |
--pseudo-localize | Создает псевдолокализованные версии строк по умолчанию, такие как en-XA и en-XB . |
--no-crunch | Отключает обработку PNG. Используйте этот параметр, если вы уже обработали файлы PNG или создаете отладочные сборки, не требующие уменьшения размера файла. Включение этой опции приводит к более быстрому выполнению, но увеличивает размер выходного файла. |
--legacy | Ошибки, допустимые при использовании более ранних версий AAPT, рассматриваются как предупреждения. Этот флаг следует использовать в случае непредвиденных ошибок во время компиляции. Чтобы устранить известные изменения в поведении, которые могут возникнуть при использовании AAPT2, прочтите «Изменения поведения при использовании AAPT2» . |
-zip file | file представляет собой ZIP-файл, содержащий каталог res для сканирования ресурсов. |
-output-text-symbols file | Создает текстовый файл, содержащий символы ресурсов в указанном |
-preserve-visibility-of-styleables | Если указано, применяются те же правила видимости для стилей, которые используются для всех других ресурсов. В противном случае все стили становятся общедоступными. |
-visibility [ public | private | default |] | Устанавливает видимость скомпилированных ресурсов на указанный уровень. |
-trace-folder folder | Создает фрагмент трассировки JSON systrace для указанного |
-source-path path | Устанавливает путь к исходному файлу скомпилированного файла ресурсов равным |
-h | Отображает справку по инструментам. |
-v | Включает подробное ведение журнала. |
Связь
На этапе компоновки AAPT2 объединяет все промежуточные файлы, созданные на этапе компиляции, такие как таблицы ресурсов, двоичные файлы XML и обработанные файлы PNG, а затем упаковывает файлы в один APK. Кроме того, на этом этапе можно создать другие вспомогательные файлы, такие как файлы правил R.java
и ProGuard. Однако сгенерированный APK не содержит байт-кода DEX и не имеет знака. Вы не можете развернуть этот APK на устройстве.
Если вы не используете плагин Android Gradle для создания приложения из командной строки , вы можете использовать другие инструменты командной строки, такие как d8 для компиляции байт-кода Java в байт-код DEX и apksigner для подписи вашего APK.
Синтаксис ссылки
Общий синтаксис использования link
следующий:
aapt2 link path-to-input-files [options] -o outputdirectory/outputfilename.apk --manifest AndroidManifest.xml
В следующем примере AAPT2 объединяет два промежуточных файла: drawable_Image.flat
и values_values.arsc.flat
Flat, а также файл AndroidManifest.xml
. AAPT2 связывает результат с файлом android.jar
, который содержит ресурсы, определенные в пакете 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
Варианты ссылок
С командой link
вы можете использовать следующие параметры:
Вариант | Описание |
---|---|
-o path | Указывает выходной путь для APK связанного ресурса. Это обязательный флаг, поскольку вы должны указать путь к выходному APK, который может содержать связанные ресурсы. |
--manifest file | Указывает путь к файлу манифеста Android для сборки. Это обязательный флаг, поскольку файл манифеста содержит важную информацию о вашем приложении, например имя пакета и идентификатор приложения. |
-I | Предоставляет путь к android в своих файлах ресурсов. |
-A directory | Указывает каталог ресурсов, который будет включен в APK. Вы можете использовать этот каталог для хранения исходных необработанных файлов. Чтобы узнать больше, прочитайте Доступ к исходным файлам . |
-R file | Передает отдельный файл .flat в link , используя семантику overlay без использования тега <add-resource> .Когда вы предоставляете файл ресурсов, который перекрывает существующий файл, используется последний указанный конфликтующий ресурс. |
--package-id package-id | Указывает идентификатор пакета, который будет использоваться вашим приложением. Указанный вами идентификатор пакета должен быть больше или равен 0x7f, если он не используется в сочетании с |
--allow-reserved-package-id | Позволяет использовать зарезервированный идентификатор пакета. Идентификаторы зарезервированных пакетов — это идентификаторы, которые обычно назначаются общим библиотекам и находятся в диапазоне от 0x02 до 0x7e включительно. Используя Эту опцию следует использовать только для пакетов с версией |
--java directory | Указывает каталог для создания R.java . |
--proguard proguard_options | Создает выходной файл для правил ProGuard. |
--proguard-conditional-keep-rules | Создает выходной файл для правил ProGuard для основного DEX. |
--no-auto-version | Отключает автоматическое управление версиями SDK стиля и макета. |
--no-version-vectors | Отключает автоматическое управление версиями векторных изображений. Используйте этот флаг только при создании APK с помощью библиотеки Vector Drawable. |
--no-version-transitions | Отключает автоматическое управление версиями ресурсов перехода. Используйте этот флаг только при создании APK с библиотекой поддержки перехода. |
--no-resource-deduping | Отключает автоматическую дедупликацию ресурсов с одинаковыми значениями в совместимых конфигурациях. |
--enable-sparse-encoding | Включает кодирование разреженных записей с использованием двоичного дерева поиска. Это полезно для оптимизации размера APK, но за счет производительности поиска ресурсов. |
-z | Требуется локализация строк с пометкой «предлагается». |
-c config | Предоставляет список конфигураций, разделенных запятыми. Например, если у вас есть зависимости от библиотеки поддержки, которая содержит переводы для нескольких языков, вы можете фильтровать ресурсы только для данной языковой конфигурации, например английского или испанского. Вы должны определить языковую конфигурацию с помощью двухбуквенного кода языка ISO 639-1, за которым, при необходимости, следует двухбуквенный код региона ISO 3166-1-alpha-2, которому предшествует строчная буква «r». Например, ru-ru. |
--preferred-density density | Позволяет AAPT2 выбирать наиболее близкую совпадающую плотность и удалять все остальные. В вашем приложении можно использовать несколько квалификаторов плотности пикселей, например ldpi, hdpi и xhdpi. Когда вы указываете предпочтительную плотность, AAPT2 выбирает и сохраняет наиболее подходящую плотность в таблице ресурсов и удаляет все остальные. |
--output-to-dir | Выводит содержимое APK в каталог, указанный -o .Если вы получаете какие-либо ошибки при использовании этого флага, вы можете устранить их, обновив Android SDK Build Tools 28.0.0 или более поздней версии . |
--min-sdk-version min-sdk-version | Устанавливает минимальную версию SDK по умолчанию, используемую для AndroidManifest.xml . |
--target-sdk-version target-sdk-version | Устанавливает целевую версию SDK по умолчанию, которая будет использоваться для AndroidManifest.xml . |
--version-code version-code | Указывает код версии для внедрения в AndroidManifest.xml если его нет. |
--version-name version-name | Указывает имя версии, которое будет добавлено в AndroidManifest.xml , если оно отсутствует. |
--revision-code revision-code | Указывает код версии, который нужно добавить в файл AndroidManifest.xml , если его нет. |
--replace-version | Если указаны --version-code , --version-name или --revision-code , эти значения заменяют любое значение, уже содержащееся в манифесте. По умолчанию ничего не меняется, если в манифесте уже определены эти атрибуты. |
--compile-sdk-version-nacodeme compile-sdk-version-name | Указывает код версии для вставки в файл AndroidManifest.xml , если его нет. |
--compile-sdk-version-name compile-sdk-version-name | Указывает имя версии, которое нужно добавить в файл AndroidManifest.xml , если его нет. |
--proto-format | Генерирует скомпилированные ресурсы в формате Protobuf. Подходит в качестве входных данных для |
--non-final-ids | Генерирует R.java с неконечными идентификаторами ресурсов. Ссылки на идентификаторы из кода приложения не встраиваются во время компиляции kotlinc или javac . |
--emit-ids path | Создает файл по заданному пути со списком имен типов ресурсов и сопоставлений их идентификаторов. Это подходит для использования с --stable-ids . |
--stable-ids outputfilename.ext | Использует файл, созданный с помощью --emit-ids , содержащий список названий типов ресурсов и назначенных им идентификаторов.Этот параметр позволяет назначенным идентификаторам оставаться стабильными даже при удалении или добавлении новых ресурсов во время связывания. |
--custom-package package_name | Указывает пользовательский пакет Java для создания R.java . |
--extra-packages package_name | Создает тот же файл R.java , но с другими именами пакетов. |
--add-javadoc-annotation annotation | Добавляет аннотацию JavaDoc ко всем созданным классам Java. |
--output-text-symbols path | Создает текстовый файл, содержащий символы ресурсов класса R в указанном файле.Необходимо указать путь к выходному файлу. |
--auto-add-overlay | Позволяет добавлять новые ресурсы в наложения без использования тега <add-resource> . |
--rename-manifest-package manifest-package | Переименовывает пакет в файле AndroidManifest.xml . |
--rename-instrumentation-target-package instrumentation- target-package | Изменяет имя целевого пакета для instrumentation . Эту опцию следует использовать вместе с |
-0 extension | Указывает расширения файлов, которые вы не хотите сжимать. |
--split path:config[,config[..]] | Разделяет ресурсы на основе набора конфигураций для создания другой версии APK. Необходимо указать путь к выходному APK вместе с набором конфигураций. |
--proguard-main-dex file | Выходной файл для сгенерированных правил ProGuard для основного DEX. |
--proguard-minimal-keep-rules | Создает минимальный набор правил хранения ProGuard. |
--no-resource-removal | Отключает автоматическое удаление ресурсов без значений по умолчанию. Используйте эту опцию только при создании пакетов наложения ресурсов среды выполнения. |
-x | Флаг Legacy, указывающий использование идентификатора пакета 0x01. |
--product products-list | Указывает список названий продуктов, разделенных запятыми, которые необходимо сохранить. |
--no-xml-namespaces | Удаляет префикс пространства имен XML и информацию URI из файла AndroidManifest.xml и двоичных файлов XML в res/* . |
--shared-lib | Создает общую библиотеку времени выполнения Android. |
--static-lib | Создает статическую библиотеку Android. |
--no-static-lib-packages | Объединяет все ресурсы библиотеки в пакете приложения. |
--no-proguard-location-reference | Предохраняет файлы правил ProGuard от ссылки на исходный файл. |
--private-symbols package-name | package-name указывает имя пакета, которое будет использоваться при создании R.java для частных символов. Если не указано, общедоступные и частные символы используют имя пакета приложения. |
--override-styles-instead-of-overlaying | Заставляет стили, определенные в ресурсах -R заменять предыдущие определения вместо их объединения. |
--rename-resources-package package-name | Переименовывает пакет в таблице ресурсов на package-name . |
--no-compress | Не сжимает ресурсы. |
--keep-raw-values | Сохраняет необработанные значения атрибутов в файлах XML. |
--no-compress-regex regular-expression | Не сжимает расширения, соответствующие regular-expression . Используйте символ $ для конца строки. Использует грамматику регулярных выражений ECMAScript с учетом регистра. |
--warn-manifest-validation | Считает ошибки проверки манифеста предупреждениями. |
--exclude-configs qualifier[,qualifier[..]] | Исключает значения ресурсов, конфигурации которых содержат указанные квалификаторы. |
--debug-mode | Вставляет android:debuggable="true" в узел приложения манифеста, делая приложение доступным для отладки даже на производственных устройствах. |
--strict-visibility | Не допускает наложения с разными уровнями видимости. |
--exclude-sources | Не сериализует информацию исходного файла при создании ресурсов в формате Protobuf. |
--trace-folder folder | Создает фрагмент трассировки JSON systrace в указанную folder . |
--merge-only | Только объединяет ресурсы без проверки ссылок на ресурсы. Этот флаг следует использовать только с флагом --static-lib . |
-h | Отображает меню помощи. |
-v | Включает повышенную детализацию вывода. |
Свалка
dump
используется для печати информации об APK, созданном вами с помощью команды link
.
Синтаксис дампа
Общий синтаксис использования dump
следующий:
aapt2 dump sub-command filename.apk [options]
В следующем примере выводится содержимое из таблицы ресурсов указанного APK:
aapt2 dump resources output.apk
Подкоманды дампа
Вместе с командой dump
укажите одну из следующих подкоманд:
Подкоманда | Описание |
---|---|
apc | Печатает содержимое контейнера AAPT2 (APC), созданного во время компиляции. |
badging | Печатает информацию, извлеченную из манифеста APK. |
configurations | Печатает каждую конфигурацию, используемую ресурсом в APK. |
overlayable | Печатает накладываемые ресурсы APK. |
packagename | Печатает имя пакета APK. |
permissions | Печатает разрешения, извлеченные из манифеста APK. |
strings | Печатает содержимое пула строк таблицы ресурсов APK. |
styleparents | Печатает родителей стилей, используемых в APK. |
resources | Печатает содержимое таблицы ресурсов APK. |
xmlstrings | Печатает строки из скомпилированного APK APK. |
xmltree | Печатает дерево XML-файла, скомпилированного APK. |
Параметры дампа
Используйте следующие параметры с dump
:
Вариант | Описание |
---|---|
--no-values | Подавляет вывод значений при отображении ресурса. |
--file file | Указывает файл в качестве аргумента, который будет выгружен из APK. |
-v | Увеличивает детализацию вывода. |
Разница
Используйте diff
для сравнения двух APK и выявления различий между ними.
Синтаксис различий
Общий синтаксис использования diff
следующий:
aapt2 diff first.apk second.apk
Для команды diff
нет опций.
Оптимизировать
optimize
используется для оптимизации объединенных ресурсов и resources.arsc
перед их упаковкой в APK. Эта оптимизация может уменьшить размер APK примерно на 1–3 %, в зависимости от размера и количества используемых ресурсов.
Оптимизировать синтаксис
Общий синтаксис использования optimize
следующий:
aapt2 optimize options file[,file[..]]
В следующем примере ресурсы в input.apk
оптимизируются, а в output.apk
создается новый оптимизированный APK. Он заменяет обычное представление плоской таблицы более компактным двоичным деревом поиска, в результате чего APK становится меньше за счет производительности поиска:
aapt2 optimize -o output.apk --enable-sparse-encoding input.apk
Оптимизировать параметры
С optimize
вы можете использовать следующие параметры:
Вариант | Описание |
---|---|
-o path | Указывает выходной путь для APK связанного ресурса. Это обязательный флаг, поскольку вы должны указать путь к выходному APK, который может содержать связанные ресурсы. |
-d directory | Указывает путь к выходному каталогу для разделения. |
-x path | Указывает путь к файлу конфигурации XML. |
-p | Распечатывает артефакты из нескольких APK и завершает работу. |
--target-densities density[,density[..]] | Указывает разделенный запятыми список плотностей экрана, для которых оптимизирован APK. Из APK удаляются все ресурсы, которые не использовались бы на устройствах с заданной плотностью. |
--resources-config-path path | Указывает путь к файлу Формат: type/resource_name#[directive][,directive] |
-c config[,config[..]] | Указывает список конфигураций, разделенных запятыми, которые необходимо включить. По умолчанию — все конфигурации. |
--split path:config[,config[..]] | Разделяет ресурсы на основе набора конфигураций для создания другой версии APK. Необходимо указать путь к выходному APK вместе с набором конфигураций. |
--keep-artifacts artifact[,artifact[..]] | Указывает список артефактов, разделенных запятыми, которые необходимо сохранить. Если ничего не указано, все артефакты сохраняются. |
--enable-sparse-encoding | Включает кодирование разреженных записей с использованием двоичного дерева поиска. Этот параметр полезен для оптимизации размера APK, но за счет производительности получения ресурсов. |
--collapse-resource-names | Свертывает имена ресурсов до одного значения в пуле строк ключей. Ресурсы исключаются с помощью директивы no_collapse в файле, указанном --resources-config-path . |
--shorten-resource-paths | Сокращает пути к ресурсам внутри APK. |
--resource-path-shortening-map path | Указывает путь для вывода карты старых путей к ресурсам в сокращенные пути. |
-v | Увеличивает детализацию вывода. |
-h | Отображает справку по инструменту. |
Конвертировать
По умолчанию команда compile
AAPT компилирует ресурсы в двоичный формат, подходящий для APK. Также можно указать формат protobuf, подходящий для AAB, указав --proto-format
. Команда convert
преобразует APK-файлы между двумя форматами.
Преобразование синтаксиса
Общий синтаксис convert
выглядит следующим образом:
aapt2 convert -o output-file options file[,file[..]]
В следующем примере ресурсы в input.apk
преобразуются и создается новый APK в output.apk
, содержащий ресурсы формата protobuf. Он заменяет обычное представление плоской таблицы более компактным двоичным деревом поиска, в результате чего APK становится меньше за счет производительности поиска:
aapt2 convert -o output.apk --output-format proto --enable-sparse-encoding input.apk
Конвертировать параметры
Используйте следующие параметры с convert
:
Вариант | Описание |
---|---|
-o path | Указывает выходной путь для APK связанного ресурса. Это обязательный флаг, поскольку вы должны указать путь к выходному APK, который может содержать связанные ресурсы. | --output-format [proto|binary] | Формат вывода. Принимаемые значения — proto и binary . Если не установлено, по умолчанию используется binary . |
--enable-sparse-encoding | Включает кодирование разреженных записей с использованием двоичного дерева поиска. Этот параметр полезен для оптимизации размера APK, но за счет производительности поиска ресурсов. |
--keep-raw-values | Сохраняет необработанные значения атрибутов в файлах XML. |
-v | Увеличивает детализацию вывода. |
-h | Отображает справку по инструменту. |
Режим демона
В AAPT версии 2.19 введен режим демона для выдачи команд. Режим демона позволяет вводить несколько команд за один сеанс AAPT.
Синтаксис демона
Запустите режим демона с помощью следующей команды:
aapt2 daemon
После запуска режима демона вы можете вводить команды. Каждый аргумент команды должен находиться на отдельной строке с пустой строкой в конце команды. Выйдите из режима демона, нажав Control+D.
Рассмотрим следующие отдельные команды 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/
Эти команды можно ввести в режиме демона следующим образом:
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
Параметры режима демона
Единственный параметр для режима демона — это --trace-folder folder
, который генерирует фрагмент трассировки JSON systrace
для указанной folder .
Версия
Определите версию AAPT2, которую вы используете, с помощью команды version
:
aapt2 version Android Asset Packaging Tool (aapt) 2.19-8678579
Поведение меняется при использовании AAPT2
До AAPT2 AAPT был версией по умолчанию инструмента упаковки ресурсов Android, который сейчас устарел. Хотя AAPT2 должен сразу работать со старыми проектами, в этом разделе описаны некоторые изменения в поведении, о которых вам следует знать.
Иерархии элементов в манифесте Android
В предыдущих версиях AAPT элементы, вложенные в неправильные узлы файла AndroidManifest.xml
, либо игнорировались, либо вызывали предупреждение. Например, рассмотрим следующий пример:
<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>
Предыдущие версии AAPT просто игнорировали неуместный тег <action>
.
При использовании AAPT2 вы получаете следующую ошибку:
AndroidManifest.xml:15: error: unknown element <action> found.
Чтобы решить эту проблему, убедитесь, что элементы манифеста вложены правильно. Для получения дополнительной информации прочтите обзор манифеста приложения .
Декларация ресурсов
Вы больше не можете указать тип ресурса из атрибута name
. В следующем примере неправильно объявляется элемент ресурса attr
:
<style name="childStyle" parent="parentStyle"> <item name="attr/my_attr">@color/pink</item> </style>
Такое объявление типа ресурса приводит к следующей ошибке сборки:
Error: style attribute 'attr/attr/my_attr (aka my.package:attr/attr/my_attr)' not found.
Чтобы устранить эту ошибку, явно объявите тип, используя type="attr"
:
<style name="childStyle" parent="parentStyle"> <item type="attr" name="my_attr">@color/pink</item> </style>
Кроме того, при объявлении элемента <style>
его родительский элемент также должен быть типом ресурса стиля. В противном случае вы получите сообщение об ошибке, подобное следующему:
Error: (...) invalid resource type 'attr' for parent of style
Неправильное использование символов ссылки на ресурс @.
AAPT2 выдает ошибки сборки, если вы опускаете или неправильно размещаете символы ссылки на ресурсы ( @
). Например, если вы опустите символ при указании атрибута стиля:
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> ... <!-- Note the missing '@' symbol when specifying the resource type. --> <item name="colorPrimary">color/colorPrimary</item> </style>
При сборке модуля AAPT2 выдает следующую ошибку сборки:
ERROR: expected color but got (raw string) color/colorPrimary
Кроме того, если вы неправильно включили этот символ при доступе к ресурсу из пространства имен android
:
... <!-- When referencing resources from the 'android' namespace, omit the '@' symbol. --> <item name="@android:windowEnterAnimation"/>
При сборке модуля AAPT2 выдает следующую ошибку сборки:
Error: style attribute '@android:attr/windowEnterAnimation' not found
Неправильная настройка библиотек
Если ваше приложение зависит от сторонней библиотеки, созданной с использованием более старых версий Android SDK Build Tools , ваше приложение может аварийно завершить работу во время выполнения без отображения каких-либо ошибок или предупреждений. Этот сбой может произойти из-за того, что во время создания библиотеки поля R.java
объявляются final
. В результате все идентификаторы ресурсов встроены в классы библиотеки.
AAPT2 опирается на возможность переназначать идентификаторы ресурсам библиотеки при создании приложения. Если библиотека предполагает, что идентификаторы являются final
, и встраивает их в библиотеку DEX, возникает несоответствие времени выполнения.
Чтобы устранить эту ошибку, обратитесь к автору библиотеки, чтобы он пересобрал ее с помощью последней версии инструментов сборки Android SDK и повторно опубликовал библиотеку.