Оптимизация указанных пакетов с помощью packageScope (экспериментальная функция)

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

Рассмотрите возможность использования packageScope

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

Приложения, которые еще не используют R8, но переходят на него, могут использовать packageScope для поэтапного управления переходом. Поскольку R8 применяет мощные оптимизации, которые могут изменять поведение приложения, ограничение этих оптимизаций конкретными пакетами, которые безопасно оптимизировать — такими как AndroidX и Kotlin — позволяет добиться повышения производительности с минимальным риском. После того, как ваше приложение станет стабильным, вы можете постепенно распространить эти оптимизации на остальную часть вашей кодовой базы и зависимостей, проверяя стабильность на каждом этапе.

Предварительные требования

Для использования R8 с packageScope требуется:

Настройте оптимизацию.

Чтобы включить оптимизацию с помощью packageScope , выполните следующие шаги.

Выберите библиотеки для оптимизации.

Определите библиотеки для оптимизации. Мы рекомендуем начать с библиотек AndroidX и Kotlin androidx.** , kotlin.** и kotlinx.** поскольку это стабильные библиотеки, настроенные для совместимости с R8.

Включить поддержку использования R8 с packageScope

Добавьте следующее в файл gradle.properties вашего проекта:

android.r8.gradual.support=true

Настройте блок оптимизации.

В файле build.gradle.kts (или build.gradle ) на уровне модуля добавьте блок optimization в конфигурацию сборки релиза. Внутри этого блока используйте packageScope , чтобы перечислить конкретные пакеты, которые вы хотите оптимизировать. В файле build.gradle.kts оберните список пакетов в setOf() .

Котлин

android {
    buildTypes {
        release {
            optimization {
                enable = true
                packageScope = setOf("androidx.**","kotlin.**", "kotlinx.**")
            }
        }
    }
}

Классный

android {
    buildTypes {
        release {
            optimization {
                enable = true
                packageScope = ["androidx.**", "kotlin.**", "kotlinx.**"]
            }
        }
    }
}

Проверьте оптимизацию.

После добавления или обновления объявления packageScope тщательно протестируйте приложение , чтобы убедиться в отсутствии неожиданных сбоев или изменений в поведении.

Переход от оптимизации отдельных пакетов к оптимизации всего приложения.

Для максимального повышения эффективности оптимизации следует постепенно переходить от использования packageScope к использованию R8 для всего приложения. Этот процесс включает в себя поэтапное расширение охвата оптимизации:

  1. Начните со стабильных библиотек . Для начала включите в список packageScope только широко используемые стабильные библиотеки, совместимые с оптимизациями R8. Начните с библиотек AndroidX и Kotlin androidx.** , kotlin.** и kotlinx.** .
  2. Постепенно добавляйте пакеты . Постепенно добавляйте новые префиксы пакетов в packageScope :
    1. Оцените зависимости . Просмотрите библиотеки вашего приложения. Хорошими кандидатами для добавления в список packageScope являются официальные библиотеки Google (например, com.google.** ) и другие мощные библиотеки, такие как OkHttp (например, okhttp3.** и okio.** ). Отдавайте приоритет библиотекам, которые не требуют интенсивного использования рефлексии, сериализации или вызовов нативного кода (JNI).
    2. Расставляйте приоритеты в зависимости от размера пакета . Используйте анализатор APK в Android Studio , чтобы определить, какие компоненты вносят наибольший вклад в размер вашего приложения.
      1. Создайте релизный AAB или APK-файл с отключенной версией R8.
      2. Откройте его в анализаторе и изучите файлы dex .
      3. Сортируйте пакеты по размеру. Самые большие пакеты обеспечивают наибольшую окупаемость инвестиций (ROI) в оптимизацию. Нацеливание на них в первую очередь позволит добиться наиболее значительного уменьшения размера на раннем этапе, при условии, что эти библиотеки не имеют слишком широких правил сохранения. См. раздел «Разумный выбор библиотек» для получения дополнительной информации.
  3. Проверьте изменения в поведении . После добавления каждого нового префикса пакета проведите всестороннее тестирование , чтобы выявить и устранить любые регрессии или неожиданные проблемы.
  4. Добавляйте пакеты приложений в последнюю очередь . Если ваши пакеты приложений не часто используют рефлексию, включите их в packageScope и добавляйте правила сохранения постепенно по мере необходимости. Если ваши пакеты приложений часто используют рефлексию, включите их в packageScope и добавьте общепакетные правила сохранения для необходимых пакетов. Пройдитесь по правилам сохранения, чтобы уточнить их.
  5. Перейдите на использование R8 во всем приложении . После того, как большинство зависимостей вашего приложения будут включены в объявление packageScope и ваше приложение станет стабильным, удалите packageScope чтобы оптимизировать все приложение в полнофункциональном режиме.