Оптимизация приложений с помощью R8

For the best user experience, you should optimize your app to make it as small and fast as possible. Our app optimizer, called R8, streamlines your app by removing unused code and resources, rewriting code to optimize runtime performance, and more. To your users, this means:

  • Более быстрое время запуска
  • Снижено потребление памяти
  • Улучшена производительность рендеринга и выполнения программы.
  • Меньше АНР

Обзор оптимизации R8

R8 использует многоэтапный процесс для оптимизации вашего приложения по размеру и скорости. Ключевые операции включают в себя следующее:

  • Code shrinking (also known as tree shaking) : R8 identifies and removes unreachable code from your application and its library dependencies. By analyzing the entry points of your app (such as Activities or Services defined in the manifest), R8 builds a graph of referenced code and removes anything that remains unreferenced.

  • Логическая оптимизация : R8 переписывает ваш код для повышения эффективности выполнения и снижения накладных расходов. Ключевые методы включают:

    • Встраивание методов : R8 заменяет место вызова метода фактическим телом вызываемого метода. Это устраняет накладные расходы, связанные с вызовом функции, и позволяет R8 проводить дальнейшую оптимизацию.

    • Объединение классов : R8 объединяет наборы классов и интерфейсов в один класс. Это уменьшает количество классов в приложении, снижает нагрузку на память и повышает скорость запуска.

  • Обфускация (также известная как минификация) : Для уменьшения размера DEX-файла R8 сокращает имена классов, полей и методов (например, com.example.MyActivity может стать aba ).

Начиная с версии 8.12.0 плагина Android Gradle (AGP), R8 также оптимизирует ресурсы в рамках этапов оптимизации. Для получения дополнительной информации см. раздел «Оптимизированное сокращение ресурсов» .

Включить оптимизацию

To enable app optimization for your app use the appropriate DSL based on your project's AGP version. We recommend enabling app optimization only in the final version of your app that you test before publishing—usually your release build—because the optimizations increase the build time of your project and can make debugging harder due to the way it modifies code.

Для версий AGP 9.3 и выше

Чтобы включить оптимизацию приложения для AGP 9.3 и выше:

  • В скрипте сборки приложения на уровне приложения установите параметр enable = true в блоке optimization .
  • Добавьте свои правила сохранения в файл с расширением .keep в исходном коде src/<variant>/keepRules . Например, src/main/keepRules/custom-rules.keep .

Котлин

android {
    buildTypes {
        release {
            optimization {
                enable = true // Enables code and resource optimizations.
            }
        }
    }
}

Классный

android {
    buildTypes {
        release {
            optimization {
                enable = true // Enables code and resource optimizations.
            }
        }
    }
}

Устаревший DSL для версий AGP ниже 9.3

To enable app optimization, set isMinifyEnabled = true (for code optimization) and isShrinkResources = true (for resource optimization) in your release build's app-level build script. We recommend that you always enable both settings.

Устаревший DSL (Kotlin)

android {
    buildTypes {
        release {

            // Enables code optimizations.
            isMinifyEnabled = true

            // Enables resource shrinking.
            isShrinkResources = true

            proguardFiles(
                // Default file with automatically generated optimization rules.
                getDefaultProguardFile("proguard-android-optimize.txt"),

                ...
            )
            ...
        }
    }
    ...
}

Устаревший DSL (Groovy)

android {
    buildTypes {
        release {

            // Enables code optimizations.
            minifyEnabled = true

            // Enables resource shrinking.
            shrinkResources = true

            // Default file with automatically generated optimization rules.
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt')

            ...
        }
    }
}

Улучшить оптимизацию R8

Преимущества R8 в плане производительности напрямую зависят от того, насколько эффективно R8 оптимизирует ваш код. Чтобы получить максимальную выгоду от R8, следуйте лучшим практикам:

Для уточнения правил сохранения используйте анализатор конфигурации R8 .

Анализатор конфигурации R8 позволяет выполнять следующие действия:

  • Отслеживайте и улучшайте общее качество конфигурации R8, контролируя показатели, предоставляемые отчетом R8 Configuration Analyzer.
  • Найдите наиболее общие правила сохранения — те, которые препятствуют наибольшей оптимизации.
  • и понять, какой оптимизации они препятствуют, чтобы их усовершенствовать.

Анализатор конфигурации R8 доступен в версии AGP 9.3.0-alpha05 или начиная с версии R8 9.3.7-dev. Для получения дополнительной информации см. раздел «Анализ конфигурации R8» .

Оптимизация сокращения ресурсов для еще более компактных приложений.

В версии 8.12.0 AGP реализовано оптимизированное уменьшение ресурсов, цель которого — объединить оптимизацию ресурсов и кода для создания ещё меньших по размеру и более быстрых приложений. До внедрения оптимизированного уменьшения ресурсов инструмент Android Asset Packaging Tool (AAPT2) генерировал правила сохранения, которые фактически обрабатывали уменьшение ресурсов отдельно от кода, часто сохраняя недоступный код или ресурсы, которые ссылались друг на друга.

With optimized resource shrinking, resources are considered like a part of program code, forming the reference graph. When a collection of code or resources is not referenced, it is not protected by a keep rule, and can be removed.

Включите оптимизированное сокращение ресурсов

Чтобы включить новый оптимизированный конвейер сжатия ресурсов для AGP 8.12 или 8.13, добавьте следующее в файл gradle.properties вашего проекта:

If you are using AGP 9.0.0 or a newer version, you don't need to set android.r8.optimizedResourceShrinking=true . Optimized resource shrinking is automatically applied when isShrinkResources = true is enabled in your build configuration.

Проверьте и настройте параметры оптимизации R8.

Чтобы R8 мог в полной мере использовать свои возможности оптимизации , удалите следующую строку из файла gradle.properties вашего проекта, если он существует:

bash android.enableR8.fullMode=false # Remove this line from your codebase.

Note that enabling app optimization makes stack traces difficult to understand, especially if R8 renames class or method names. To get stack traces that correctly correspond to your source code, see Recover the original stack trace .

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

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

Если вас интересует оптимизация скорости сборки, см. раздел «Настройка работы R8» для получения информации о том, как настроить R8 в соответствии с вашей средой.

Изменения в поведении версий AGP и R8.

В таблице ниже приведены основные функции, представленные в различных версиях плагина Android Gradle (AGP) и компилятора R8.

версия AGP Представленные функции
9.3 Упрощенный DSL: новый блок `optimization {}` позволяет уменьшить объем конфигурации — оптимизированное сокращение ресурсов всегда включено, правила сохранения данных Android по умолчанию можно отключить.

Исходный код `keepRules`: Если вы используете новый DSL, вам необходимо разместить правила сохранения в исходном коде src/<variant>/keepRules в файлах с расширением .keep . Исходные коды также совместимы с устаревшим DSL.

Правила обработки данных KMP (Kotlin MultiPlatform): KMP больше не требует установки параметра publish = true и поддерживает источник src/<variant>/keepRules заданный с расширением .keep .

Обратите внимание, что устаревший DSL по-прежнему поддерживается.
9.1 Classes repackaged by default: R8 repackages classes (moving them to the unnamed package, at the top level) to compact DEX further, eliminating the need to specify -repackageclasses option. For information about how this works and how to opt out, see global options .
9.0 Оптимизированное сокращение ресурсов: включено по умолчанию (управляется с помощью android.r8.optimizedResourceShrinking ). Оптимизированное сокращение ресурсов помогает интегрировать сокращение ресурсов с конвейером оптимизации кода, что приводит к созданию меньших по размеру и более быстрых приложений. Оптимизируя одновременно код и ссылки на ресурсы, оно выявляет и удаляет ресурсы, на которые ссылается исключительно неиспользуемый код. Это значительное улучшение по сравнению с предыдущими отдельными процессами оптимизации.

This is especially useful for apps that share substantial resources and code across different form factor verticals, with measured improvements of over 50% in app size. The resulting size reduction leads to smaller downloads, faster installations, and a better user experience with faster startup, improved rendering, and fewer ANRs.

Library rule filtering: Support for global options (for example, -dontobfuscate ) in library consumer rules has been dropped, and apps will filter them out. For more information, see Add global options .

Kotlin null checks: Optimized by default (controlled using -processkotlinnullchecks ). This version also introduced significant improvements in build speed. For more information, see Global options for additional optimization .

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

Optimized by default: Support for getDefaultProguardFile("proguard-android.txt") has been dropped, because it includes -dontoptimize , which should be avoided. Instead, use "proguard-android-optimize.txt" . If you need to globally disable optimization in your app, add the flag manually to a proguard file .
8.12 Optimized resource shrinking: Initial support added (controlled using android.r8.optimizedResourceShrinking ). Optimized resource shrinking helps integrate resource shrinking with the code optimization pipeline. You must manually enable it in this version of AGP.

Трассировка Logcat: Поддержка автоматической трассировки в окне Logcat в Android Studio.
8.6 Улучшена трассировка: по умолчанию включена трассировка по имени файла и номеру строки для всех уровней minSdk (ранее для этого требовался minSdk 26+ в версии 8.2).

Updating R8 helps ensure that stack traces from obfuscated builds are readily and clearly readable. This version improves how line numbers and source files are mapped, making it easier for tools like the Android Studio Logcat to automatically retrace crashes to the original source code.
8.0 Полный режим по умолчанию: Полный режим R8 обеспечивает значительно более мощную оптимизацию. Он включен по умолчанию. Вы можете отключить его, используя android.enableR8.fullMode=false .
7.0 Full mode available: Introduced as an opt-in feature using android.enableR8.fullMode=true . Full mode applies more powerful optimizations by making stricter assumptions about how your code uses reflection and other dynamic features. While it reduces app size and improves performance, it might require additional keep rules to prevent necessary code from being stripped.