Как использовать aapt2, где документация?

Я использовал aapt p для упаковки ресурсов и создания R.java.

Но когда я обновился до Android 24, я обнаружил aapt2.exe.

Должен ли я использовать aapt2.exe? Как мне это использовать? Я не смог найти никакой документации об этом.


person chenie    schedule 07.02.2017    source источник
comment
В свой файл gradle.properties вы добавляете следующую строку: android.enableAapt2=true Источник   -  person afathman    schedule 18.05.2017
comment
Опция android.enableAapt2 устарела и больше не должна использоваться. Используйте android.enableAapt2=true, чтобы удалить это предупреждение. Он будет удален в конце 2018 года.   -  person Non Sensei    schedule 20.04.2018


Ответы (3)


Между тем, как работают AAPT и AAPT2, существуют большие различия.

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

Основная идея AAPT2, помимо новых функций, заключается в том, что он делит этап «пакет» на два: «компилировать» и «связывать». Это повышает производительность, так как если изменяется только один файл, вам нужно только перекомпилировать этот файл и связать все промежуточные файлы с помощью команды «link».

Более ограничительный

AAPT2 пытается отловить большинство ошибок как можно раньше. Вот почему при переходе с AAPT на AAPT2 вы можете столкнуться со многими ошибками, говорящими о том, что некоторые элементы неправильно вложены или что некоторые ссылки неверны. Для получения дополнительной информации о новых ограничениях см. Документация по Android Studio 3.0.

Применение

Android Studio 3.0 поставляется с включенным AAPT2 по умолчанию (с Android Gradle Plugin 3.0.0). Но если вы хотите использовать AAPT2 в своем собственном скрипте, вам нужно будет изменить способ обработки ваших ресурсов. Для команды «package» с AAPT вы должны передать каталог ресурсов с ключом -S. С AAPT2 вам нужно сначала скомпилировать каждый ресурс с помощью команды 'compile и только затем передать все скомпилированные файлы с флагом -R.
Например:

aapt package -S app/src/main/res/ ...

Вместо этого используйте:

aapt2 compile -o compiled/res/ app/src/main/res/values/values.xml
aapt2 compile -o compiled/res/ app/src/main/res/drawable/myImage.png --no-crunch
...
aapt2 link -R compiled/res/values_values.arsc.flat -R compiled/res/drawable_myImage.flat ...

Флаги

Существуют и другие различия в использовании флагов, например, флаги --pseudo-localize и --no-crunch используются для каждого файла на этапе компиляции. Для получения полной информации о типе флагов AAPT2:

aapt2 compile -h
aapt2 link -h
person Izabela Orlowska    schedule 30.10.2017
comment
Я пробовал так, как вы упомянули. Но я все равно получаю такие ошибки, как error: resource mipmap/ic_launcher (aka packageNamet:mipmap/ic_launcher) not found. и т. д. Даже если эти файлы присутствуют в скомпилированной папке res. - person jgm; 30.11.2017
comment
aapt2 link --manifest /home/test/src/main/AndroidManifest.xml -I /home/Android/Sdk/platforms/android-27/android.jar -R /home/test/build/intermediates/res/merged/debug/* -o file.zip Это команда, которую я использую. Папка res/merged/debug уже содержит все плоские файлы, созданные в процессе сборки Android Studio. Я просто пытаюсь упаковать в виде zip-файла. Я делаю что-то неправильно ? @izabela-orlowska - person jgm; 01.12.2017
comment
Хм, это выглядит правильно из того, что я вижу. Не могли бы вы предоставить репродукцию? Возможно, вам не хватает некоторых зависимостей. AAPT2 намного строже, когда дело доходит до разрешения ресурсов, чем AAPT, который позволил бы пропустить больше вещей, но это привело к возможным проблемам во время выполнения. Кроме того, если они созданы сборкой gradle из Android Studio, успешно ли завершается задача processDevDebugResources? Если это так, вы можете увидеть полную команду, с помощью которой gradle вызвал AAPT2, добавив флаг --debug к команде gradle. @jgm - person Izabela Orlowska; 02.12.2017
comment
Как вы вызываете это из gradle? Мне нужно выполнить пост-обработку файлов классов после того, как они были отсканированы, чтобы создать необработанный ресурс, а затем мне нужно вызвать aapt2 для преобразования ресурса в файл .flat (поскольку aapt2 уже был запущен на других ресурсах). Я не могу понять, как вызвать aapt2 в правиле gradle. - person Luke Hutchison; 11.10.2018
comment
@LukeHutchison Вы можете добавить файлы в качестве входных данных для задачи объединения ресурсов. - person Izabela Orlowska; 14.10.2018
comment
@IzabelaOrlowska это то, что я придумал - это правильный или лучший способ сделать это? github.com/classgraph/classgraph/wiki/ - person Luke Hutchison; 14.10.2018

Примечание: рассматривайте это как дополнение к ответу Изабелы.

Авторы службы Overlay Manager в Android O представили свою работу и рассказали об AAPT2 на своих слайдах (контекст см. на слайдах 12–14). Официальная документация для этого инструмента теперь находится здесь (любезно предоставлено ответ)

Кроме того, если вы сомневаетесь, посмотрите исходный код: https://android.googlesource.com/platform/frameworks/base/+/android-7.0.0_r7/tools/aapt2.

person scorpiodawg    schedule 15.02.2018

В дополнение к приведенным выше ответам наконец-то вышла документация для AAPT2. Документацию можно найти здесь. Если вы обнаружите какие-либо ошибки, сообщите об ошибке относительно этих ошибок.

person Shrijana Ghimire    schedule 13.08.2018
comment
Добро пожаловать в StackOverflow Шриджана! И отличная работа над документацией! :) - person Izabela Orlowska; 13.08.2018
comment
Спасибо! @IzabelaOrlowska :) - person Shrijana Ghimire; 14.08.2018