专栏名称: 鸿洋
你好,欢迎关注鸿洋的公众号,每天为您推送高质量文章,让你每天都能涨知识。点击历史消息,查看所有已推送的文章,喜欢可以置顶本公众号。此外,本公众号支持投稿,如果你有原创的文章,希望通过本公众号发布,欢迎投稿。
目录
相关文章推荐
鸿洋  ·  Android ... ·  4 天前  
今天看啥  ›  专栏  ›  鸿洋

为 TheRouter 的 AGP8 编译加个速

鸿洋  · 公众号  · android  · 2024-11-26 08:35

主要观点总结

本文介绍了在Android开发中,随着AGP8的变更,TheRouter插件在编译过程中的调整与优化。文章详细描述了遇到的问题,包括编译速度慢、无法增量编译等,并给出了多种解决思路,包括使用AsmClassVisitorFactory和toTransform(),以及最后的优化方案。

关键观点总结

关键观点1: AGP8的变更导致很多class操作类的插件代码需要修改。

TheRouter在开发时支持AGP8,使用了Gradle提供的标准API。但新版本的API带来了编译速度变慢和无法增量编译的问题。

关键观点2: toTransform()方法的使用导致了编译速度慢。

使用toTransform()方法需要将所有的jar和class聚合到一个jar内,导致无法增量编译,使得编译速度变慢。

关键观点3: AsmClassVisitorFactory可以解决部分问题但带来了新的挑战。

AsmClassVisitorFactory可以对指定类做字节码操作,但需要在所有类遍历完才能确定需要处理的类,存在同步问题。

关键观点4: 存在两种解决思路。

一是在编译期将所有需要处理的类写入文件,然后在Transform时读取;二是结合AsmClassVisitorFactory和toTransform(),并加入内存缓存机制来确保产物的一致性。

关键观点5: 最后的优化方案结合了增量编译和产物保障。

通过内存缓存机制,比较本次编译使用的类记录和上次构建结果,不同则抛出异常提醒用户重新构建。


文章预览

本文作者: 张涛 ,原文发布于: 群英传 。 1 背景 AGP8 的变更应该很多人都知道了,移除了Transform API,所以很多 class 操作类的插件代码都需要改了。 TheRouter在开发的时候就支持了AGP8,使用的也是Gradle提供的标准 API。 详细可见官方示例仓库: https://github.com/android/gradle-recipes/blob/agp-8.7/transformAllClasses/build-logic/plugins/src/main/kotlin/CustomPlugin.kt project.plugins.withType(AppPlugin:: class . java )  {      // Queries for the extension set by the Android Application plugin.      // This is the second of two entry points into the Android Gradle plugin      val  androidComponents =         project.extensions.getByType(ApplicationAndroidComponentsExtension:: class . java )      // Registers a callback to be called, when a new variant is configured     androidComponents.onVariants { variant ->          val  taskProv ………………………………

原文地址:访问原文地址
快照地址: 访问文章快照
总结与预览地址:访问总结与预览