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

Плагин Android Gradle 9.0 – это основная версия, в которой изменены API и поведение.

Чтобы обновить плагин Android Gradle до версии 9.0.1, используйте ассистент обновления плагина Android Gradle. Помощник по обновлению AGP помогает сохранить существующее поведение при обновлении проекта, когда это необходимо. Таким образом, вы можете обновить проект до AGP 9.0, даже если вы не готовы принять все новые значения по умолчанию в 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 36.0.0 36.0.0 Установите или настройте инструменты сборки SDK.
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. Это может быть сложнее, поскольку androidComponents API разработан так, чтобы быть более стабильным и обеспечивать совместимость плагинов в течение более длительного времени. Примеры можно найти в разделе Рецепты Gradle.

  • Обновите сторонние плагины. Некоторые сторонние плагины могут по-прежнему зависеть от интерфейсов или API, которые больше не поддерживаются. Перейдите на версии этих плагинов, совместимые с AGP 9.0.

Переход на новые интерфейсы DSL предотвращает использование плагинами и скриптами сборки Gradle различных устаревших API, в том числе:

Устаревший API в блоке android Функция Замена
applicationVariants,
libraryVariants,
testVariants и
unitTestVariants
Точки расширения для плагинов, позволяющие добавлять новые функции в AGP. Замените его на androidComponents.onVariants API, например:
androidComponents {
    onVariants() { variant ->
        variant.signingConfig
            .enableV1Signing.set(false)
    }
}
Не для всех прежних API есть прямая замена. Сообщите о проблеме, если новый вариант API не подходит для вашего случая.
variantFilter Позволяет отключить выбранные варианты. Замените его на androidComponents.beforeVariants API, например:
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

Если вы хотите перейти на новую версию постепенно, в 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, а для встроенного 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.devtools.ksp:symbol-processing-gradle-plugin") {
            version { strictly("KSP_VERSION") }
        }
    }
}

Обратите внимание, что минимальная версия KGP, до которой можно выполнить откат, – 2.0.0.

Поддержка тестовых наборов в IDE

В AGP 9.0 добавлена полная поддержка тестовых фикстур в IDE Android Studio.

Плагин Fused Library

Плагин Fused Library (предварительная версия) позволяет опубликовать несколько библиотек в виде одного файла AAR библиотеки Android. Это упростит использование опубликованных вами артефактов.

Информацию о том, как начать работу, можно найти в статье Как опубликовать несколько библиотек 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, если это возможно, или откажитесь от использования 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 Если какой-либо из файлов, указанных в DSL AGP, не существует на диске, сборка завершится с ошибкой. До этого изменения опечатки в названиях файлов приводили к тому, что файлы игнорировались. false → true Удалите все недействительные объявления файлов ProGuard.
android.r8.optimizedResourceShrinking Позволяет R8 сохранять меньше ресурсов Android, рассматривая классы и ресурсы Android вместе. false → true Если правила хранения в вашем проекте уже заданы, ничего менять не нужно.
android.r8.strictFullModeForKeepRules Позволяет R8 сохранять меньше кода, не сохраняя неявно конструктор по умолчанию, когда сохраняется класс. То есть -keep class A больше не означает -keep class A { <init>(); }
.
false → true Если правила хранения в вашем проекте уже заданы, ничего менять не нужно.

Replace -keep class A with -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 и модуля функций будет завершаться с ошибкой, если файлы сохранения потребителя содержат проблемные конфигурации Proguard. Файлы, которые хранятся у потребителя и содержат глобальные параметры, например ­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 Запретить передачу поставщиков для сгенерированных источников с помощью AndroidSourceSet DSL. 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 не будет обновлять проекты до версии 9.0, если в них используются эти свойства.

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

Изменения в R8

В AGP 9.0.0 включены следующие изменения R8:

Новый вариант конфигурации -processkotlinnullchecks

Мы добавили новый параметр R8 -processkotlinnullchecks, позволяющий настроить R8 для обработки проверок на наличие нулевого значения в Kotlin. Этот параметр принимает обязательный аргумент, который должен быть одним из следующих трех значений: 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 ранее внутренне передавал биты disallow optimization и disallow shrinking синтезированным сопутствующим методам.

Начиная с версии AGP 9.0, правила сохранения больше не применяются к дополнительным методам. Это согласуется с тем, что правила сохранения не применяются к другим полям, методам и классам, синтезированным компилятором.

Перенеся биты disallow optimization и disallow shrinking в дополнительные методы, мы ранее поддерживали следующий вариант использования:

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

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

В дальнейшем этот вариант использования не будет поддерживаться для minSdk <0x0A>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

Это изменение касается только разработчиков, которые используют командную строку или API D8/R8 напрямую.

В 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
androidTest connectedCheck logcat output is broken
Встроенная поддержка Kotlin в AGP не должна синхронизироваться с наборами исходных файлов Kotlin
missingDimensionStrategy предпочитает вариант, совпадающий с его названием, даже если он относится к другому параметру
Встроенная поддержка Kotlin в AGP не должна синхронизироваться с наборами исходных файлов Kotlin
AGP 9.0.0-rc01 не разрешает библиотеки Kotlin с помощью функции kotlin()
Встроенный плагин Kotlin не публикует ограничение зависимости kotlin-stdlib в файле POM Maven
Добавьте тестовый случай для расхождений между compileSdk и targetSdk
Пустое значение resConfigs приводит к непонятной ошибке aapt
В проекте, написанном только на Java, есть зависимость от стандартной библиотеки Kotlin.
Удаление устаревших свойств KotlinMultiplatformAndroidCompilationBuilder в AGP 9.0
У `com.android.tools.build:gradle:9.0.0-alpha05` должна быть зависимость API от KGP и gradle-api
Переименование встроенного плагина Kotlin Gradle com.android.experimental.built-in-kotlin
AGP9: `variant.sources.kotlin!!.addGeneratedSourceDirectory()` не работает
Проверки метаданных AAR в compileSdk используют старый DSL
Удаление устаревшего свойства com.android.build.api.dsl.ManagedDevices.devices
Встроенная поддержка Kotlin в AGP не должна синхронизироваться с наборами исходных файлов Kotlin
Публикация библиотеки Android будет отклонена, если в файле consumer-keep содержится параметр -dontobfuscate
Нет вариантов печати сопоставления для оптимизированных ресурсов
Вызывать finalizeDsl после завершения этого этапа должно быть ошибкой.
AGP инициализирует конфигурацию Jetifier, даже если он отключен
Приложение, созданное на Kotlin, не добавляет kotlinStdlib в качестве зависимости времени компиляции, если для модуля и файлов POM задано значение true для параметра kotlin.stdlib.default.dependency
Новый язык оптимизации DSL не создает файл configuration.txt по умолчанию
AGP 8.13.0 не удается проверить граф навигации в модуле
AGP использует устаревший API Gradle: нотация с несколькими строками
Предупреждение для пользователей, пытающихся использовать устаревшую библиотеку multidex с minSdkVersion >=21
Сборка завершается неудачно, если есть задачи по генерации кода
Если заданы значения `android.builtInKotlin=false`, `android.newDsl=false` и `android.enableLegacyVariantApi=false`, то при использовании плагина `kotlin-android` возникнет ошибка "API 'applicationVariants' is obsolete" (API applicationVariants устарел).
Встроенный Kotlin не может разрешить библиотеку kotlin-stdlib без указания версии, если для параметра kotlin.stdlib.default.dependency задано значение false
DexData открывает файл, не закрывая его, что препятствует очистке
В AGP 9.0 класс AndroidSourceDirectorySet больше не должен расширять класс PatternFilterable
Ошибка тестового приспособления только в тестовых модулях
Неправильная ошибка при использовании получателей контекста в тестовых фикстурах
Некорректные ошибки 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 не удается объединить элементы tools:overrideLibrary в файле манифеста для модульных тестов, обрабатываемом функцией `process{Variant}UnitTestManifest`.
AGP вызывает предупреждения об устаревании в Gradle для задач тестирования JVM
DependencyReportTask несовместим с кешем конфигурации
В AGP 9.0 по умолчанию используется Java 11 вместо Java 8
Переключите значение по умолчанию для параметра android.useAndroidX на true
Улучшена обработка исключений при применении плагина kapt со встроенным Kotlin.
Параметр android.proguard.failOnMissingFiles не работает с consumerProguardFiles
Обновление зависимости плагина Kotlin Gradle до версии 2.2.10
Как создать KotlinJvmAndroidCompilation с помощью API KGP
Режим явного API Kotlin применен к тестовым источникам
Lint
AGP 8.11.0: задача lintAnalyzeRelease завершается с ошибкой при применении файлов .gradle.kts с apply(from = "...")
Проверка Lint ChecksSdkIntAtLeast не проверяет, правильно ли указано аннотированное значение
Встроенный Kotlin не добавляет .kotlin_module в META-INF
Lint classpath содержит дублирующиеся классы разных версий
Обходной путь для переопределения частных ресурсов не работает (tools:override = "true")
Ошибка: при удалении неиспользуемых ресурсов не удаляются их переводы и не появляется запрос на их удаление.
Предупреждение Lint "Не удалось очистить кеш K2"
Предупреждение Lint "Не удалось очистить кеш K2"
Интеграция с Lint
Промахи кеша AndroidLintAnalysisTask в разных поставщиках JDK или второстепенных версиях из-за различий в systemPropertyInputs.javaVersion
Lint автоматически использует последнюю установленную версию SDK, несмотря на compileSdk, не регистрируется как входные данные задачи и нарушает кеширование
Shrinker (R8)
Оптимизированное удаление неиспользуемых ресурсов R8 не работает, если используются конечные идентификаторы ресурсов