Плагин Android Gradle 9.0.1 (январь 2026 г.)

Плагин 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 на новый androidComponents API. Это может быть сложнее, поскольку API androidComponents разработан так, чтобы быть более стабильным и дольше сохранять совместимость плагинов. Примеры можно найти в рецептах 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)
    }
}
Не у всех прежних API есть прямые аналоги. Если у вас есть сценарий использования, который не поддерживается новыми API вариантов, сообщите нам об этом.
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.newDsl Используйте новые интерфейсы DSL, не раскрывая устаревшие реализации блока android.
Это также означает, что устаревший вариант API, такой как android.applicationVariants больше не доступен.
false → true Чтобы отказаться от этого, задайте параметр android.newDsl=false.
Когда все плагины и логика сборки, используемые в вашем проекте, станут совместимыми, удалите отказ.
android.builtInKotlin Включает встроенный Kotlin. false → true Перейдите на встроенный Kotlin, если это возможно, или откажитесь от перехода.
android.uniquePackageNames Обеспечивает уникальность названия пакета для каждой библиотеки. 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.enableAppCompileTimeRClass Компиляция кода в приложениях с использованием неокончательного класса R, что приводит компиляцию приложений в соответствие с компиляцией библиотек.
Это улучшает инкрементальность и открывает путь для будущих оптимизаций производительности в процессе обработки ресурсов.
false → true Во многих проектах можно просто перейти на новую модель без изменения исходного кода. Если поля класса R используются там, где требуется константа, например в операторах switch, выполните рефакторинг, чтобы использовать цепочки операторов if.
android.sdk.defaultTargetSdkToCompileSdkIfUnset Использует версию SDK для компиляции в качестве значения по умолчанию для целевой версии SDK в приложениях и тестах.
До этого изменения целевая версия SDK по умолчанию соответствовала минимальной версии SDK.
false → true Явно укажите целевую версию SDK для приложений и тестов.
android.onlyEnableUnitTestForTheTestedBuildType Создает компоненты модульного тестирования только для тестируемого типа сборки.
В проекте по умолчанию это приводит к созданию одного модульного теста для отладки, тогда как ранее модульные тесты выполнялись для отладки или выпуска.
false → true Если в вашем проекте не требуется запускать тесты как для отладочной, так и для рабочей версии, никаких изменений не требуется.
android.proguard.failOnMissingFiles Если на диске нет файлов, указанных в AGP DSL, сборка завершается с ошибкой. Ранее опечатки в названиях файлов приводили к тому, что файлы игнорировались без уведомления. false → true Удалите все недопустимые объявления файлов ProGuard.
android.r8.optimizedResourceShrinking Позволяет R8 сохранять меньше ресурсов Android, рассматривая классы и ресурсы Android вместе. false → true Если правила хранения проекта уже настроены, ничего менять не нужно.
android.r8.strictFullModeForKeepRules Позволяет 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.globalOptionsInConsumerRules.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 удалены следующие функции:

Измененный 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 удалены:

Удаленные API

В плагине Android Gradle 9.0 удалены:

Удаленные свойства Gradle

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

Эти функции отключены по умолчанию начиная с AGP 8.0 или более ранней версии. Чтобы сборка выполнялась эффективнее, включайте эти функции только в тех подпроектах, где они используются.

Свойство Функция Замена
android.defaults.buildfeatures.aidl Включает компиляцию AIDL во всех подпроектах. Включите компиляцию AIDL только в подпроектах, где есть источники AIDL, задав следующее свойство в файлах сборки Gradle этих проектов:
android {
  buildFeatures {
    aidl = true
  }
}
в файле сборки Gradle каждого подпроекта, содержащего исходные файлы AIDL.
android.defaults.buildfeatures.renderscript Включает компиляцию RenderScript во всех подпроектах. Включите компиляцию Renderscript только в тех подпроектах, где есть исходные файлы Renderscript. Для этого задайте следующее свойство в файлах сборки Gradle этих проектов:
android {
  buildFeatures {
    renderScript = true
  }
}

Принудительно применяемые свойства Gradle

AGP 9.0 выдает ошибку, если вы задаете следующие свойства Gradle.

Помощник по обновлению плагина Android Gradle не будет обновлять до AGP 9.0 проекты, в которых используются эти свойства.

Свойство Функция
android.r8.integratedResourceShrinking Удаление неиспользуемых ресурсов теперь всегда выполняется в рамках R8, предыдущая реализация удалена.
android.enableNewResourceShrinker.preciseShrinking Теперь при удалении неиспользуемых ресурсов всегда применяется точный режим, который позволяет удалять больше ресурсов.

Изменения 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 в сопутствующие методы ранее поддерживал следующий сценарий использования:

  1. Скомпилируйте библиотеку с методами интерфейса default/static/private в DEX с minSdk < 24 и правилами, которые сохраняют методы интерфейса.
  2. Скомпилируйте приложение с библиотекой в пути к классам и -applymapping.
  3. Объедините приложение и библиотеку.

Обратите внимание, что это работает только с -applymapping, поскольку бит disallow obfuscation не передается сопутствующим методам. Это означает, что у сопутствующих классов, созданных на шаге 1, будут обфусцированные названия методов.

В дальнейшем этот вариант использования больше не будет поддерживаться для minSdk < 24. Чтобы обойти эту проблему, выполните следующие действия:

  1. Дешугаризация библиотеки с методами интерфейса default/static/private для файлов классов с minSdk < 24.
  2. Скомпилируйте десахаризованный артефакт с помощью R8 и правил, которые сохраняют методы интерфейса в сопутствующих классах.
  3. Скомпилируйте приложение с библиотекой в пути к классам.
  4. Объедините приложение и десахаризованный артефакт.

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

Изменить исходный файл по умолчанию на 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
Запрос на добавление функции: внедрение идеальной версии AGP в качестве свойства
Стабилизация SingleArtifact.VERSION_CONTROL_INFO_FILE
Вывод logcat для androidTest connectedCheck не работает
Встроенная поддержка Kotlin в AGP не должна синхронизироваться с наборами исходных кодов Kotlin.
missingDimensionStrategy предпочитает вариант, соответствующий его собственному названию, даже из несвязанного параметра
Встроенная поддержка Kotlin в AGP не должна синхронизироваться с наборами исходных кодов Kotlin.
AGP 9.0.0-rc01 не разрешает библиотеки Kotlin через функцию kotlin()
Встроенный Kotlin не публикует ограничение зависимости kotlin-stdlib в maven pom
Добавлен отчет о тестировании для расхождения между compileSdk и targetSdk.
Пустое значение resConfigs приводит к непонятной ошибке aapt.
Проект на чистом Java зависит от стандартной библиотеки Kotlin.
Удаление устаревших свойств KotlinMultiplatformAndroidCompilationBuilder в AGP 9.0
`com.android.tools.build:gradle:9.0.0-alpha05` должен иметь зависимость API от KGP и gradle-api
Переименование плагина Gradle com.android.experimental.built-in-kotlin
AGP9: `variant.sources.kotlin!!.addGeneratedSourceDirectory()` не работает
Проверка метаданных AAR при компиляции SDK использует старый DSL
Удалено устаревшее свойство com.android.build.api.dsl.ManagedDevices.devices
Встроенная поддержка Kotlin в AGP не должна синхронизироваться с наборами исходных кодов Kotlin.
Не публиковать библиотеку Android, если файл keep содержит -dontobfuscate
Нет параметров для печати сопоставления оптимизированных ресурсов
Вызов finalizeDsl после завершения этого этапа будет считаться ошибкой.
AGP инициализирует конфигурацию Jetifier, даже если Jetifier отключен.
built in kotlin does not add kotlinStdlib as a compile time dependency when `kotlin.stdlib.default.dependency` is true to module and pom files
Новый DSL оптимизации не создает файл configuration.txt по умолчанию.
AGP 8.13.0 не может проверить граф навигации в модуле
AGP использует устаревший Gradle API: многострочную нотацию
Предупреждать пользователей, пытающихся использовать устаревшую библиотеку multidex с minSdkVersion >=21
Сборка завершается ошибкой, если есть задачи по генерации кода.
Если заданы параметры `android.builtInKotlin=false`, `android.newDsl=false` и `android.enableLegacyVariantApi=false`, при использовании плагина `kotlin-android` произойдет сбой с ошибкой "API applicationVariants устарел".
Встроенный Kotlin не может разрешить kotlin-stdlib без версии, когда kotlin.stdlib.default.dependency=false
DexData открывает файл, не закрывая его, что препятствует очистке
AndroidSourceDirectorySet не должен расширять PatternFilterable в AGP 9.0
Ошибка тестовой оснастки в модулях, предназначенных только для тестирования
Неправильная ошибка при использовании получателей контекста в тестовых фикстурах
Неверные ошибки IDE для кода Kotlin в testFixtures
Плагин legacy-kapt пропускает обработку аннотаций, в отличие от kotlin-kapt.
compileSdkSpec.minorApiLevel не работает с SettingsExtension
[fused lib - public] Сгенерированная объединенная библиотека не включает источники
extractNativeLibs и useEmbeddedDex не должны поступать из манифеста.
Предупреждения от R8 в AGP 9.0.0-alpha09
Удаление устаревшего AndroidSourceSet.jni в AGP 9.0
Удаление Installation.installOptions() в AGP 9.0
Удалите BuildType.isRenderscriptDebuggable в AGP 9.0.
Удалите android.defaults.buildfeatures.renderscript
Сбой `com.android.kotlin.multiplatform.library` при использовании устройств под управлением Gradle
Удалите флаги gradle.properties по умолчанию `android.defaults.buildfeatures.aidl`
Ошибка сборки, если файл proguard не существует
remove buildconfig defaults gradle.properties flags
Измените значение targetSdk по умолчанию, чтобы оно основывалось на compileSdk, а не на minSdk.
Если включен параметр isIncludeAndroidResources, то в AGP 8.12.0 при выполнении задачи process{Variant}UnitTestManifest не удается объединить элементы tools:overrideLibrary.
Плагин AGP вызывает предупреждения об устаревании в Gradle для тестовых задач JVM
DependencyReportTask несовместим с кешем конфигурации
Переход с Java 8 на Java 11 в качестве версии Java по умолчанию для исходного и целевого кода в AGP 9.0
Установите для android.useAndroidX значение true по умолчанию.
Улучшено исключение при применении плагина kapt со встроенным Kotlin.
android.proguard.failOnMissingFiles не работает для consumerProguardFiles
Обновите зависимость плагина Kotlin Gradle до версии 2.2.10.
Создание KotlinJvmAndroidCompilation с помощью KGP API
Режим явного API Kotlin применяется к тестовым источникам
Lint
AGP 8.11.0: сбой задачи lintAnalyzeRelease при применении файлов .gradle.kts с помощью apply(from = "...")
Проверка Lint ChecksSdkIntAtLeast не проверяет, правильно ли аннотировано значение.
Встроенный Kotlin не добавляет .kotlin_module в META-INF
Путь к классам Lint содержит дублирующиеся классы разных версий.
Не работает обходной путь для переопределения частных ресурсов (tools:override = "true")
Ошибка: при удалении неиспользуемых ресурсов не удаляются их переводы и не появляется запрос на их удаление
Предупреждение Lint "Could not clean up K2 caches" (Не удалось очистить кеш K2)
Предупреждение Lint "Could not clean up K2 caches" (Не удалось очистить кеш K2)
Интеграция с Lint
Отсутствие совпадений в кеше AndroidLintAnalysisTask у разных поставщиков JDK или промежуточных версий из-за различий в systemPropertyInputs.javaVersion
Lint автоматически использует последнюю установленную версию SDK, несмотря на compileSdk, не регистрируется как входные данные задачи и нарушает кеширование
Shrinker (R8)
Оптимизированное удаление неиспользуемых ресурсов R8 не выполняется, если используются окончательные идентификаторы ресурсов