💡
原文中文,约5900字,阅读约需14分钟。
📝
内容提要
AGP8 移除了 Transform API,导致许多插件代码需修改。新方法 toTransform() 聚合所有类,影响编译速度。为提高效率,TheRouter 采用 AsmClassVisitorFactory 进行按需插桩,并使用 toGet() 方法避免聚合,从而提升编译速度,并通过内存缓存确保构建结果的可靠性。
🎯
关键要点
- AGP8 移除了 Transform API,导致许多插件代码需修改。
- TheRouter 支持 AGP8,使用 Gradle 提供的标准 API。
- toTransform() 方法聚合所有类,导致编译速度变慢,尤其在代码量大时。
- 新方法的输出类型为 RegularFileProperty,只能返回一个文件,无法使用增量编译。
- 老版本的 Transform API 允许直接复制不需要操作的类,效率更高。
- 解决思路1:使用 AsmClassVisitorFactory 进行按需插桩,减少编译时间。
- 解决思路2:利用 KSP/KAPT 生成的类记录文件,但在独立模块中可能会丢失。
- TheRouter 目前的方案结合了 AsmClassVisitorFactory 和 toTransform() 的优缺点。
- toGet() 方法可以在构建结尾执行而不需要聚合所有类,适合当前场景。
- 增加内存缓存以确保构建结果的可靠性,避免不一致性问题。
❓
延伸问答
AGP8 移除了 Transform API 会有什么影响?
AGP8 移除 Transform API 导致许多插件代码需要修改,编译速度变慢,尤其在代码量大时。
TheRouter 如何提高编译速度?
TheRouter 通过使用 AsmClassVisitorFactory 进行按需插桩,并使用 toGet() 方法避免聚合,从而提高编译速度。
toTransform() 方法的主要问题是什么?
toTransform() 方法聚合所有类,导致编译速度慢,并且无法使用增量编译。
如何解决 toTransform() 方法导致的编译速度慢的问题?
可以使用 AsmClassVisitorFactory 进行按需插桩,避免将所有类聚合成一个 jar,从而减少编译时间。
TheRouter 目前的方案是怎样的?
TheRouter 结合了 AsmClassVisitorFactory 和 toTransform() 的优缺点,使用内存缓存确保构建结果的可靠性。
toGet() 方法有什么优势?
toGet() 方法在构建结尾执行,不需要聚合所有类,适合当前场景,能够提高编译效率。
➡️