Оптимизация DEX-кода

Оптимизация кода DEX – это показатель Android Vitals, который помогает отслеживать и улучшать качество компиляции, размер и производительность приложения. Оптимизация и обфускация кода с помощью R8 или других инструментов, например оптимизаторов, совместимых с ProGuard, или дополнительных постпроцессоров DEX, позволяет уменьшить размер DEX-файлов, повысить производительность во время выполнения и снизить объем потребляемой памяти.

Файлы DEX (Dalvik Executable) содержат скомпилированный код, который используется для запуска приложения. Обычно это код Java и Kotlin, а не скомпилированный код C++ или файлы .so.

В Android Vitals есть показатели оптимизации DEX-кода для всех приложений и игр, но пороговые значения применяются только к тем из них, которые соответствуют определенным требованиям к размеру.

Обнаружение проблемы

Если уровень оптимизации, сжатия или обфускации кода DEX в вашем приложении не соответствует минимальным заданным процентам, Android Vitals может предупредить вас об этом в Play Console.

Как рассчитывается показатель оптимизации

Для приложений, созданных с помощью последней версии AGP 8.10 или более поздней (например, 8.10.1, а не 8.10.0), эти проценты берутся из включенного файла r8.json. Чтобы генерировались точные метаданные, используйте последние версии AGP и R8 для своей промежуточной версии.

Для приложений, созданных с помощью более ранних версий AGP или оптимизированных с помощью альтернативного оптимизатора кода, в котором нет r8.json, Android Vitals оценивает процент обфускации, используя файл mapping.txt (если он есть) или эвристику DEX.

Минимальный общий размер DEX-файлов

Android Vitals рассчитывает показатели оптимизации кода для всех приложений, но вы будете получать оповещения, только если ваш набор App Bundle соответствует следующим требованиям к общему размеру DEX-файлов:

  • Приложения. Набор содержит не менее 10 МБ DEX-кода в несжатом виде.
  • Игры. Набор содержит не менее 50 МБ DEX-кода в несжатом виде.

Как оценить оптимизацию кода локально

Чтобы измерить размер несжатых DEX-файлов в наборе App Bundle и получить процент оптимизации, сжатия и обфускации, соответствующий данным Android Vitals, запустите android analyze:

android analyze <yourapp>.aab

Устраните проблему

Чтобы повысить низкий показатель оптимизации DEX-кода, ознакомьтесь с рекомендациями для вашей системы сборки и оптимизатора:

R8

Чтобы улучшить показатели оптимизации DEX-кода R8, следуйте рекомендациям и используйте анализатор конфигурации R8. Он поможет понять, как правила сохранения влияют на показатели оптимизации, уменьшения размера и обфускации. Подробные определения этих показателей приведены в разделе Как интерпретировать отчет.

Если вы используете плагин Android Gradle (AGP), то можете также воспользоваться навыком R8 Analyzer, чтобы получить дополнительные рекомендации по оптимизации правил сохранения приложения. Если вы используете Bazel, у вас также есть доступ к анализатору конфигурации R8. Подробную информацию можно найти в документации по оптимизации R8 в rules_android.

Оптимизаторы, отличные от R8, и постпроцессоры DEX

Если в вашем конвейере сборки используются специальные инструменты или дополнительные постпроцессоры DEX, выполните следующие действия, чтобы улучшить оптимизацию приложения:

  • Откройте набор App Bundle в Android Studio и посмотрите его в APK Analyzer.
  • Выберите все файлы .dex.
  • Обратите особое внимание на файлы самого большого размера, когда вы нажимаете кнопку "Деобфусцировать названия" (примечание: для этого необходимо загрузить файл mapping.txt). Если вы обнаружите, что некоторые из этих файлов остаются большими, несмотря на обфускацию, вероятно, на них влияют правила сохранения на уровне пакета.
  • Найдите в файле proguard-rules.pro, configuration.txt или эквивалентном файле для вашего оптимизатора (если вы не используете R8) правила сохранения, которые соответствуют пакетам, не подвергающимся обфускации. Например, если com.foo. – это большой пакет в файлах DEX, ищите правила сохранения в формате -keep com.foo.** или -keep com.foo.bar.**.
  • Учтите, что правила хранения, заданные пользователями библиотеки, может быть не так просто найти. Если вы подозреваете, что правило потребителя библиотеки влияет на оптимизацию, вы можете проверить библиотеку напрямую с помощью android analyze <library>.aar или добавить ее в отдельный пример приложения, используя последнюю версию AGP, и проверить с помощью анализатора конфигурации R8.