AGP transform 变更

AGP 8.0 重要 API 更新

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 {} 代码块中,并且 从 AGP 7.2 起即可使用


字节码转换支持

如果需要对字节码进行转换,请使用 Instrumentation API

  • Library 模块:只能对本地项目中的类进行字节码插桩
  • Application / Test 模块:可以选择仅对本地类插桩,或对包括远程依赖在内的所有类插桩

该 API 的特点是:

  • 插桩逻辑按单个 class 独立运行
  • 对 classpath 中其他类的访问能力受限(详见 createClassVisitor()
  • 有利于提升 全量构建增量构建 的性能
  • API 更简单,设计更安全

每个 library 会在其编译完成后立即并行进行插桩,而不是等待所有编译完成后再统一处理。在增量构建中,如果只修改了某一个类,那么只会重新插桩受影响的类。

示例代码


向 App 中添加生成的 Class

如果你的插件需要向 App 中额外添加生成的 class,请使用 Artifacts API,并结合
MultipleArtifact.ALL_CLASSES_DIRS

示例用法如下:

1
2
3
artifacts.use(taskProvider)
.wiredWith(...)
.toAppend(Artifact.Multiple)

通过 MultipleArtifact.ALL_CLASSES_DIRS,可以将自定义 task 生成的 class 目录追加到项目的 class 输出中。

Artifacts API 会自动为你的 task 分配一个唯一的输出目录。
示例可参考官方文档中的 addToAllClasses 示例。


基于全程序分析(Whole Program Analysis)的转换支持

如果你的转换逻辑需要基于整个程序的分析结果,可以选择在单个 task 中对所有 class 一起进行处理

⚠️ 注意事项

  • 这种方式的构建性能开销明显高于 Instrumentation API
  • 强烈建议将此能力设计为 按 BuildType 可选启用
  • 方便开发者在 Debug / 开发构建中关闭该功能

使用 Artifacts.forScope API

AGP 7.4 开始,引入了 Artifacts.forScope API,用于注册对所有 class 统一处理的 task。

可选作用范围:

  • ScopedArtifacts.Scope.PROJECT:仅当前项目
  • ScopedArtifacts.Scope.ALL:当前项目 + 引入的项目 + 所有外部依赖

示例如下(对所有 class 进行统一转换):

1
2
3
4
5
6
7
8
variant.artifacts.forScope(ScopedArtifacts.Scope.ALL)
.use(taskProvider)
.toTransform(
ScopedArtifact.CLASSES,
ModifyClassesTask::allJars,
ModifyClassesTask::allDirectories,
ModifyClassesTask::output,
)

示例参考:


其他说明

  • 如果你的使用场景未被 AndroidComponents API 覆盖,请向官方提交 issue
  • 一些常用插件已经完成迁移并兼容 AGP 8.0,例如:
    • Firebase Performance Monitoring:1.4.1 起支持 AGP 8.0
    • Hilt Gradle Plugin:2.40.1 起支持 AGP 8.0
  • AGP Upgrade Assistant 可以帮助项目升级常用插件
  • 如果你通过第三方插件间接使用了 Transform API,请联系插件作者尽快适配新的 API

总结
AGP 8.0 彻底移除了 Transform API,推荐使用 Instrumentation API 与 Artifacts API 进行字节码处理和构建扩展。这些新 API 在性能、可维护性和构建正确性方面都有显著提升。

原文