路由框架设计
路由框架设计
路由框架的抉择
自己实现一个路由框架?
1、路由是什么?为什么需要路由框架?
什么是路由?
路由的本质是将一个 String 映射到某一个具体的页面;路由框架就是实现这样一个目的的一个框架
为什么需要路由框架?
- 原生路由的限制:功能单一,扩展灵活性差,不易协同
startActivity、startService 等
- 显示 依赖具体类,需要依赖源码或 aar,耦合性高,安全性低
- 隐式 配置复杂;维护成本高;
- 只有路由到 Activity,Fragment,自定义的类不支持
- 路由过程在 main 线程,不支持拦截
2、路由框架需要支持的功能
基本能力
- **路由表生成和注册 **需要扩展性好,无需入侵原有代码逻辑
- 路由的生成(路由扫描,一般通过注解 apt 来实现)
- 自动注册能力(启动时扫描 dex,但一般用 ASM 插桩来实现自动注册),
- target 页面字符串支持正则(可选)
- 多个字符串映射到同一个 target 页面
- 基础路由跳转能力(WMRouter 叫 URI 分发):能跳转到 target 页面
- 服务类组件的支持(WMRouter 叫 ServiceLoader):如去某个服务组件获取一些配置等,像获取登录组件中的的登录状态
扩展能力
- 外部路由分发器
外部三方应用、H5 页面,可直接通过路由 url 打开我们的 App,并跳转到指定的目标页面;一般通过一个 RouteProxyActivity 来实现,配置好 intent-filter,它的作用就是一个外部路由的分发器
- 路由拦截能力:比如登录、统一鉴权
- 可定制的降级能力:找不到组件时的兜底,比如回到首页
- IOC 功能:目标页面参数自动注入
- 动态更新路由能力
通常安装包里会包含一份初始的配置文件,但是当应用发布之后,某个页面出现严重 bug,或者我们想改变某个入口点击后的跳转目标页面,这时可以通过动态更新路由配置文件来实现。 新的配置文件里,只需要把原本配置里的 aclass、iclass 替换成新的目标页面类名即可,而不用重新发布 app 版本。
- 多进程支持
- 安全性
- 路由白名单:没有路由白名单的话,外部可以跳转到任意指定页面,这是很危险的操作,如果 App 有钱包的话,外部可以随意跳转到你的钱包页面去。所以我们对外部应用的路由跳转时,要设置白名单,只有白名单中的路由 url 才可以跳转到目标页面,否则只能进入到首页
- [可选] 组件间初始化
3、如何设计一个路由框架
3.1 路由收集
通过编译时的注解,@Route
,通过 kapt 在编译器生成路由表信息,
3.2 路由初始化
- 可以在运行时扫描 dex 装载路由
- 一般可用 Transform+ASM 在编译器初始化路由信息,可提升启动速度
3.3 页面路由
- 路由信息的收集,完善
- 路由异步:路由的过程在线程池中
- 路由拦截器
- 路由降级服务
4、三方路由框架选择
TheRouter 介绍 https://www.kymjs.com/code/2022/09/05/01/
- BRouter
- ActivityRouter
本文由作者按照 CC BY 4.0 进行授权