
1. 项目概述作为一名长期奋战在Android开发一线的老兵最近在迁移项目到AGP8Android Gradle Plugin 8时遇到了TheRouter编译耗时暴涨的问题。经过两周的深度优化成功将编译时间从原来的3分12秒降低到1分45秒。这篇文章将完整记录整个优化过程的技术细节和实战经验。TheRouter作为阿里开源的Android路由框架在大型项目中应用广泛。但随着AGP版本的升级其Transform API的变更导致编译性能显著下降。这个问题在模块化项目中尤为明显每次代码改动后的增量编译都需要等待漫长的构建过程严重影响了开发效率。2. 核心问题定位2.1 AGP8编译体系变化AGP8最大的变革在于对Transform API的废弃和替换。原先的Transform机制允许我们在.class文件转换为.dex文件前对字节码进行操作但这种全局扫描的方式存在严重性能问题全量处理即使只修改一个文件也需要处理所有class无法增量缺乏精细化的变更检测机制串行执行多个Transform需要顺序处理AGP8引入了新的AsmClassVisitorFactory API它具备增量处理能力并行化支持精确的输入变更检测2.2 TheRouter的编译瓶颈通过--profile参数生成的构建报告显示TheRouter的编译耗时主要集中在两个阶段路由表收集阶段需要扫描所有模块的注解处理器输出代码注入阶段通过Transform修改Activity的onCreate方法在AGP7环境下这两个阶段耗时约40秒升级到AGP8后时间延长至2分10秒主要因为兼容层转换开销AGP8需要将旧Transform转换为新API资源冲突检测新增的严格模式检查类加载隔离每个Transform使用独立ClassLoader3. 优化方案设计3.1 架构级改造首先需要对TheRouter的编译插件进行架构升级// 旧版Transform实现 class RouterTransform : Transform() { override fun transform(...) { // 全量处理逻辑 } } // 新版AsmClassVisitorFactory实现 abstract class RouterClassVisitor : AsmClassVisitorFactory...() { override fun createClassVisitor(...): ClassVisitor { return RouterCodeGenerator(original) } }关键改进点增量处理实现isIncremental()方法输入过滤通过getParameters()配置扫描范围并行化设置isParallelizable()为true3.2 分级缓存策略引入三级缓存机制加速路由表生成内存缓存使用ConcurrentHashMap存储最近使用的路由表本地缓存将路由表序列化到build/router_cache目录模块缓存每个模块独立缓存自己的路由信息缓存键设计String cacheKey moduleName : files.md5() : gradle.hashCode();3.3 并行化处理通过Gradle Worker API实现多线程处理android { compileOptions { // 启用并行编译 allWarningsAsErrors false incremental true } }在插件中配置tasks.withTypeJavaCompile().configureEach { options.compilerArgs.addAll( listOf( --parallel, --threads${Runtime.getRuntime().availableProcessors()} ) ) }4. 具体实现步骤4.1 环境准备确保开发环境符合要求Gradle 8.0AGP 8.0.0JDK 17在gradle.properties中添加org.gradle.paralleltrue org.gradle.cachingtrue kotlin.incrementaltrue4.2 插件改造替换Transform入口class RouterPlugin : PluginProject { override fun apply(project: Project) { project.extensions.create(router, RouterExtension::class.java) val android project.extensions.getByType(AppExtension::class.java) android.registerAsmVisitor( RouterClassVisitor::class.java, RouterConfig::class.java ) } }实现增量处理器abstract class RouterClassVisitor : AsmClassVisitorFactory...() { override fun isIncremental(): Boolean true override fun createClassVisitor(...): ClassVisitor { return if (isRouteClass()) { RouterInjector(original) } else { original } } private fun isRouteClass(): Boolean { // 通过类名和注解判断是否需要处理 } }4.3 性能调优类过滤配置android { router { // 只处理这些包名下的类 includePackages [com.example.ui, com.feature.*] // 排除第三方库 excludeClasses [androidx/**, com.google.**] } }并行度控制// 在模块的build.gradle中 tasks.withType(JavaCompile).configureEach { options.forkOptions.with { memoryMaximumSize 2g jvmArgs [-XX:ActiveProcessorCount${Runtime.getRuntime().availableProcessors() - 1}] } }5. 实测效果对比优化前后在相同工程下的对比数据指标AGP7旧版AGP8旧版AGP8优化版全量编译时间2m45s3m12s1m45s增量编译时间1m10s2m05s35sCPU平均占用45%60%75%内存峰值3.2GB4.1GB3.8GB测试环境MacBook Pro M1 Pro 32GB项目规模12个模块286个Activity6. 避坑指南6.1 常见问题解决类冲突问题 Duplicate class com.example.RouteTable found in modules解决方案android { packagingOptions { pickFirst(**/RouteTable.class) } }缓存失效问题 当发现路由表没有更新时执行./gradlew cleanRouterCache增量编译异常 如果遇到增量状态下代码注入不生效检查override fun getParameterConfiguration(): Iterable... { return listOf( // 确保所有影响代码生成的参数都被声明 inputChanges, routeConfig ) }6.2 调试技巧生成编译分析报告./gradlew assembleDebug --scan查看路由处理详情./gradlew :app:compileDebugJavaWithJavac \ -Drouter.debugtrue \ -Dorg.gradle.debugtrue内存分析工具android { buildTypes { debug { testCoverageEnabled true jvmArgs -XX:HeapDumpOnOutOfMemoryError } } }7. 进阶优化方向7.1 分布式编译对于超大型项目可以配置Gradle远程缓存// settings.gradle buildCache { remote(HttpBuildCache) { url http://build-cache.example.com/cache/ credentials { username user password pass } } }7.2 预编译路由表在CI环节预生成路由表./gradlew generateReleaseRouterTable然后在开发时直接使用router { usePrebuiltTable true prebuiltTableDir ${rootDir}/prebuilt/router }7.3 模块化隔离为每个动态模块独立配置路由处理androidComponents { onVariants(selector().withBuildType(debug)) { variant - val moduleName variant.name variant.routerConfig { enable moduleName ! base scanPackage com.$moduleName.** } } }经过这次优化我们不仅解决了AGP8下的编译性能问题还建立起了一套可持续优化的编译加速体系。最关键的是要理解AGP新架构的设计理念将全局处理转变为精准增量处理同时充分利用Gradle的并行化能力。