На этой странице отслеживается прекращение поддержки и удаление API плагина Android Gradle (AGP), а также предоставляется информация о том, как соответствующим образом обновить код.
Отслеживание прекращения поддержки и удаления API
В таблице ниже указано, в каких версиях AGP прекращается поддержка и удаляются API AGP.
| API | Поддержка прекращена в версии AGP | Удалено из версии AGP |
|---|---|---|
Component.setAsmFramesComputationMode |
7.2 | |
Component.transformClassesWith |
7.2 | |
| RenderScript | 7.2 | |
| Преобразование | 7.2 | 8.0 |
AGP 8.12
В плагине Android Gradle 8.12.0 внесены следующие заметные изменения API.
Изменение поведения: параметр includeAndroidResources объединяет манифест из тестового каталога
Теперь вы можете создать файл AndroidManifest.xml в каталоге с исходными файлами для тестирования, чтобы настроить манифест для модульного тестирования с помощью параметра android.testOptions.unitTests.includeAndroidResources. Файл манифеста теста будет объединен с основным манифестом приложения. Проблема 127986458
AGP 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
}
}
Это критическое изменение на уровне исходного кода, которое не повлияет на двоичные плагины.
AGP 8.8
Ниже перечислены важные обновления API для AGP 8.8.
Конфигурации ресурсов больше не поддерживаются
Конфигурации ресурсов не поддерживаются начиная с AGP 8.8. Это связано с тем, что AGP больше не поддерживает разную плотность ресурсов, а в Google Play Console теперь требуется публиковать приложения в виде наборов App Bundle. Чтобы настроить языки, укажите региональные настройки, которые поддерживает ваше приложение, с помощью DSL localeFilters. Это позволит сопоставить конфигурации региональных настроек с соответствующими ресурсами.
AGP 8.0
Ниже перечислены важные обновления API для AGP 8.0.
Transform API удален
Начиная с AGP 8.0, Transform API удален. Это означает, что все классы в пакете 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.
Поддержка преобразования байт-кода
Для преобразования байт-кода используйте Instrumentation API. Для библиотек можно зарегистрировать инструментирование только для локальных классов проекта. Для приложений и тестов можно зарегистрировать инструментирование только для локальных классов или для всех классов, включая локальные и удаленные зависимости. Чтобы использовать этот API, инструментарий запускается независимо для каждого класса с ограниченным доступом к другим классам в пути к классам (подробнее см. в createClassVisitor()).
Это ограничение повышает производительность как полной, так и инкрементной сборки, а также упрощает работу с API. Каждая библиотека инструментируется параллельно, как только она будет готова, а не после завершения всей компиляции. Кроме того, изменение в одном классе означает, что при инкрементной сборке необходимо повторно инструментировать только затронутые классы. Пример использования Instrumentation API можно найти в рецепте AGP Преобразование классов с помощью ASM.
Поддержка добавления сгенерированных классов в приложение.
Чтобы добавить в приложение дополнительные сгенерированные классы, используйте API Artifacts с MultipleArtifact.ALL_CLASSES_DIRS. В частности, используйте
artifacts.use(TaskProvider)
.wiredWith(...)
.toAppend(Artifact.Multiple)
с помощью MultipleArtifact.ALL_CLASSES_DIRS, чтобы добавить дополнительные сгенерированные каталоги в классы проекта. Artifacts API автоматически выберет уникальное местоположение для вывода пользовательской задачи. Пример использования этого API можно найти в рецепте addToAllClasses.
Поддержка преобразований на основе анализа всей программы.
Чтобы реализовать преобразования на основе анализа всей программы, все классы можно преобразовать вместе в рамках одной задачи. Этот подход следует использовать с осторожностью, поскольку он требует гораздо более высокой производительности сборки, чем использование Instrumentation API. Если ваш плагин использует этот 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,
)
Пример использования этого API можно найти в рецепте modifyProjectClasses, а пример регистрации пользовательских расширений для типов сборки Android – в рецепте customizeAgpDsl.
Если ваш сценарий использования не поддерживается ни одним из API AndroidComponents, сообщите об ошибке.
Некоторые часто используемые плагины уже перешли на новые API, в том числе плагин Firebase Performance Monitoring (версия 1.4.1 совместима с AGP 8.0) и плагин Hilt Gradle (версия 2.40.1 совместима с AGP 8.0). Помощник по обновлению AGP также поможет разработчикам проектов обновить часто используемые плагины.
Если вы используете Transform API через сторонний плагин, сообщите его автору, что плагин нужно обновить для работы с новыми API в AGP 8.0.
AGP 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
)
})
}