之前项目中一直用的是 ARouter,但是一直很卡,特意用adb查了一下ARouter的初始化用了131ms
。最近发现货拉拉开源了一套更先进的路由框架 TheRouter,还宣传能无缝切换,趁着中秋放假就赶紧拿来试了一下,真香!!
先看一下官方介绍:TheRouter
是一个 Kotlin 编写,用于 Android 模块化开发的一整套解决方案框架。
Github 项目地址:https://github.com/HuolalaTech/hll-wp-therouter-android、
官网文档:https://therouter.cn/
运行迁移工具
- 下载
TheRouter
官方提供的迁移工具,支持 Windows 和 Mac:工具下载看官方文档 - 选择当前项目的路由框架,目前迁移工具好像只支持 ARouter 迁移到 TheRouter。
- 选择要使用的
TheRouter
版本号 - 选择项目路径,直接选根目录就可以
5.开始转换。
- 转完以后会生成改动日志,因为
ARouter
的Provider
有 init 方法,但TheRouter
是没有这个方法的,需要自己判断一下代码逻辑,我是直接在接口方法被调用的时候,先调一下init就行了。 - 日志生成以后如果没有需要手动修改的部分,就啥也不用管了。如果有的话可以选择把日志导出,放到 Sublime 里面看,比较清晰一点。
查看 git 修改记录
可以看到,TheRouter
的迁移工具还是很智能的,需要改的地方都自动改了。还可以直接把没用的ARouter
方法注释掉。大家可以自己试一试,如果写了Provider
但是里面的 init 什么代码也没有,也会直接删除。
单模块自动初始化能力
并且 TheRouter
对于模块化开发的支持非常完全,按照官方文档的描述:TheRouter
是完全面向模块化开发提供的一套解决方案。在模块化开发时,可能每个模块都有自己需要初始化的一些代码。以前的做法是把这些代码都在Application
里声明,但是这样可能随着业务变动每次都需要修改Application
所在模块。TheRouter
的单模块自动初始化能力就是为了解决这样的情况,可以只在当前模块声明初始化方法后,将会在业务场景时自动被调用。
每个加了 @FlowTask
注解的方法,都会在编译期被解析,生成一个对应的 Task 对象,这个对象包含了初始化方法的相关信息,比如:是否异步执行、任务名、是否依赖其他任务先执行。
当所有aar都编译完成,生成好全部的 Task 以后,会在主 app 中通过Gradle
插件进行聚合,在这时会将所有的 Task
做一次检查,通过构建有向无环图来防止 Task 发生循环引用的情况。
每次应用启动后,会在路由初始化时,将有向图中的全部Task
,按照依赖关系按顺序加载。
这个自动初始化能力一开始我们组很多同事都说没用,结果实际用起来发现:绝对的真香。尤其是之前在做隐私合规整改的时候,很多模块的初始化代码都要改,现在用了这套自定义自动初始化实际的框架,直接代码全部内聚回自己模块,完全不存在跨模块修改代码的情况了。
有一些小坑
迁移工具整体还算不错,但是用完发现还是有一些小坑的。
ARouter 自定义拦截器没办法迁移,用完一键迁移以后,代码编译不过了,还需要手动改一下拦截器的代码改到TheRouter对应的拦截器上才行。
总结
总之用下来的感受就是——丝滑!
直接无缝从ARouter
迁移到TheRouter
,之前老大评估还需要三天的时间,我直接半天就搞完了,测试测了一天也是说一把过。
顺带还把之前的初始化逻辑改了一下,后面开发的时候,基本上就不用再管别人开发的模块了,我自己搞完我的事就下班,拜拜~