Обновления API плагина Android Gradle

На этой странице отслеживается прекращение поддержки и удаление API плагина Android Gradle (AGP), а также информация о том, как соответствующим образом обновить код.

Трекер устаревания и удаления API

В следующей таблице приведены случаи, когда API-интерфейсы AGP устарели и удалены, с точки зрения версии AGP.

API Устарело в версии AGP. Удален из версии AGP.
Component.setAsmFramesComputationMode 7.2
Component.transformClassesWith 7.2
Рендерскрипт 7.2
Трансформировать 7.2 8.0

АГП 8.0

Ниже приведены важные обновления API для AGP 8.0.

API трансформации удален.

Начиная с AGP 8.0, Transform API удален. Это означает, что все классы в пакете com.android.build.api.transform будут удалены.

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

Замена API

Не существует единой замены Transform API — для каждого варианта использования существуют новые целевые API. Все заменяющие API находятся в блоке androidComponents {} . Все эти API доступны в AGP 7.2.

Поддержка преобразования байт-кода

Чтобы преобразовать байт-код, используйте Instrumentation API. Для библиотек вы можете зарегистрировать инструментарий только для локальных классов проекта; для приложений и тестов вы можете зарегистрировать инструментарий только для локальных классов или для всех классов, включая локальные и удаленные зависимости. Чтобы использовать этот API, инструментарий запускается независимо для каждого класса с ограниченным доступом к другим классам в пути к классам (дополнительную информацию см. в createClassVisitor() ). Это ограничение повышает производительность как полных, так и добавочных сборок, а также упрощает интерфейс API. Каждая библиотека инструментируется параллельно, как только она будет готова, а не после завершения компиляции. Кроме того, изменение в одном классе означает, что в инкрементной сборке необходимо переинструментировать только затронутые классы. Пример использования API инструмента см. в рецепте «Преобразование классов с помощью ASM AGP».

Поддержка добавления сгенерированных классов в ваше приложение.

Чтобы добавить в приложение дополнительные сгенерированные классы, используйте API Artifacts с MultipleArtifact.ALL_CLASSES_DIRS . В частности, используйте

artifacts.use(TaskProvider)
  .wiredWith(...)
  .toAppend(Artifact.Multiple)

с MultipleArtifact.ALL_CLASSES_DIRS для добавления дополнительных сгенерированных каталогов к классам проекта. API Artifacts автоматически выберет уникальное местоположение для вашей пользовательской задачи для вывода. См. рецепт addToAllClasses для примера использования этого API.

Поддержка преобразований на основе анализа всей программы

Чтобы реализовать преобразования на основе анализа всей программы, все классы можно преобразовать вместе в рамках одной задачи. Этот подход следует использовать с осторожностью, поскольку он требует гораздо более высоких затрат производительности сборки, чем использование 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,
    )

См. рецепт ModifyProjectClasses для примера использования этого API и рецепт CustomAgpDsl для примера регистрации пользовательских расширений для типов сборки Android.

Если ваш вариант использования не распространяется ни на один из API-интерфейсов AndroidComponents , сообщите об ошибке .

Несколько часто используемых плагинов уже перешли на использование этих новых API, в том числе плагин мониторинга производительности Firebase (1.4.1 совместим с AGP 8.0) и плагин Hilt Gradle (2.40.1 совместим с AGP 8.0). Помощник по обновлению AGP также поможет разработчикам проектов обновлять часто используемые плагины по мере необходимости.

Если вы используете Transform API через сторонний плагин, сообщите автору, что его плагин необходимо обновить для работы с новыми 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
          )
      })
  }