ААПТ2

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 следующим образом:

  1. В индексе репозитория перейдите к com.android.tools.build > aapt2 .
  2. Скопируйте имя последней версии AAPT2.
  3. Вставьте имя версии, которое вы скопировали, в следующий 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

  4. Перейдите по URL-адресу в браузере. Загрузка AAPT2 начнется в ближайшее время.

  5. Распакуйте только что скачанный JAR-файл.

    Файл JAR должен содержать исполняемый файл aapt2 и некоторые библиотеки, от которых зависит этот исполняемый файл.

Скомпилировать

AAPT2 поддерживает компиляцию всех типов ресурсов Android , таких как графические объекты и XML-файлы. Когда вы вызываете AAPT2 для компиляции, передайте один файл ресурсов в качестве входных данных для каждого вызова. Затем AAPT2 анализирует файл и генерирует промежуточный двоичный файл с расширением .flat .

При передаче целых каталогов AAPT2 перекомпилирует все файлы в каталоге, даже если изменился только один ресурс. Хотя вы можете передавать в AAPT2 каталоги ресурсов, содержащие более одного файла ресурсов, с помощью флага --dir , таким образом вы не получите преимуществ от инкрементной компиляции ресурсов.

Типы выходных файлов могут различаться в зависимости от входных данных, которые вы предоставляете для компиляции, как показано в следующей таблице:

Таблица 1. Типы входных и выходных файлов для компиляции

Вход Выход
Файлы ресурсов XML, такие как String и Style , расположенные в каталоге res/values/ Таблица ресурсов с расширением *.arsc.flat .
Все остальные файлы ресурсов.

Все файлы, кроме файлов в каталоге res/values/ преобразуются в двоичные файлы XML с расширениями *.flat .

Кроме того, все файлы PNG по умолчанию сжимаются и имеют расширения *.png.flat . Если вы решите не сжимать PNG, вы можете использовать опцию --no-crunch во время компиляции.

Выходные файлы 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:

Таблица 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 вы можете использовать следующие параметры:

Таблица 3. Параметры команды Link

Вариант Описание
-o path

Указывает выходной путь для APK связанного ресурса.

Это обязательный флаг, поскольку вы должны указать путь к выходному APK, который может содержать связанные ресурсы.

--manifest file

Указывает путь к файлу манифеста Android для сборки.

Это обязательный флаг, поскольку файл манифеста содержит важную информацию о вашем приложении, например имя пакета и идентификатор приложения.

-I

Предоставляет путь к android.jar или другим APK-файлам платформы, например framework-res.apk , который может быть полезен при создании функций.

Этот флаг необходим , если вы используете атрибуты с пространством имен android в своих файлах ресурсов.
-A directory Указывает каталог ресурсов, который будет включен в APK.

Вы можете использовать этот каталог для хранения исходных необработанных файлов. Чтобы узнать больше, прочитайте Доступ к исходным файлам .

-R file Передает отдельный файл .flat в link , используя семантику overlay без использования тега <add-resource> .

Когда вы предоставляете файл ресурсов, который перекрывает существующий файл, используется последний указанный конфликтующий ресурс.

--package-id package-id Указывает идентификатор пакета, который будет использоваться вашим приложением.

Указанный вами идентификатор пакета должен быть больше или равен 0x7f, если он не используется в сочетании с --allow-reserved-package-id .

--allow-reserved-package-id

Позволяет использовать зарезервированный идентификатор пакета.

Идентификаторы зарезервированных пакетов — это идентификаторы, которые обычно назначаются общим библиотекам и находятся в диапазоне от 0x02 до 0x7e включительно. Используя --allow-reserved-package-id , вы можете назначать идентификаторы, попадающие в диапазон зарезервированных идентификаторов пакетов.

Эту опцию следует использовать только для пакетов с версией min-sdk 26 или ниже.

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

Подходит в качестве входных данных для bundletool для создания пакета приложений Android.

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

Эту опцию следует использовать вместе с --rename-manifest-package .

-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 укажите одну из следующих подкоманд:

Таблица 4. Подкоманды дампа

Подкоманда Описание
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 :

Таблица 5. Параметры дампа

Вариант Описание
--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 вы можете использовать следующие параметры:

Таблица 6. Варианты оптимизации

Вариант Описание
-o path Указывает выходной путь для APK связанного ресурса.

Это обязательный флаг, поскольку вы должны указать путь к выходному APK, который может содержать связанные ресурсы.

-d directory Указывает путь к выходному каталогу для разделения.
-x path Указывает путь к файлу конфигурации XML.
-p Распечатывает артефакты из нескольких APK и завершает работу.
--target-densities density[,density[..]] Указывает разделенный запятыми список плотностей экрана, для которых оптимизирован APK. Из APK удаляются все ресурсы, которые не использовались бы на устройствах с заданной плотностью.
--resources-config-path path

Указывает путь к файлу resources.cfg , содержащему список ресурсов и директивы для каждого ресурса.

Формат: 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 :

Таблица 7. Параметры конвертации

Вариант Описание
-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 и повторно опубликовал библиотеку.