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

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

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

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

Как обнаружить проблему

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

Как отслеживать статус оптимизации

Показатели Android Vitals помогают повышать производительность приложения, отправляя в Play Console уведомления, когда приложение не соответствует минимальным требованиям к оптимизации кода. Подробные определения сжатия, оптимизации и обфускации приведены в разделе Как использовать анализатор конфигурации R8.

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

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

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

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

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

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

В Android Vitals показывается размер DEX-файла приложения, но вы также можете узнать его локально с помощью командной строки:

  unzip -l <yourapp>.aab | grep -E '\.dex$' | awk '{sum+=$1} END {print sum}'

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

Если ваше приложение оптимизируется с помощью R8, вы можете оценить оптимизацию, обфускацию и сжатие пакета приложения с помощью анализатора конфигурации R8. Отчет "Анализатор конфигурации R8" также включен в навык анализатора R8. Отчет помогает понять, как правила сохранения влияют на показатели оптимизации, сжатия и обфускации. Однако проценты в отчете не будут совпадать со значениями в Android Vitals, поскольку они рассчитываются до оптимизации.

Чтобы посмотреть, какие именно метаданные Android Vitals использует для расчета показателей, извлеките файл r8.json из пакета приложения:

unzip -p <yourapp>.aab BUNDLE-METADATA/com.android.tools/r8.json

Как устранить проблему

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

Плагин Android Gradle и R8

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

Системы сборки, отличные от 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.**.
  • Учтите, что правила хранения, заданные потребителями библиотеки, могут быть не так очевидны. Если вы подозреваете, что правило потребителя библиотеки влияет на оптимизацию, вы можете проверить это локально, добавив его в отдельное приложение с помощью последней версии AGP и проанализировав его с помощью анализатора конфигурации R8.