主要观点总结
本文介绍了在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
………………………………