Оптимизация кода 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.