Заметки о выпуске предварительной версии плагина Android Gradle

На этой странице содержатся заметки о выпуске предварительных версий плагина Android Gradle (AGP).

Плагин Android Gradle 9.0

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

Чтобы обновить плагин Android Gradle до версии 9.0.0-alpha05, используйте помощник по обновлению плагина Android Gradle в Android Studio Narwhal 4 Feature Drop | 2025.1.4.

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

Совместимость

Максимальный уровень API Android, поддерживаемый плагином Android Gradle 9.0.0-alpha05, — это уровень API 36.

Для плагина Android Gradle 9.0.0-alpha05 требуется Gradle 9.0.0 .

Минимальная версия Версия по умолчанию Примечания
Грейдл 9.0.0 9.0.0 Более подробную информацию см. в разделе Обновление Gradle .
Инструменты сборки SDK 36.0.0 36.0.0 Установите или настройте инструменты сборки SDK.
НДК Н/Д 28.2.13676358 Установите или настройте другую версию NDK.
JDK 17 17 Более подробную информацию см. в разделе Установка версии JDK .

Классы 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 Library для KMP : использование плагина org.jetbrains.kotlin.multiplatform в том же подпроекте Gradle, что и плагины com.android.library и com.android.application , несовместимо с новым DSL.

  • Обновите файлы сборки: хотя изменение интерфейсов призвано сохранить DSL максимально схожим, некоторые небольшие изменения могут быть.

  • Обновите свою пользовательскую логику сборки, добавив ссылки на новый DSL и API: замените все ссылки на внутренний DSL на публичные интерфейсы DSL. В большинстве случаев это будет однозначная замена. Замените любое использование applicationVariants и подобных API на новый API androidComponents . Это может быть сложнее, поскольку API androidComponents разработано для большей стабильности и более длительной совместимости плагинов. Примеры см. в наших рецептах Gradle .

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

Если вы обновляетесь до 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 или Variant API отсутствуют какие-либо возможности или функции, пожалуйста, сообщите о проблеме как можно скорее.

Встроенный Kotlin

Плагин Android Gradle 9.0 включает встроенную поддержку компиляции Kotlin, заменяя отдельно устанавливаемый плагин Kotlin. Это упрощает интеграцию с AGP, исключая использование устаревших API и повышая производительность в некоторых случаях.

Плагин Android Gradle 9.0 имеет зависимость времени выполнения от плагина Kotlin Gradle 2.2.10, который является минимальной версией, необходимой для встроенной поддержки Kotlin.

Вы можете отказаться от встроенного Kotlin, установив android.builtInKotlin=false .

Если вы отказались от встроенного Kotlin и вам также необходимо использовать более старую версию плагина Kotlin Gradle, вы можете принудительно перейти на более раннюю версию:

buildscript {
    dependencies {
        classpath("org.jetbrains.kotlin:kotlin-gradle-plugin") {
            version { strictly("2.0.0") } // or another version that you want to use
        }
    }
}

Изменения поведения

Плагин 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 , больше недоступен.
falsetrue Вы можете отказаться, установив android.newDsl=false .
Как только все плагины и логика сборки, используемые вашим проектом, станут совместимыми, удалите опцию «Opt-out».
android.builtInKotlin Включена поддержка компиляции кода Kotlin непосредственно в плагине Android Gradle, без плагина org.jetbrains.kotlin.android . falsetrue Используйте встроенный Kotlin, отказавшись от плагина org.jetbrains.kotlin.android , если это возможно. В противном случае откажитесь от него, установив android.builtInKotlin=false
android.uniquePackageNames Обеспечивает, чтобы каждая библиотека имела уникальное имя пакета. falsetrue Укажите уникальные имена пакетов для всех библиотек в вашем проекте. Если это невозможно, вы можете отключить этот флаг на время миграции.
android.dependency.useConstraints Управляет использованием ограничений зависимости между конфигурациями.
В AGP 9.0 значение по умолчанию — false , что означает использование ограничений только в тестах устройств приложений (AndroidTest). Установка значения true вернёт поведение версии 8.13.
truefalse Не используйте ограничения зависимостей везде, если в них нет необходимости. Принятие нового значения этого флага по умолчанию также позволяет оптимизировать процесс импорта проекта, что должно сократить время импорта сборок с большим количеством подпроектов библиотек Android.
aandroid.enableAppCompileTimeRClass Компилировать код в приложениях с использованием нефинального класса R, приводя компиляцию приложений в соответствие с компиляцией библиотек.
Это повышает приращения и прокладывает путь для будущей оптимизации производительности потока обработки ресурсов.
falsetrue Многие проекты могут просто адаптировать новое поведение без внесения изменений в исходный код. Если поля класса R используются где-либо, где требуется константа, например, в случаях switch, выполните рефакторинг, чтобы использовать цепочку операторов if.
android.sdk.defaultTargetSdkToCompileSdkIfUnset Использует версию SDK компиляции в качестве значения по умолчанию для целевой версии SDK в приложениях и тестах.
До внесения этих изменений целевой версией SDK по умолчанию была минимальная версия SDK.
falsetrue Укажите явно целевую версию SDK для приложений и тестов.
android.onlyEnableUnitTestForTheTestedBuildType Создает только компоненты модульного тестирования для тестируемого типа сборки.
В проекте по умолчанию это приводит к запуску одного модульного теста для отладки, тогда как ранее предполагалось, что модульные тесты запускаются для отладки или выпуска.
falsetrue Если вашему проекту не требуется проводить тесты как для отладки, так и для выпуска, то никаких изменений не требуется.
android.proguard.failOnMissingFiles Сборка завершается ошибкой, если какой-либо из файлов keep, указанных в AGP DSL, отсутствует на диске. До этого изменения опечатки в именах файлов приводили к тому, что файлы игнорировались без уведомления. falsetrue Удалите все недействительные объявления файлов Proguard.
android.r8.optimizedResourceShrinking Позволяет R8 экономить меньше ресурсов Android за счет совместного рассмотрения классов и ресурсов Android. falsetrue Если правила хранения вашего проекта уже установлены, то никаких изменений не требуется.
android.r8.strictFullModeForKeepRules Позволяет R8 сохранять меньше, не сохраняя неявно конструктор по умолчанию при сохранении класса. То есть, -keep class A больше не подразумевает -keep class A { <init>(); }
falsetrue Если правила хранения вашего проекта уже установлены, то никаких изменений не требуется.

Замените -keep class A на -keep class A { <init>(); } в правилах сохранения вашего проекта для всех случаев, когда вам необходимо сохранить конструктор по умолчанию.
android.defaults.buildfeatures.resvalues Включает resValues ​​во всех подпроектах truefalse Включите resValues ​​только в тех подпроектах, которым это необходимо, установив следующее в файлах сборки Gradle этих проектов:
android {
  buildFeatures {
    resValues = true
  }
}
android.defaults.buildfeatures.shaders Включает компиляцию шейдеров во всех подпроектах truefalse Включите компиляцию шейдеров только в тех подпроектах, которые содержат шейдеры, подлежащие компиляции, установив следующее в файлах сборки Gradle этих проектов:
android {
  buildFeatures {
    shaders = true
  }
}

Удаленные функции

Плагин Android Gradle 9.0 удаляет следующие функции:

Измененный DSL

В плагине Android Gradle 9.0 имеются следующие критические изменения DSL:

  • Параметризация CommonExtension была удалена.

    Само по себе это всего лишь изменение на уровне исходного кода, призванное помочь избежать будущих изменений на уровне исходного кода, но это также означает, что методы блока необходимо переместить из CommonExtension в ApplicationExtension , LibraryExension , DynamicFeatureExtension и TestExtension .

    При обновлении проекта до AGP 9.0 выполните рефакторинг кода плагина Gradle, использующего эти параметры или методы блоков. Например, следующий плагин обновлён, чтобы удалить параметр типа и не использовать удалённые методы блоков:

    АГП 8.13

    val commonExtension: CommonExtension<*, *, *, *, *, *> =
            extensions.getByType(CommonExtension::class)
    commonExtension.apply {
        defaultConfig {
            minSdk {
                version = release(28)
            }
        }
    }
    

    АГП 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 удаляет:

Удалены свойства 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
  }
}

Удаленные API

Плагин Android Gradle 9.0 удаляет:

  • Устаревшие и отключенные API BaseExtension.registerTransform , которые остались только для того, чтобы позволить компиляцию с последней версией AGP при работе на AGP 4.2 или ниже.

  • Устаревшие и отключенные FeaturePlugin и FeatureExtension .

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

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

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

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