ААПТ2

AAPT2 (Android Asset Packaging Tool) — это инструмент сборки, который Android Studio и Android Gradle Plugin используют для компиляции и упаковки ресурсов вашего приложения. AAPT2 анализирует, индексирует и компилирует ресурсы в двоичный формат, оптимизированный для платформы Android.

Плагин Android Gradle версии 3.0.0 и выше включает AAPT2 по умолчанию. Обычно вам не нужно вызывать aapt2 самостоятельно. Однако, если вы предпочитаете использовать терминал и собственную систему сборки вместо Android Studio, вы можете запустить AAPT2 из командной строки. Вы также можете отлаживать ошибки сборки, связанные с AAPT2, из командной строки. Для этого AAPT2 доступен как отдельный инструмент в составе Android SDK Build Tools 26.0.2 и выше.

Чтобы загрузить Android SDK Build Tools из командной строки, используйте sdkmanager и выполните следующую команду:

sdkmanager "build-tools;build-tools-version"

После загрузки SDK Build Tools найдите AAPT2 в android_sdk /build-tools/ version / .

Поскольку обновления Android SDK Build Tools выпускаются нечасто, версия AAPT2, входящая в ваш SDK Build Tools, может быть не самой последней. Чтобы получить последнюю версию AAPT2, скачайте AAPT2 с сайта Google Maven .

Чтобы использовать AAPT2 из командной строки в Linux или Mac, выполните команду aapt2 . В Windows выполните команду aapt2.exe .

AAPT2 поддерживает более быструю компиляцию ресурсов благодаря возможности инкрементальной компиляции. Для реализации инкрементальной компиляции обработка ресурсов разделена на два этапа:

  • Компиляция : компилирует файлы ресурсов в двоичные форматы.
  • Ссылка : объединяет все скомпилированные файлы и упаковывает их в один пакет.

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

Загрузить AAPT2 из Google Maven

Чтобы получить новейшую версию AAPT2, которая не входит в состав инструментов сборки, загрузите AAPT2 из репозитория Maven от Google следующим образом:

  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- 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 . Однако скомпилированный файл drawable, хранящийся в каталоге drawable, называется 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 , а также файл 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 с использованием библиотеки векторных рисунков.
--no-version-transitions Отключает автоматическое версионирование ресурсов перехода. Используйте этот флаг только при сборке APK с библиотекой Transition Support.
--no-resource-deduping Отключает автоматическую дедупликацию ресурсов с одинаковыми значениями в совместимых конфигурациях.
--enable-sparse-encoding Обеспечивает разреженное кодирование записей ресурсов. Это приводит к уменьшению размера APK, потребления памяти и задержки запуска, а также к небольшому увеличению времени поиска отдельных ресурсов после запуска.
-z Требуется локализация строк, помеченных как «рекомендуемые».
-c config Предоставляет список конфигураций, разделенных запятыми.

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

Конфигурацию языка необходимо определить с помощью двухбуквенного кода языка ISO 639-1, за которым (необязательно) следует двухбуквенный код региона ISO 3166-1-alpha-2, которому предшествует строчная буква «r». Например, en-rUS.

--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 Устаревший флаг, который определяет использование идентификатора пакета 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 Генерирует фрагмент трассировки systrace JSON в указанную 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 Печатает строки из скомпилированного XML 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 и создаётся новый оптимизированный APK в output.apk . Он заменяет обычное представление в виде плоской таблицы более компактным, что приводит к уменьшению размера APK, потребления памяти и задержки запуска, а также к небольшому увеличению времени поиска отдельных ресурсов после запуска.

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

Оптимизировать параметры

С optimize можно использовать следующие параметры:

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

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

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

-d directory Указывает путь к выходному каталогу для разделений.
-x path Указывает путь к XML-файлу конфигурации.
-p Выводит на экран артефакты multi-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 Отображает справку по инструменту.

Конвертировать

По умолчанию команда AAPT compile компилирует ресурсы в двоичный формат, подходящий для 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 , которая генерирует фрагмент трассировки systrace JSON для указанной folder .

Версия

Определите используемую вами версию AAPT2 с помощью команды version :

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

Изменения поведения при использовании AAPT2

До AAPT2 AAPT был версией Android Asset Packaging Tool по умолчанию, которая теперь устарела. Хотя 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 Build Tools, и повторно опубликуйте библиотеку.