新版本编译改动


背景

1.2.3版本开始,我们对TheRouter编译过程做了大量优化,同时适配了Gradle4.x-9.x全部版本,理论上更新的版本或更老的版本也能支持,只是没有去测试。



一、提升 JDK 版本

由于新版本 Android Studio 强制使用 Java 17,TheRouter 从 1.3.0 开始全部使用 JDK17 编译,你需要更新编译 JDK 版本。



二、废弃编译插件 cn.therouter.agp8

1.3.0-rc1版本开始,得益于采用Java 17编译,无需再区分agp8和agp7了,接入方式全部统一成:

id 'cn.therouter' version '1.3.x' apply false



三、编译期选项

老版本的TheRouter提供了不少编译期选项,可以通过手动在local.propertiesgradle.properties文件中配置。从1.2.3-rc1版本开始,这些配置全部迁移到了app module的 build.gradle 内。你可以使用如下方式配置编译选项:

// 必须是app module内,引入 therouter 插件的 build.gradle 文件内
// 与android{}闭包同级,做编译配置
TheRouter {
    // 是否开启调试模式,默认不开启
    debug = false;
    // 编译期检查路由表合法性,可选参数 warning(仅告警)/error(编译期抛异常)/delete(每次根据注解重新生成路由表),不配置则不校验
    checkRouteMap = "";
    // 检查 FlowTask 是否有循环引用,可选参数 warning(仅打印日志)/error(编译期抛异常),不配置则不校验
    checkFlowDepend = "";
    // 图形化输出当前的 FlowTask 依赖图,不配则不输出
    showFlowDepend = true;
    
    // 1.3.0-rc1新增,bool 值,强制开启增量编译,详情见下方描述
    forceIncremental = false;
    // 1.3.0-rc1新增,string 值,自定义增量编译缓存路径,取工程根目录的相对路径,详情见下方描述
    incrementalCachePath = "";
    // 1.3.0-rc6新增,数组字段,自定义过滤编译 class,使用方式如下
    removeClass = ["com/therouter/app/R$anim.class", "xxxxxx"];
}

v1.3.0 新增编译选项(请在理解增量实现原理的前提下使用):



四、编译缓存

1.2.3-rc1版本开始,所有编译均采用增量编译,且不再依赖Gradle的增量配置,所有增量均由框架内部实现,每次编译时会校验编译jar包与缓存数据是否一致,如果不一致才会去扫描有变更的jar包。因此,才能做到编译速度大幅提升。
缓存路径在:/app/build/therouter目录下。

1.3.0-rc1版本开始,你也可以修改缓存路径。

注:1.2.3版本编译缓存仅在debug模式才会启用,你需要在 build.gradle 中开启调试模式。1.3.0 开始全模式启用。



五、默认服务提供者

老版本的TheRouter,如果使用了一个不存在ServiceProviderService接口时,会默认创建一个接口的空实现类来避免空指针。但实际应用起来发现,并不能降低空指针的概率,反倒将原本应该在开发阶段就发现的问题延到了线上才发现。
1.2.3-rc1开始,如果没有声明@ServiceProvider的接口,调用TheRouter.get()时,将会直接返回null



六、优化 KSP 编译速度

1.2.3-rc1版本开始,使用KSP处理注解也支持增量编译了。二次编译时,不会再次遍历全部类,而是只处理变更文件。
本优化由 @hust-twj 提供,详情查看:https://github.com/HuolalaTech/hll-wp-therouter-android/pull/184

使用前,需要在gradle.properties内开启 KSP 的增量编译。

ksp.incremental=true
ksp.incremental.log=true
ksp.incremental.intermodule=true



七、KSP不再兼容AGP4

由于使用了1.9.21-1.0.16版本的KSP(已经是能支持增量编译的最低版本),必须将Kotlin版本也升级到1.9.21,因此无法再兼容AGP4的编译。
推荐你采用项目demo一致的 Gradle 版本号和 AGP 版本号。

Gradle Version:https://github.com/HuolalaTech/hll-wp-therouter-android/blob/dev/gradle/wrapper/gradle-wrapper.properties
AGP Version:https://github.com/HuolalaTech/hll-wp-therouter-android/blob/dev/build.gradle


八、AGP8 编译提速

老版本的 TheRouter 采用了 Gradle 标准 API,在插件内会将所有的 jar 和 class 聚合成一个,造成编译速度非常慢。

新版本采用了一个全新的方案,在标准 API 的基础上,最大幅度降低了编译耗时,但是首次编译或每次新增删除模块的时候,都需要重写构建一次。

详细方案请见: https://kymjs.com/code/2024/10/31/01/


相关推荐:

鸿蒙路由源码调试步骤鸿蒙路由源码调试步骤

`TheRouter` 是货拉拉基于HMRouter深度定制的开源路由框架,提供了 Android、iOS、Harmony 三端高一致性使用,在支持平台化...

3 mins
从零接入鸿蒙路由 TheRouter从零接入鸿蒙路由 TheRouter

`TheRouter` 是货拉拉基于HMRouter深度定制的开源路由框架,提供了 Android、iOS、Harmony 三端高一致性使用,在支持平台化...

4 mins
为 TheRouter 的 AGP8 编译加个速为 TheRouter 的 AGP8 编译加个速

内容请见: 《为 TheRouter 的 AGP8 编译加个速》 [https://kymjs.com/code/2024/10/31/01/](...

1 mins