Плагин Android Gradle 9.0 – это крупный выпуск, в котором изменены API и поведение.
Чтобы перейти на плагин Android Gradle версии 9.0.1, используйте помощник по обновлению плагина Android Gradle. Помощник по обновлению AGP позволяет сохранить существующее поведение при обновлении проекта, поэтому вы можете перейти на AGP 9.0, даже если не готовы принять все новые настройки по умолчанию.
Чтобы упростить процесс обновления, можно использовать два навыка агента. Если у вас приложение, не использующее KMP, попробуйте навык обновления AGP 9 из репозитория навыков Android. Для приложений KMP попробуйте навык обновления AGP 9 от JetBrains. Подробнее о том, как использовать навыки в Android Studio…
Совместимость
Максимальный уровень API, который поддерживает плагин Android Gradle 9.0, – 36.1. Вот ещё несколько фактов о совместимости:
| Минимальная версия | Версия по умолчанию | Примечания | |
|---|---|---|---|
| Gradle | 9.1.0 | 9.1.0 | Подробнее об обновлении Gradle… |
| SDK Build Tools; | 36.0.0 | 36.0.0 | Установите или настройте SDK Build Tools. |
| NDK | Н/Д | 28.2.13676358 | Установите или настройте другую версию NDK. |
| JDK | 17 | 17 | Подробнее о том, как задать версию JDK… |
| Плагин Kotlin Gradle (KGP) | 2.2.10 | 2.2.10 | Подробнее о зависимости среды выполнения от плагина Kotlin Gradle… |
Классы DSL android теперь реализуют только новые общедоступные интерфейсы.
За последние несколько лет мы представили новые интерфейсы для DSL и API, чтобы лучше контролировать, какие API являются общедоступными. В версиях AGP 7.x и 8.x по-прежнему использовались старые типы DSL (например, BaseExtension), в которых также были реализованы новые общедоступные интерфейсы, чтобы поддерживать совместимость по мере работы над интерфейсами.
В AGP 9.0 используются только новые интерфейсы DSL, а реализации заменены на новые типы, которые полностью скрыты. Это также закроет доступ к старому, устаревшему API вариантов.
Чтобы перейти на AGP 9.0, вам может потребоваться сделать следующее:
- Убедитесь, что ваш проект совместим со встроенным Kotlin. Плагин
org.jetbrains.kotlin.androidнесовместим с новым DSL. Переведите проекты KMP на плагин библиотеки Android Gradle для KMP. Использование плагина
org.jetbrains.kotlin.multiplatformв том же подпроекте Gradle, что и плагиныcom.android.libraryиcom.android.application, несовместимо с новым DSL.Обновите файлы сборки. Хотя изменение интерфейсов призвано сохранить DSL как можно более похожим, могут быть некоторые небольшие изменения.
Обновите логику пользовательской сборки, чтобы она ссылалась на новые DSL и API. Замените все ссылки на внутренний DSL общедоступными интерфейсами DSL. В большинстве случаев это будет замена один к одному. Замените все вызовы
applicationVariantsи аналогичных API на новыйandroidComponentsAPI. Это может быть сложнее, поскольку APIandroidComponentsразработан так, чтобы быть более стабильным и дольше сохранять совместимость плагинов. Примеры можно найти в рецептах Gradle.Обновите сторонние плагины. Некоторые сторонние плагины могут по-прежнему зависеть от интерфейсов или API, которые больше не поддерживаются. Перейдите на версии этих плагинов, совместимые с AGP 9.0.
Переход на новые интерфейсы DSL предотвращает использование плагинами и скриптами сборки Gradle различных устаревших API, в том числе:
Устаревший API в блоке android |
Функция | Замена |
|---|---|---|
applicationVariants,libraryVariants,testVariants иunitTestVariants
|
Точки расширения для плагинов, позволяющие добавлять новые функции в AGP. |
Замените его на API androidComponents.onVariants, например:
androidComponents { onVariants() { variant -> variant.signingConfig .enableV1Signing.set(false) } } |
variantFilter
|
Позволяет отключить выбранные варианты. |
Замените его на API androidComponents.beforeVariants, например:
androidComponents { beforeVariants( selector() .withBuildType("debug") .withFlavor("color", "blue") ) { variantBuilder -> variantBuilder.enable = false } } |
deviceProvider иtestServer
|
Регистрация пользовательских тестовых сред для запуска тестов на устройствах Android и эмуляторах. | Перейдите на устройства под управлением Gradle. |
sdkDirectory,ndkDirectory,bootClasspath,adbExecutable иadbExe
|
Использование различных компонентов Android SDK для пользовательских задач. |
Перейдите на androidComponents.sdkComponents.
|
registerArtifactType,registerBuildTypeSourceProvider,registerProductFlavorSourceProvider,registerJavaArtifact,registerMultiFlavorSourceProvider иwrapJavaSourceSet |
Устаревшие функции, в основном связанные с обработкой сгенерированных источников в Android Studio, которые перестали работать в AGP 7.2.0. | Прямой замены для этих API нет. |
dexOptions
|
Устаревшие настройки, связанные с инструментом dx, который был заменен на d8. Начиная с версии 7.0 плагина Android Gradle, ни одна из настроек не действует.
|
Прямой замены нет. |
generatePureSplits
|
Создавать конфигурационные APK-файлы для приложений с мгновенным запуском. | Теперь в наборы Android App Bundle встроена возможность отправлять разделенные конфигурации. |
aidlPackagedList
|
Файлы AIDL, которые нужно упаковать в AAR, чтобы сделать их доступными в качестве API для библиотек и приложений, зависящих от этой библиотеки. |
Это по-прежнему доступно в LibraryExtension, но не в других типах расширений.
|
Если вы обновите AGP до версии 9.0 и увидите сообщение об ошибке ниже, значит в вашем проекте все ещё используются старые типы.
java.lang.ClassCastException: class com.android.build.gradle.internal.dsl.ApplicationExtensionImpl$AgpDecorated_Decorated
cannot be cast to class com.android.build.gradle.BaseExtension
Если вы столкнулись с несовместимыми сторонними плагинами, вы можете отказаться от изменений и вернуться к старым реализациям DSL и API вариантов.
При этом новые интерфейсы также доступны, и вы по-прежнему можете обновить логику сборки до нового API. Чтобы отказаться от этого, добавьте в файл gradle.properties следующую строку:
android.newDsl=false
Если вы хотите выполнить переход постепенно, в AGP 9.4 можно отключить отдельные модули. Подробнее о том, как отказаться от использования модуля Variant API…
Предыдущие классы помечены как устаревшие в AGP 9.0. Это означает, что в проектах, в которых не используется флаг newDsl, будут показываться предупреждения о прекращении поддержки, в том числе в самом блоке android.
Вы также можете начать переход на новые API до обновления до AGP 9.0. Новые интерфейсы присутствуют во многих версиях AGP, поэтому вы можете использовать как новые, так и старые. В справочной документации по AGP API показан интерфейс API для каждой версии AGP, а также указано, когда были добавлены классы, методы и поля.
Мы связываемся с авторами часто используемых плагинов, чтобы помочь им адаптировать и выпустить плагины, полностью совместимые с новыми режимами, и продолжим улучшать помощник по обновлению AGP в Android Studio, чтобы помочь вам в миграции.
Если вы обнаружите, что в новом DSL или Variant API отсутствуют какие-либо возможности или функции, как можно скорее сообщите нам об этой проблеме.
Встроенный Kotlin
В плагине Android Gradle 9.0 появилась встроенная поддержка Kotlin, которая включена по умолчанию. Это значит, что вам больше не нужно применять плагин org.jetbrains.kotlin.android (или kotlin-android) в файлах сборки, чтобы компилировать исходные файлы Kotlin.
Это упрощает интеграцию Kotlin с AGP, позволяет избежать использования устаревших API и в некоторых случаях повышает производительность.
Поэтому при обновлении проекта до AGP 9.0 вам также необходимо перейти на встроенный Kotlin или отказаться от него.
Вы также можете выборочно отключить встроенную поддержку Kotlin для подпроектов Gradle, в которых нет исходного кода Kotlin.
Зависимость среды выполнения от плагина Kotlin Gradle
Чтобы обеспечить встроенную поддержку Kotlin, плагин Android Gradle 9.0 теперь имеет зависимость среды выполнения от плагина Kotlin Gradle (KGP) 2.2.10. Это значит, что вам больше не нужно объявлять версию KGP, а если вы используете версию KGP ниже 2.2.10, Gradle автоматически обновит ее до 2.2.10. Аналогично, если вы используете версию KSP ниже 2.2.10-2.0.2, AGP обновит ее до 2.2.10-2.0.2, чтобы она соответствовала версии KGP.
Перейдите на более новую версию KGP
Чтобы использовать более высокую версию KGP или KSP, добавьте в файл сборки верхнего уровня следующее:
buildscript {
dependencies {
// For KGP
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:KGP_VERSION")
// For KSP
classpath("com.google.devtools.ksp:symbol-processing-gradle-plugin:KSP_VERSION")
}
}
Перейдите на более раннюю версию KGP
Вы можете перейти на более раннюю версию KGP, только если вы отказались от встроенного Kotlin. Это связано с тем, что в AGP 9.0 по умолчанию включен встроенный Kotlin, для которого требуется KGP 2.2.10 или более поздней версии.
Чтобы использовать более раннюю версию KGP или KSP, укажите ее в файле сборки верхнего уровня, используя объявление strict version:
buildscript {
dependencies {
// For KGP
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin") {
version { strictly("KGP_VERSION") }
}
// For KSP
classpath("com.google.devtools.ksp:symbol-processing-gradle-plugin") {
version { strictly("KSP_VERSION") }
}
}
}
Обратите внимание, что минимальная версия KGP, до которой можно выполнить понижение, – 2.0.0.
Поддержка тестовых фикстур в IDE
В AGP 9.0 добавлена полная поддержка тестовых фикстур в Android Studio IDE.
Плагин Fused Library
Плагин Fused Library (предварительная версия) позволяет публиковать несколько библиотек в виде одной библиотеки Android AAR. Это может упростить пользователям работу с опубликованными артефактами.
Подробнее о том, как опубликовать несколько библиотек Android в виде одной с помощью Fused Library…
Изменение поведения
В плагине Android Gradle 9.0 появились следующие новые функции:
| Поведение | Рекомендация |
|---|---|
Плагин Android Gradle 9.0 по умолчанию использует NDK версии r28c.
|
Рекомендуем явно указать версию NDK, которую вы хотите использовать. |
| По умолчанию плагин Android Gradle 9.0 требует, чтобы пользователи библиотеки использовали ту же или более позднюю версию SDK для компиляции. |
При использовании библиотеки используйте ту же или более высокую версию SDK для компиляции.
Если это невозможно или вы хотите дать пользователям библиотеки больше времени на переход, задайте значение AarMetadata.minCompileSdk явным образом.
|
В AGP 9.0 обновлены значения по умолчанию для следующих свойств Gradle. Это позволяет сохранить поведение AGP 8.13 при обновлении:
| Свойство | Функция | Изменения при переходе с AGP 8.13 на AGP 9.0 | Рекомендация |
|---|---|---|---|
android. |
Используйте новые интерфейсы DSL, не раскрывая устаревшие реализации блока android.Это также означает, что устаревший вариант API, такой как android.applicationVariants
больше не доступен.
|
false → true |
Чтобы отказаться от этого, задайте параметр android.newDsl=false.Когда все плагины и логика сборки, используемые в вашем проекте, станут совместимыми, удалите отказ. |
android. |
Включает встроенный Kotlin. | false → true |
Перейдите на встроенный Kotlin, если это возможно, или откажитесь от перехода. |
android. |
Обеспечивает уникальность названия пакета для каждой библиотеки. | false → true |
Укажите уникальные названия пакетов для всех библиотек в проекте. Если это невозможно, вы можете отключить этот параметр на время переноса. |
android. |
По умолчанию используйте зависимости androidx.
|
false → true |
Используйте зависимости androidx.
|
android. |
По умолчанию тесты на устройстве выполняются с помощью класса androidx.test.runner.AndroidJUnitRunner, который заменяет устаревший класс InstrumentationTestRunner для
android {
defaultConfig {
testInstrumentationRunner = "..."
}
} |
false → true |
Используйте AndroidJUnitRunner или укажите собственный testInstrumentationRunner.
|
android. |
Управляет использованием ограничений зависимостей между конфигурациями. В AGP 9.0 по умолчанию используется значение false, при котором ограничения применяются только в тестах устройств приложения (AndroidTest).
Если задать значение true, будет восстановлено поведение версии 8.13.
|
true → false |
Не используйте ограничения зависимостей без необходимости. Принятие нового значения по умолчанию для этого флага также позволяет оптимизировать процесс импорта проекта, что должно сократить время импорта для сборок с большим количеством подпроектов библиотек Android. |
android. |
Компиляция кода в приложениях с использованием неокончательного класса R, что приводит компиляцию приложений в соответствие с компиляцией библиотек. Это улучшает инкрементальность и открывает путь для будущих оптимизаций производительности в процессе обработки ресурсов. |
false → true |
Во многих проектах можно просто перейти на новую модель без изменения исходного кода. Если поля класса R используются там, где требуется константа, например в операторах switch, выполните рефакторинг, чтобы использовать цепочки операторов if. |
android. |
Использует версию SDK для компиляции в качестве значения по умолчанию для целевой версии SDK в приложениях и тестах. До этого изменения целевая версия SDK по умолчанию соответствовала минимальной версии SDK. |
false → true |
Явно укажите целевую версию SDK для приложений и тестов. |
android. |
Создает компоненты модульного тестирования только для тестируемого типа сборки. В проекте по умолчанию это приводит к созданию одного модульного теста для отладки, тогда как ранее модульные тесты выполнялись для отладки или выпуска. |
false → true |
Если в вашем проекте не требуется запускать тесты как для отладочной, так и для рабочей версии, никаких изменений не требуется. |
android. |
Если на диске нет файлов, указанных в AGP DSL, сборка завершается с ошибкой. Ранее опечатки в названиях файлов приводили к тому, что файлы игнорировались без уведомления. | false → true |
Удалите все недопустимые объявления файлов ProGuard. |
android. |
Позволяет R8 сохранять меньше ресурсов Android, рассматривая классы и ресурсы Android вместе. | false → true |
Если правила хранения проекта уже настроены, ничего менять не нужно. |
android. |
Позволяет R8 сохранять меньше, не сохраняя неявно конструктор по умолчанию, когда класс сохраняется.
Другими словами, -keep class A больше не подразумевает -keep class A { <init>(); }. |
false → true |
Если правила хранения проекта уже настроены, ничего менять не нужно.
Замените -keep class A
на
-keep class A { <init>(); }
в правилах сохранения проекта, если вам нужно сохранить конструктор по умолчанию.
|
android. |
Включает resValues во всех дочерних проектах.
|
true → false |
Включите resValues только в тех подпроектах, где это необходимо, добавив в их файлы сборки Gradle следующий код:
android {
buildFeatures {
resValues = true
}
} |
android. |
Включает компиляцию шейдеров во всех подпроектах. | true → false |
Включите компиляцию шейдеров только в подпроектах, содержащих шейдеры, которые нужно скомпилировать. Для этого добавьте в файлы сборки Gradle этих проектов следующий код:
android {
buildFeatures {
shaders = true
}
} |
android. |
В AGP 9.0 getDefaultProguardFile() будет поддерживать только proguard-android-optimize.txt, а не proguard-android.txt. Это позволяет избежать случайного использования флага dontoptimize, который включен в proguard-android.txt.
|
false → true |
Если вы хотите избежать оптимизации, то можете явно указать dontoptimize в пользовательском файле proguardFile, а также использовать proguard-android-optimize.txt. По возможности удалите из этого файла флаг dontoptimize, так как он снижает эффективность оптимизации R8. Если нет, отключите его, задав значение android.r8.globalOptionsInConsumerRules.disallowed=false.
|
android. |
Начиная с AGP 9.0 публикация библиотеки Android и модуля функции будет завершаться ошибкой, если файлы keep содержат проблемные конфигурации Proguard. Файлы keep, содержащие глобальные параметры, такие как dontoptimize или dontobfuscate, следует использовать только в модулях приложений. В противном случае пользователи библиотеки могут не получить всех преимуществ оптимизации. При компиляции модуля приложения Android такие глобальные параметры будут игнорироваться, если они встроены в предварительно скомпилированную зависимость (JAR или AAR). Чтобы узнать, когда это происходит, проверьте файл configuration.txt (обычно он находится по пути <app_module>/build/outputs/mapping/<build_variant>/configuration.txt) на наличие комментариев, подобных следующему: # REMOVED CONSUMER RULE: dontoptimize.
|
false → true |
Из опубликованных библиотек следует удалить все несовместимые правила. Внутренние библиотеки должны переместить все несовместимые, но необходимые правила в proguardFile в модуле приложения. Чтобы отказаться от использования, задайте значение android.r8.globalOptionsInConsumerRules.disallowed=false. Когда все файлы Keep в аккаунтах пользователей станут совместимыми, отмените отказ.
|
android. |
Запретить передачу поставщиков для сгенерированных источников с помощью DSL AndroidSourceSet.
|
false → true |
Используйте API Sources в androidComponents, чтобы зарегистрировать сгенерированные источники.
|
android. |
Если компиляция шейдеров включена, необходимо явно указать путь к компилятору в local.properties.
|
false → true |
Добавьте glslc.dir=/path/to/shader-tools в файл local.properties проекта.
|
Удаленные функции
В плагине Android Gradle 9.0 удалены следующие функции:
- Поддержка встроенных приложений для Wear OS
В AGP 9.0 удалена поддержка встроенных приложений для Wear OS, которые больше не поддерживаются в Google Play. В частности, удалите конфигурацииwearAppи DSLAndroidSourceSet.wearAppConfigurationName. Подробнее о том, как распространять приложения для Wear OS… - Задача отчета
androidDependenciesиsourceSets - Поддержка раздельных APK на основе плотности экрана
В AGP 9.0 больше нельзя создавать раздельные APK на основе плотности экрана. Функция и связанные с ней API удалены. Чтобы разделить APK-файлы по плотности экрана с помощью AGP 9.0 или более поздней версии, используйте наборы App Bundle.
Измененный DSL
В плагине Android Gradle 9.0 есть следующие критические изменения DSL:
Параметризация
CommonExtensionудалена.Это критическое изменение на уровне источника, которое поможет избежать подобных изменений в будущем. Кроме того, методы блокировки нужно перенести из
CommonExtensionвApplicationExtension,LibraryExtension,DynamicFeatureExtensionиTestExtension.При обновлении проекта до AGP 9.0 проведите рефакторинг кода плагина Gradle, в котором используются эти параметры или методы блоков. Например, в следующем плагине удален параметр type и не используются удаленные методы блоков:
AGP 8.13
val commonExtension: CommonExtension<*, *, *, *, *, *> = extensions.getByType(CommonExtension::class) commonExtension.apply { defaultConfig { minSdk { version = release(28) } } }AGP 9.0
val commonExtension: CommonExtension = extensions.getByType(CommonExtension::class) commonExtension.apply { defaultConfig.apply { minSdk { version = release(28) } } }Для плагинов, предназначенных для нескольких версий AGP, использование метода получения напрямую совместимо с версиями AGP ниже 9.0.
Удаленный DSL
В плагине Android Gradle 9.0 удалены:
AndroidSourceSet.jni, так как оно не работало.AndroidSourceSet.wearAppConfigurationName, так как поддержка встроенных приложений для Wear OS была прекращена.BuildType.isRenderscriptDebuggable, так как оно не работало.DependencyVariantSelection. Вместо него используетсяDependencySelection, который представлен какkotlin.android.localDependencySelection.Installation.installOptions(String). Вместо него используется изменяемое свойствоInstallation.installOptions.Экспериментальный, но так и не стабилизированный блок
PostProcessing.ProductFlavor.setDimension, которое заменено свойствомdimension.LanguageSplitOptions, который использовался только для Google Play Instant (поддержка прекращена).DensitySplit, так как эта функция больше не поддерживается. Вместо этого используйте наборы App Bundle.
Удаленные API
В плагине Android Gradle 9.0 удалены:
AndroidComponentsExtension.finalizeDSl. Вместо него используетсяfinalizeDsl.Component.transformClassesWith. Вместо него используетсяInstrumentation.transformClassesWith.Component.setAsmFramesComputationMode. Вместо него используетсяInstrumentation.setAsmFramesComputationMode.ComponentBuilder.enabled. Вместо него используетсяComponentBuilder.enable.DependenciesInfoBuilder.includedInApk. Вместо него используетсяincludeInApk.DependenciesInfoBuilder.includedInBundle. Вместо него используетсяincludeInBundle.GeneratesApk.targetSdkVersion. Вместо него используетсяtargetSdk.Variant.minSdkVersion. Вместо него используетсяminSdk.Variant.maxSdkVersion. Вместо него используетсяmaxSdk.Variant.targetSdkVersion. Вместо него используетсяtargetSdk.Variant.unitTest, так как он неприменим к плагинуcom.android.test. СвойствоunitTestдоступно дляVariantBuilderподтипов, расширяющихHasUnitTest.VariantBuilder.targetSdkиtargetSdkPreview, так как они не имели смысла в библиотеках. Вместо него необходимо использоватьGeneratesApkBuilder.targetSdkилиGeneratesApkBuilder.targetSdkPreview.VariantBuilder.enableUnitTest, так как он неприменим к плагинуcom.android.test. СвойствоenableUnitTestдоступно дляVariantBuilderподтипов, расширяющихHasUnitTestBuilder.VariantBuilder.unitTestEnabledудален в пользу более согласованного названияenableUnitTestв подтипахVariantBuilder, расширяющихHasUnitTestBuilder.VariantOutput.enable. Вместо него используетсяenabled.Устаревшие и отключенные
FeaturePluginиFeatureExtension.Устаревшие и отключенные API
BaseExtension.registerTransform, которые оставались только для того, чтобы можно было выполнять компиляцию с последней версией AGP, а целевой версией была AGP 4.2 или более ранняя.
Удаленные свойства Gradle
Перечисленные ниже свойства Gradle изначально были добавлены как способы глобального отключения функций, которые были включены по умолчанию.
Эти функции отключены по умолчанию начиная с AGP 8.0 или более ранней версии. Чтобы сборка выполнялась эффективнее, включайте эти функции только в тех подпроектах, где они используются.
| Свойство | Функция | Замена |
|---|---|---|
android. |
Включает компиляцию AIDL во всех подпроектах. |
Включите компиляцию AIDL только в подпроектах, где есть источники AIDL, задав следующее свойство в файлах сборки Gradle этих проектов:
android {
buildFeatures {
aidl = true
}
} |
android. |
Включает компиляцию RenderScript во всех подпроектах. |
Включите компиляцию Renderscript только в тех подпроектах, где есть исходные файлы Renderscript. Для этого задайте следующее свойство в файлах сборки Gradle этих проектов:
android {
buildFeatures {
renderScript = true
}
} |
Принудительно применяемые свойства Gradle
AGP 9.0 выдает ошибку, если вы задаете следующие свойства Gradle.
Помощник по обновлению плагина Android Gradle не будет обновлять до AGP 9.0 проекты, в которых используются эти свойства.
| Свойство | Функция |
|---|---|
android. |
Удаление неиспользуемых ресурсов теперь всегда выполняется в рамках R8, предыдущая реализация удалена. |
android. |
Теперь при удалении неиспользуемых ресурсов всегда применяется точный режим, который позволяет удалять больше ресурсов. |
Изменения R8
В AGP 9.0.0 включены следующие изменения R8.
Новый параметр конфигурации: -processkotlinnullchecks
Мы добавили новый параметр R8 -processkotlinnullchecks для настройки R8, чтобы обрабатывать проверки Kotlin на null. Для этого параметра необходимо указать одно из трех значений: keep, remove_message или remove.
Этот параметр обрабатывает следующие проверки на нулевое значение, добавленные компилятором Kotlin:
class kotlin.jvm.internal.Intrinsics {
void checkNotNull(java.lang.Object);
void checkNotNull(java.lang.Object, java.lang.String);
void checkExpressionValueIsNotNull(
java.lang.Object, java.lang.String);
void checkNotNullExpressionValue(
java.lang.Object, java.lang.String);
void checkReturnedValueIsNotNull(
java.lang.Object, java.lang.String);
void checkReturnedValueIsNotNull(
java.lang.Object, java.lang.String, java.lang.String);
void checkFieldIsNotNull(java.lang.Object, java.lang.String);
void checkFieldIsNotNull(
java.lang.Object, java.lang.String, java.lang.String);
void checkParameterIsNotNull(java.lang.Object, java.lang.String);
void checkNotNullParameter(java.lang.Object, java.lang.String);
}
Значения параметров, упорядоченные от самого слабого до самого сильного, имеют следующий эффект:
keepне меняет проверки.remove_messageпереписывает каждый вызов метода проверки в вызовgetClass()для первого аргумента вызова (фактически сохраняя проверку на null, но без какого-либо сообщения).removeполностью удаляет проверки.
По умолчанию R8 использует remove_message. Любое значение -processkotlinnullchecks переопределит это. Если указано несколько значений, используется наиболее строгое.
Прекратить передачу информации о сохранении в сопутствующие методы
Когда правила сохранения соответствуют методам интерфейса, которые подлежат десахаризации, R8 ранее внутренне передавал биты запретить оптимизацию и запретить сжатие синтезированным сопутствующим методам.
Начиная с AGP 9.0, правила сохранения больше не применяются к сопутствующим методам. Это согласуется с тем, что правила сохранения неприменимы к другим полям, методам и классам, синтезированным компилятором.
Перенос битов disallow optimization и disallow shrinking в сопутствующие методы ранее поддерживал следующий сценарий использования:
- Скомпилируйте библиотеку с методами интерфейса
default/static/privateв DEX сminSdk< 24 и правилами, которые сохраняют методы интерфейса. - Скомпилируйте приложение с библиотекой в пути к классам и
-applymapping. - Объедините приложение и библиотеку.
Обратите внимание, что это работает только с -applymapping, поскольку бит disallow
obfuscation не передается сопутствующим методам. Это означает, что у сопутствующих классов, созданных на шаге 1, будут обфусцированные названия методов.
В дальнейшем этот вариант использования больше не будет поддерживаться для minSdk < 24. Чтобы обойти эту проблему, выполните следующие действия:
- Дешугаризация библиотеки с методами интерфейса
default/static/privateдля файлов классов сminSdk< 24. - Скомпилируйте десахаризованный артефакт с помощью R8 и правил, которые сохраняют методы интерфейса в сопутствующих классах.
- Скомпилируйте приложение с библиотекой в пути к классам.
- Объедините приложение и десахаризованный артефакт.
Ещё один побочный эффект заключается в том, что больше нельзя сохранять атрибуты внутреннего класса и включающего метода для анонимных и локальных классов внутри сопутствующих методов интерфейса.
Изменить исходный файл по умолчанию на r8-map-id-<MAP_ID>
Это изменение в AGP, начиная с версии 8.12.0.
Если требуется восстановление трассировки (то есть включена обфускация или оптимизация), атрибут исходного файла по умолчанию для класса меняется с SourceFile на r8-map-id-<MAP_ID>.
Новый атрибут исходного файла позволяет извлечь идентификатор файла сопоставления, который необходим для восстановления обфусцированной трассировки стека. Это можно использовать для автоматического восстановления трассировки стека в Logcat.
Если используется настраиваемый атрибут исходного файла (-renamesourcefileattribute), он по-прежнему будет иметь приоритет.
В режиме совместимости с ProGuard (когда gradle.properties содержит android.enableR8.fullMode=false) создание атрибута исходного файла r8-map-id-<MAP_ID> действует, только если атрибут SourceFile не сохраняется. Приложения, использующие режим совместимости ProGuard и желающие включить идентификатор файла сопоставления в трассировку стека, должны удалить -keepattributes SourceFile (или перейти на полный режим R8).
Идентификатор карты, используемый в r8-map-id-<MAP_ID>, – это полный хеш карты, а не префикс из семи символов, который использовался ранее.
Включить использование минимизированных синтетических названий при десахаризации L8
Название синтетических классов, созданных D8, обычно содержит подстроку $$ExternalSynthetic, которая указывает на то, что класс создан D8.
Кроме того, в названии синтетического класса закодирован его тип (например, Backport, Lambda). Это отрицательно влияет на размер итогового DEX-файла, поскольку названия классов занимают больше места в пуле строк.
AGP 9.0 настраивает L8 (десахаризацию основной библиотеки), чтобы файл DEX, содержащий все классы j$, использовал новый сокращенный формат названия класса для синтетических классов. В новом названии класса используется числовой идентификатор (например, $1).
Удалить поддержку -addconfigurationdebugging
В AGP 9.0 прекращена поддержка -addconfigurationdebugging. Теперь компилятор выдает предупреждение, если используется этот флаг.
Удалена поддержка создания правил L8 из D8/R8.
Это изменение касается только разработчиков, которые используют командную строку D8/R8 или API напрямую.
В R8 9.0 удалена поддержка создания правил сохранения для L8 из D8 и R8.
Вместо этого используйте TraceReferences.
В частности, удалены методы D8Command.builder.setDesugaredLibraryKeepRuleConsumer и R8Command.Builder.setDesugaredLibraryKeepRuleConsumer, а также поддержка --desugared-lib-pg-conf-output в параметрах командной строки D8 и R8.
Устраненные проблемы
Плагин Android Gradle 9.0.0
| Устраненные проблемы | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Плагин Android Gradle |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Lint |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Интеграция с Lint |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Shrinker (R8) |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||