Небольшое и быстрое приложение — ключ к отличному пользовательскому опыту. Именно поэтому в Google создали R8, оптимизатор, который оптимизирует ваше приложение, удаляя неиспользуемый код и ресурсы, переписывая код для повышения производительности рантайма и выполняя другие функции.
С выпуском версии 8.12.0 Android Gradle Plugin (AGP) в компании представили оптимизированное сокращение ресурсов — ещё более эффективный способ уменьшения размера вашего приложения с помощью R8. Используя его, вы можете уменьшить размер своего приложения, что означает меньший размер приложения, более быструю установку и меньший объём используемой памяти на устройствах ваших пользователей. Результат — более быстрый запуск, улучшенный рендеринг и меньшее количество ANR-ошибок.
Как это работает
Сокращение ресурсов для Android-приложений существует уже давно, и за это время было внесено несколько улучшений — например, сокращение таблицы ресурсов (resources.arsc) теперь является оптимизацией по умолчанию.
Новый подход улучшает сокращение ресурсов за счёт полной интеграции с существующим конвейером оптимизации кода. В новом подходе R8 одновременно оптимизирует как код, так и ссылки на ресурсы, гарантируя, что все ресурсы, на которые ссылается исключительно неиспользуемый код, идентифицируются как неиспользуемые и затем удаляются. Это полностью устраняет необходимость в безусловных правилах сохранения (unconditional keep rules), генерируемых AAPT2 (инструментом упаковки ресурсов для Android), и предоставляет гораздо более детальную и точную информацию для удаления неиспользуемого кода и ресурсов.
Это улучшение по сравнению с существующим процессом, где оптимизация кода и ресурсов разделены. В текущем процессе AAPT2 генерирует правила сохранения (keep rules), чтобы безусловно сохранять классы, на которые есть ссылки из ресурсов. Затем запускается оптимизация R8 с учётом этих правил. После того как R8 завершает оптимизацию и сокращение кода, он сканирует оставшийся код, чтобы построить граф всех ресурсов, на которые есть прямые или косвенные ссылки. Однако безусловные правила AAPT2 часто сохраняют код, который в противном случае не используется, что, в свою очередь, заставляет R8 сохранять как неиспользуемый код, так и неиспользуемые ресурсы, на которые он ссылается.
Как использовать
Для начала включите оптимизацию R8 с сокращением ресурсов, добавив в файл build.gradle.kts следующее:
android {
buildTypes {
release {
isMinifyEnabled = true
isShrinkResources = true
…
}
}
}
Включите новый оптимизированный конвейер сокращения ресурсов, добавив в файл gradle.properties следующее:
android.r8.optimizedResourceShrinking=true
Преимущества
Оптимизированный конвейер сокращения ресурсов продемонстрировал значительные улучшения по сравнению с существующей реализацией. Для приложений, использующих значительные ресурсы и код в разных форм-факторах, зафиксировали улучшение размера более чем на 50%. Улучшения наблюдаются и в небольших приложениях — например, в Androidify есть следующие улучшения:
В таблице показано постепенное уменьшение размера по мере включения дополнительных оптимизаций, от отсутствия сжатия до оптимизированного сжатия ресурсов. Ячейки, отмеченные звездочкой (*), указывают на улучшенные показатели по сравнению с предыдущей строкой. Включение R8 сокращает размер вашего DEX, в то время как включение сжатия ресурсов удаляет неиспользуемые ресурсы как в папке res, так и в таблице ресурсов, но не приводит к дальнейшему изменению размера DEX. Наконец, оптимизированное сокращение ресурсов ещё больше уменьшает итоговый размер, удаляя и ресурсы, и код из DEX-файла, поскольку оно способно отслеживать ссылки между кодом и ресурсами.
Дальнейшие действия
Начиная с AGP 9.0.0, оптимизированное сокращение ресурсов становится стандартным поведением для любого проекта, в котором включено сокращение ресурсов.
Ознакомьтесь с недавно обновленной документацией, чтобы попробовать оптимизированное сокращение ресурсов, и сообщите Google, если у вас возникнут какие-либо проблемы в системе отслеживания ошибок.

