Android Gradle plugin 9.0 — это крупный релиз, вносящий изменения в API и поведение программы.
Для обновления до плагина Android Gradle версии 9.0.0 используйте помощник обновления плагина Android Gradle .
Помощник по обновлению AGP помогает сохранить существующие настройки при обновлении вашего проекта, когда это необходимо, позволяя обновить ваш проект до AGP 9.0, даже если вы не готовы принять все новые настройки по умолчанию в AGP 9.0.
Совместимость
Максимальный уровень API, поддерживаемый плагином Android Gradle 9.0, — 36. Вот дополнительная информация о совместимости:
| Минимальная версия | Версия по умолчанию | Примечания | |
|---|---|---|---|
| Грэдл | 9.1.0 | 9.1.0 | Для получения более подробной информации см. раздел «Обновление Gradle» . |
| Инструменты сборки SDK | 36.0.0 | 36.0.0 | Установите или настройте инструменты сборки SDK. |
| НДК | Н/Д | 28.2.13676358 | Установите или настройте другую версию NDK. |
| JDK | 17 | 17 | Для получения более подробной информации см. раздел «Настройка версии JDK» . |
В классах android DSL теперь реализованы только новые публичные интерфейсы.
За последние несколько лет мы внедрили новые интерфейсы для нашего DSL и API, чтобы лучше контролировать, какие API являются публичными. В версиях AGP 7.x и 8.x по-прежнему использовались старые типы DSL (например, BaseExtension ), которые также реализовывали новые публичные интерфейсы, чтобы сохранить совместимость по мере развития работы над интерфейсами.
AGP 9.0 использует исключительно наши новые DSL-интерфейсы, а в реализациях используются новые, полностью скрытые типы. Это также исключает доступ к старому, устаревшему API вариантов.
Для обновления до AGP 9.0 может потребоваться выполнить следующие действия:
- Убедитесь, что ваш проект совместим со встроенным Kotlin : плагин
org.jetbrains.kotlin.androidнесовместим с новым DSL. Переключитесь на плагин библиотеки Android Gradle для KMP в проектах KMP: использование плагина
org.jetbrains.kotlin.multiplatformв том же подпроекте Gradle, что и плагиныcom.android.libraryиcom.android.application, несовместимо с новым DSL.Обновите файлы сборки: хотя изменение интерфейсов призвано сохранить DSL максимально похожим, могут быть некоторые небольшие изменения .
Обновите свою пользовательскую логику сборки, чтобы она ссылалась на новый DSL и API: замените все ссылки на внутренний DSL на публичные интерфейсы DSL. В большинстве случаев это будет замена один к одному. Замените любое использование
applicationVariantsи аналогичных API на новый APIandroidComponents. Это может быть сложнее, поскольку 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 . Ни одна из настроек не оказывает никакого эффекта начиная с плагина Android Gradle версии 7.0. | Прямой замены нет. |
generatePureSplits | Создавайте разделы конфигурации для мгновенных приложений. | Возможность разделять конфигурацию на отдельные компоненты теперь встроена в пакеты приложений Android. |
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
Вы также можете начать обновление до новых API до обновления до AGP 9.0. Новые интерфейсы присутствовали во многих версиях AGP, поэтому у вас может быть сочетание новых и старых. В справочной документации по API AGP показан интерфейс API для каждой версии AGP, а также дата добавления каждого класса, метода и поля.
В ходе альфа-тестирования версии 9.0 мы обращаемся к авторам плагинов с просьбой помочь им адаптировать и выпустить плагины, полностью совместимые с новыми режимами, а также усовершенствуем помощник по обновлению AGP в Android Studio, чтобы он помог вам выполнить миграцию.
Если вы обнаружите, что в новом DSL или 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 автоматически обновит вашу версию KGP до 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.devtoolsksp:symbol-processing-gradle-plugin:KSP_VERSION")
}
}
Понизьте версию KGP до более старой.
Понижение версии KGP возможно только в том случае, если вы отказались от встроенного Kotlin . Это связано с тем, что AGP 9.0 по умолчанию включает встроенный Kotlin, а для его использования требуется KGP 2.2.10 или выше.
Чтобы использовать более старую версию KGP или KSP, укажите эту версию в файле сборки верхнего уровня, используя строгое указание версии :
buildscript {
dependencies {
// For KGP
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin") {
version { strictly("KGP_VERSION") }
}
// For KSP
classpath("com.google.devtoolsksp:symbol-processing-gradle-plugin") {
version { strictly("KSP_VERSION") }
}
}
}
Обратите внимание, что минимальная версия KGP, до которой можно откатиться, — 2.0.0.
Поддержка тестовых стендов в IDE
AGP 9.0 обеспечивает полную поддержку тестовых наборов в среде разработки Android Studio.
Плагин объединенной библиотеки
Плагин Fused Library (предварительная версия) позволяет публиковать несколько библиотек в виде единого Android Library 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. newDsl | Используйте новые DSL-интерфейсы, не раскрывая устаревшие реализации блока android .Это также означает, что устаревший API для работы с вариантами приложений, такой как android.applicationVariants , больше недоступен. | false → true | Вы можете отказаться от этого, установив параметр android.newDsl=false .После того, как все плагины и логика сборки, используемые вашим проектом, будут совместимы, удалите опцию отказа от участия. |
android. builtInKotlin | Включает встроенные функции Kotlin. | false → true | По возможности перейдите на встроенный Kotlin или откажитесь от него . |
android. uniquePackage Names | Обеспечивает наличие у каждой библиотеки уникального имени пакета. | false → true | Укажите уникальные имена пакетов для всех библиотек в вашем проекте. Если это невозможно, вы можете отключить этот флаг во время миграции. |
android. useAndroidx | По умолчанию используются зависимости androidx . | false → true | Используйте зависимости androidx . |
android. default. androidx. test. runner | По умолчанию тесты на устройстве запускаются с помощью класса androidx.test.runner.AndroidJUnitRunner , заменяя устаревший класс InstrumentationTestRunner по умолчанию. android {
defaultConfig {
testInstrumentationRunner = "..."
}
} | false → true | Используйте AndroidJUnitRunner или явно укажите свой собственный testInstrumentationRunner . |
android. dependency. useConstraints | Управляет использованием ограничений зависимостей между конфигурациями. В AGP 9.0 по умолчанию установлено значение false , что означает использование ограничений только в тестах приложений на устройствах (AndroidTest). Установка значения true вернет поведение версии 8.13. | true → false | Не используйте ограничения зависимостей везде, если в этом нет необходимости. Принятие нового значения по умолчанию для этого флага также включает оптимизацию процесса импорта проекта, что должно сократить время импорта для сборок с большим количеством подпроектов библиотек Android. |
android. enableApp CompileTime RClass | Компиляция кода в приложениях с использованием нефинального класса R приводит компиляцию приложения в соответствие с компиляцией библиотеки. Это повышает эффективность поэтапного внедрения и открывает путь для будущей оптимизации производительности процесса обработки ресурсов. | false → true | Во многих проектах можно просто перенять новое поведение без изменений в исходном коде. Если поля класса R используются где-либо, где требуется константа, например, в операторах switch, следует провести рефакторинг, используя цепочки операторов if. |
android. sdk. defaultTargetSdk ToCompileSdk IfUnset | В приложениях и тестах в качестве значения по умолчанию для целевой версии SDK используется версия скомпилированного SDK. До внесения этого изменения целевая версия SDK по умолчанию устанавливалась на минимальную версию SDK. | false → true | Для приложений и тестов явно укажите целевую версию SDK. |
android. onlyEnableUnitTest ForTheTested BuildType | Создаёт компоненты модульных тестов только для тестируемого типа сборки. В проекте по умолчанию это приводит к созданию одного модульного теста для отладки, тогда как ранее модульные тесты запускались либо для отладки, либо для выпуска. | false → true | Если в вашем проекте не требуется запуск тестов как в режиме отладки, так и в режиме выпуска, никаких изменений не требуется. |
android. proguard. failOnMissingFiles | Сборка завершается с ошибкой, если какой-либо из файлов, указанных в AGP DSL, отсутствует на диске. До этого изменения опечатки в именах файлов приводили к тому, что файлы игнорировались без предупреждения. | false → true | Удалите все недействительные объявления файлов ProGuard. |
android. r8. optimizedResourceShrinking | Позволяет R8 использовать меньше ресурсов Android, рассматривая классы и ресурсы Android совместно. | false → true | Если правила сохранения данных в вашем проекте уже настроены, никаких изменений не требуется. |
android. r8. strictFullMode ForKeepRules | Это позволяет R8 сохранять меньше элементов, не сохраняя неявно конструктор по умолчанию, когда класс сохраняется. То есть, -keep class A больше не подразумевает -keep class A { <init>(); } | false → true | Если правила сохранения данных в вашем проекте уже настроены, никаких изменений не требуется. Замените -keep class A на -keep class A { <init>(); } в правилах сохранения в вашем проекте для тех случаев, когда необходимо сохранить конструктор по умолчанию. |
android. defaults. buildfeatures. resvalues | Включает resValues во всех подпроектах | true → false | Включите resValues только в тех подпроектах, которым это необходимо, установив следующие параметры в файлах сборки Gradle этих проектов: android {
buildFeatures {
resValues = true
}
} |
android. defaults. buildfeatures. shaders | Включает компиляцию шейдеров во всех подпроектах. | true → false | Разрешите компиляцию шейдеров только в тех подпроектах, которые содержат шейдеры, подлежащие компиляции, установив следующие параметры в файлах сборки Gradle этих проектов: android {
buildFeatures {
shaders = true
}
} |
android. r8. proguardAndroidTxt. disallowed | В 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. r8. globalOptions InConsumerRules. disallowed | Начиная с 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. sourceset. disallowProvider | Запретить передачу поставщиков для сгенерированных исходных файлов с использованием DSL AndroidSourceSet . | false → true | Используйте API Sources в androidComponents для регистрации сгенерированных исходных файлов. |
android. custom. shader. path. required | Если компиляция шейдеров включена, необходимо явно указать путь к компилятору шейдеров в файле local.properties . | false → true | Добавьте glslc.dir=/path/to/shader-tools в local.properties вашего проекта. |
Удалённые функции
В плагине Android Gradle версии 9.0 удалена следующая функциональность:
- Поддержка приложений Embedded Wear OS
В AGP 9.0 прекращена поддержка встраивания приложений Wear OS, которая больше не поддерживается в Play Store. Это включает в себя удаление конфигурацийwearAppи DSLAndroidSourceSet.wearAppConfigurationName. Инструкции по публикации приложения в Wear OS см. в разделе «Распространение в Wear OS». - задача отчета
androidDependenciesиsourceSetsAndroid - Поддержка разделения по плотности APK
В AGP 9.0 удалена поддержка создания разделенных APK-файлов на основе плотности экрана. Функциональность и связанные с ней API были удалены. Для разделения APK-файлов на основе плотности экрана с использованием AGP 9.0 или более поздних версий используйте пакеты приложений .
Изменен DSL
В плагине Android Gradle версии 9.0 внесены следующие изменения в DSL, нарушающие совместимость:
Параметризация
CommonExtensionудалена.Само по себе это всего лишь изменение на уровне исходного кода, призванное предотвратить подобные изменения в будущем, но оно также означает, что методы блока необходимо перенести из
CommonExtensionвApplicationExtension,LibraryExtension,DynamicFeatureExtensionиTestExtension.При обновлении проекта до AGP 9.0 проведите рефакторинг кода плагина Gradle, использующего эти параметры или методы блоков. Например, следующий плагин обновлен таким образом, чтобы удалить параметр типа и не полагаться на удаленные методы блоков:
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.localDependencySelectionInstallation.installOptions(String). Оно заменяется изменяемым свойствомInstallation.installOptions.Экспериментальный, но так и не стабилизированный блок
PostProcessing.ProductFlavor.setDimensionзаменяется свойствомdimension.LanguageSplitOptions, который был полезен только для Google Play Instant , устарел.DensitySplit, поскольку эта функция больше не поддерживается. В качестве замены можно использовать App Bundles .
Удалённые API
В плагине Android Gradle версии 9.0 удалены следующие изменения:
AndroidComponentsExtension.finalizeDSl. Он заменяется наfinalizeDslComponent.transformClassesWith. Он заменяется наInstrumentation.transformClassesWithComponent.setAsmFramesComputationMode. Заменяется наInstrumentation.setAsmFramesComputationModeComponentBuilder.enabled. Заменяется наComponentBuilder.enable.DependenciesInfoBuilder.includedInApkзаменяется наincludeInApkDependenciesInfoBuilder.includedInBundleзаменяется наincludeInBundle.GeneratesApk.targetSdkVersionзаменяется наtargetSdkVariant.minSdkVersionзаменяется наminSdkVariant.maxSdkVersionзаменяется наmaxSdkVariant.targetSdkVersionзаменяется наtargetSdkVariant.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. defaults. buildfeatures. aidl | Включает компиляцию AIDL во всех подпроектах. | Разрешите компиляцию AIDL только в тех подпроектах, где есть исходные файлы AIDL, установив следующее свойство в файлах сборки Gradle этих проектов:android {
buildFeatures {
aidl = true
}
} |
android. defaults. buildfeatures. renderscript | Включает компиляцию RenderScript во всех подпроектах. | Разрешите компиляцию RenderScript только в тех подпроектах, где есть исходные файлы RenderScript, установив следующее свойство в файлах сборки Gradle этих проектов: android {
buildFeatures {
renderScript = true
}
} |
Объекты с принудительной регулировкой уровня грунта
В AGP 9.0 возникает ошибка, если задать следующие свойства Gradle.
Плагин Android Gradle Upgrade Assistant не будет обновлять до AGP 9.0 проекты, использующие эти свойства.
| Свойство | Функция |
|---|---|
android. r8. integratedResourceShrinking | Теперь уменьшение объема ресурсов всегда выполняется в рамках R8, предыдущая реализация была удалена. |
android. enableNewResourceShrinker. preciseShrinking | Теперь при сокращении ресурсов всегда используется точное сокращение ресурсов, что позволяет удалять больше ресурсов. |
Изменения в R8
В AGP 9.0.0 включены следующие изменения R8.
Новая опция конфигурации -processkotlinnullchecks
Мы добавили новую опцию R8 -processkotlinnullchecks для настройки R8 на обработку проверок на null в Kotlin. Эта опция принимает обязательный аргумент, который должен принимать одно из следующих трех значений: keep , remove_message и remove . Опция обрабатывает следующие проверки на null, добавленные компилятором 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, правила сохранения больше не применяются к сопутствующим методам. Это соответствует тому факту, что правила сохранения не применяются к другим полям/методам/классам, синтезируемым компилятором.
Благодаря переносу функций запрета оптимизации и запрета уменьшения битов в сопутствующие методы, ранее поддерживался следующий вариант использования:
- Скомпилируйте библиотеку с методами интерфейса
default/static/privateметодами в DEX сminSdk< 24 и правилами, которые сохраняют методы интерфейса. - Скомпилируйте приложение, добавив библиотеку в classpath и
-applymapping. - Объедините приложение и библиотеку.
Обратите внимание, что это работает только с -applymapping поскольку бит disallow obfuscation не передается на сопутствующие методы — то есть, сопутствующие классы, сгенерированные на шаге 1, будут иметь обфусцированные имена методов.
В дальнейшем этот вариант использования больше не поддерживается для minSdk < 24. В качестве обходного пути можно выполнить следующие действия:
- Десахаризация библиотеки с методами интерфейса
default/static/privateметодами в файлах классов сminSdk< 24. - Скомпилируйте десахаризованный артефакт, используя R8 и правила, которые сохраняют методы интерфейса в сопутствующих классах.
- Скомпилируйте приложение, добавив библиотеку в classpath.
- Объедините приложение и десахаризованный артефакт.
Ещё одним побочным эффектом этого является невозможность сохранения атрибутов внутреннего класса и объемлющего метода для анонимных и локальных классов внутри сопутствующих методов интерфейса.
Измените исходный файл, генерируемый по умолчанию, на 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> используется полный хеш карты, а не 7-символьный префикс хеша карты, который использовался ранее.
Разрешить использование сокращенных синтетических названий при десахарировании 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 plugin 9.0.0-rc03
| Исправлены ошибки | ||
|---|---|---|
| Плагин Android Gradle |
| |
Android Gradle plugin 9.0.0-rc02
| Исправлены ошибки | |
|---|---|
| В AGP 9.0.0-rc02 не было отмечено ни одной исправленной проблемы, относящейся к общедоступным ресурсам. |
Android Gradle plugin 9.0.0-rc01
| Исправлены ошибки | |
|---|---|
| В AGP 9.0.0-rc01 не было отмечено ни одной исправленной проблемы, относящейся к общедоступным ресурсам. |
Android Gradle plugin 9.0.0-beta05
| Исправлены ошибки | ||
|---|---|---|
| Плагин Android Gradle |
| |
Android Gradle plugin 9.0.0-beta04
| Исправлены ошибки | |||
|---|---|---|---|
| Плагин Android Gradle |
| ||
Android Gradle plugin 9.0.0-beta03
| Исправлены ошибки | |
|---|---|
| В AGP 9.0.0-beta03 не было отмечено ни одной исправленной проблемы, относящейся к общедоступным ресурсам. |
Android Gradle plugin 9.0.0-beta02
| Исправлены ошибки | ||||
|---|---|---|---|---|
| Плагин Android Gradle |
| |||
| Ворс |
| |||
| Интеграция Lint |
| |||
Android Gradle plugin 9.0.0-beta01
| Исправлены ошибки | |
|---|---|
| В AGP 9.0.0-beta01 не было отмечено ни одной исправленной проблемы, относящейся к общедоступным ресурсам. |
Android Gradle plugin 9.0.0-alpha14
| Исправлены ошибки | |||||||
|---|---|---|---|---|---|---|---|
| Плагин Android Gradle |
| ||||||
| Интеграция Lint |
| ||||||
| Уменьшитель (R8) |
| ||||||
Android Gradle plugin 9.0.0-alpha13
| Исправлены ошибки | ||||
|---|---|---|---|---|
| Плагин Android Gradle |
| |||
Android Gradle plugin 9.0.0-alpha12
| Исправлены ошибки | |||||
|---|---|---|---|---|---|
| Плагин Android Gradle |
| ||||
Android Gradle plugin 9.0.0-alpha11
| Исправлены ошибки | ||||
|---|---|---|---|---|
| Плагин Android Gradle |
| |||
Android Gradle plugin 9.0.0-alpha10
| Исправлены ошибки | ||||
|---|---|---|---|---|
| Плагин Android Gradle |
| |||
| Ворс |
| |||
Android Gradle plugin 9.0.0-alpha09
| Исправлены ошибки | ||||
|---|---|---|---|---|
| Плагин Android Gradle |
| |||
Android Gradle plugin 9.0.0-alpha08
| Исправлены ошибки | |
|---|---|
| В AGP 9.0.0-alpha08 не было отмечено ни одной исправленной проблемы, относящейся к общедоступным ресурсам. |
Android Gradle plugin 9.0.0-alpha07
| Исправлены ошибки | |||||||||
|---|---|---|---|---|---|---|---|---|---|
| Плагин Android Gradle |
| ||||||||
Android Gradle plugin 9.0.0-alpha06
| Исправлены ошибки | |||||
|---|---|---|---|---|---|
| Плагин Android Gradle |
| ||||
| Ворс |
| ||||
Android Gradle plugin 9.0.0-alpha05
| Исправлены ошибки | |||||
|---|---|---|---|---|---|
| Плагин Android Gradle |
| ||||
| Ворс |
| ||||
Android Gradle plugin 9.0.0-alpha04
| Исправлены ошибки | ||||
|---|---|---|---|---|
| Плагин Android Gradle |
| |||
| Ворс |
| |||
Android Gradle plugin 9.0.0-alpha03
| Исправлены ошибки | ||||
|---|---|---|---|---|
| Плагин Android Gradle |
| |||
| Ворс |
| |||
Android Gradle plugin 9.0.0-alpha02
| Fixed Issues | ||||
|---|---|---|---|---|
| Android Gradle Plugin |
| |||
Android Gradle plugin 9.0.0-alpha01
| Fixed Issues | |||||||
|---|---|---|---|---|---|---|---|
| Android Gradle Plugin |
| ||||||
Android Gradle plugin 9.0.0
| Fixed Issues | |
|---|---|
| No public issues were marked as fixed in AGP 9.0.0 |