На этой странице отслеживается устаревание и удаление API плагина Android Gradle (AGP), а также предоставляется информация о том, как обновить код соответствующим образом.
Трекер устаревания и удаления API
В следующей таблице приведены сведения о том, когда API AGP устаревают и удаляются, в зависимости от версии AGP.
API | Устаревшее в версии AGP | Удалено из версии AGP |
---|---|---|
Component.setAsmFramesComputationMode | 7.2 | |
Component.transformClassesWith | 7.2 | |
RenderScript | 7.2 | |
Трансформировать | 7.2 | 8.0 |
АГП 8.10
Плагин Android Gradle 8.10.0 содержит следующие важные изменения API.
Критическое изменение на уровне исходного кода: finalizeDsl
теперь требует использования параметризованных типов
Чтобы разрешить использовать AndroidComponentsExtension
напрямую с плагином com.android.kotlin.multiplatform.library
, привязка типа к finalizeDsl
была ослаблена.
Например, если вы использовали необработанные типы AndroidComponentsExtension
для обращения к приложениям и библиотекам:
extensions.getByType(AndroidComponentsExtension::class).finalizeDsl { androidExtension ->
androidExtension.experimentalProperties["android.example"] = true
}
Вам необходимо будет адаптировать исходный код до или во время обновления следующим образом:
extensions.getByType<AndroidComponentsExtension<CommonExtension<*, *, *, *, *, *>, *, *>>().finalizeDsl { androidExtension ->
androidExtension.experimentalProperties["android.example"] = true
}
Обратите внимание: если вы хотите написать код finalizeDsl
, который работает как с текущими плагинами com.android.library
и com.android.application
, так и с новым плагином com.android.kotlin.multiplatform.library
, вам может потребоваться проверить типы во время выполнения:
extensions.getByType<AndroidComponentsExtension<*, *, *>>().finalizeDsl { androidExtension ->
when(androidExtension) {
is CommonExtension<*, *, *, *, *, *> -> androidExtension.experimentalProperties["android.example"] = true
is KotlinMultiplatformAndroidLibraryExtension -> androidExtension.experimentalProperties["android.example"] = true
}
}
Это изменение касается только уровня исходного кода и не повлияет на двоичные плагины.
АГП 8.8
Ниже приведены важные обновления API для AGP 8.8.
Конфигурации ресурсов устарели
Конфигурации ресурсов устарели с версии AGP 8.8 . Это было сделано, поскольку AGP больше не поддерживает различные плотности ресурсов, а Google Play Console теперь требует, чтобы приложения публиковались как App Bundles. Для конфигурации языка вы можете указать локали, которые поддерживает ваше приложение, используя localeFilters
DSL для сопоставления локальных конфигураций с соответствующими ресурсами.
АГП 8.0
Ниже приведены важные обновления API для AGP 8.0.
API преобразования удален
Начиная с AGP 8.0, API Transform удален. Это означает, что все классы в пакете com.android.build.api.transform
удалены.
Transform API удаляется для повышения производительности сборки. Проекты, использующие Transform API, заставляют AGP использовать менее оптимизированный поток для сборки, что может привести к большим регрессиям во времени сборки. Также сложно использовать Transform API и комбинировать его с другими функциями Gradle; заменяющие API направлены на то, чтобы упростить расширение AGP без возникновения проблем с производительностью или корректностью сборки.
Замена API
Единой замены для Transform API не существует — есть новые, целевые API для каждого варианта использования. Все заменяющие API находятся в блоке androidComponents {}
. Все эти API доступны в AGP 7.2.
Поддержка преобразования байт-кода
Для преобразования байт-кода используйте API Instrumentation. Для библиотек вы можете зарегистрировать инструментарий только для локальных классов проекта; для приложений и тестов вы можете выбрать регистрацию инструментации только для локальных классов или для всех классов, включая локальные и удаленные зависимости. Для использования этого API инструментация запускается независимо для каждого класса с ограниченным доступом к другим классам в classpath (см. createClassVisitor()
для получения дополнительной информации). Это ограничение повышает производительность как полных, так и инкрементальных сборок и сохраняет простоту поверхности API. Каждая библиотека инструментируется параллельно, как только она готова, а не после завершения всей компиляции. Кроме того, изменение в одном классе означает, что только затронутые классы должны быть повторно инструментированы в инкрементальной сборке. Пример того, как использовать API Instrumentation, см. в рецепте Transforming classes with ASM AGP.
Поддержка добавления сгенерированных классов в ваше приложение
Чтобы добавить дополнительные сгенерированные классы в приложение, используйте API Artifacts с MultipleArtifact.ALL_CLASSES_DIRS
. В частности, используйте
artifacts.use(TaskProvider)
.wiredWith(...)
.toAppend(Artifact.Multiple)
с MultipleArtifact.ALL_CLASSES_DIRS
для добавления дополнительных сгенерированных каталогов к классам проекта. API Artifacts автоматически выберет уникальное расположение для вашей пользовательской задачи для вывода. См. рецепт addToAllClasses для примера использования этого API.
Поддержка преобразований на основе анализа всей программы
Для реализации преобразований на основе анализа всей программы все классы можно преобразовать вместе в одной задаче. Этот подход следует использовать с осторожностью, поскольку он имеет гораздо более высокую стоимость производительности сборки, чем использование API Instrumentation. Если ваш плагин использует этот API, рекомендуется, чтобы преобразование было включено для каждого типа сборки, чтобы разработчик приложения мог отключить его для сборок разработки.
Для регистрации задачи, которая преобразует все классы вместе, плагин Android Gradle 7.4 представляет API Artifacts.forScope . Для преобразования всех классов в текущем проекте используйте Artifacts.forScope.PROJECT
. Для преобразования всех классов в текущем проекте, импортированных проектах и всех внешних зависимостях используйте Artifacts.forScope.ALL
. Следующий код показывает, как использовать Artifacts.forScope.ALL
для регистрации задачи, которая преобразует все классы вместе:
variant.artifacts.forScope(ScopedArtifacts.Scope.ALL)
.use(taskProvider)
.toTransform(
ScopedArtifact.CLASSES,
ModifyClassesTask::allJars,
ModifyClassesTask::allDirectories,
ModifyClassesTask::output,
)
См. рецепт modifyProjectClasses для примера использования этого API и рецепт configureAgpDsl для примера регистрации пользовательских расширений для типов сборки Android.
Если ваш вариант использования не охвачен ни одним из API AndroidComponents , сообщите об ошибке .
Несколько часто используемых плагинов уже перешли на использование этих новых API, включая плагин мониторинга производительности Firebase (1.4.1 совместим с AGP 8.0) и плагин Hilt Gradle (2.40.1 совместим с AGP 8.0). Помощник по обновлению AGP также поможет разработчикам проектов обновить часто используемые плагины по мере необходимости.
Если вы используете API Transform через сторонний плагин, сообщите автору, что его плагин необходимо обновить для работы с новыми API для AGP 8.0.
АГП 7.2
Ниже приведены важные обновления API для AGP 7.2.
RenderScript устарел
Начиная с AGP 7.2, API RenderScript устарели. Они продолжат работать, но будут вызывать предупреждения и будут полностью удалены в будущих версиях AGP. Руководство по переходу с RenderScript см. в разделе Миграция с RenderScript .
Component.transformClassesWith
и Component.setAsmFramesComputationMode
устарели
Начиная с AGP 7.2, API-интерфейсы инструментирования байт-кода класса Component.transformClassesWith
и Component.setAsmFramesComputationMode
устарели. Они были перемещены в новый блок Component.instrumentation
, который содержит все API, связанные с настройкой процесса инструментирования. Чтобы продолжить использовать эти функции инструментирования, используйте вместо этого соответствующие API в новом блоке, как показано в следующем фрагменте кода:
androidComponents {
onVariants(selector().all(), {
instrumentation.transformClassesWith(AsmClassVisitorFactoryImpl.class,
InstrumentationScope.Project) { params ->
params.x = "value"
}
instrumentation.setAsmFramesComputationMode(
COMPUTE_FRAMES_FOR_INSTRUMENTED_METHODS
)
})
}