文章

路由框架设计

路由框架设计

路由框架的抉择

自己实现一个路由框架?

1、路由是什么?为什么需要路由框架?

什么是路由?

路由的本质是将一个 String 映射到某一个具体的页面;路由框架就是实现这样一个目的的一个框架

为什么需要路由框架?

  1. 原生路由的限制:功能单一,扩展灵活性差,不易协同

startActivity、startService 等

  • 显示 依赖具体类,需要依赖源码或 aar,耦合性高,安全性低
  • 隐式 配置复杂;维护成本高;
  1. 只有路由到 Activity,Fragment,自定义的类不支持
  2. 路由过程在 main 线程,不支持拦截

2、路由框架需要支持的功能

基本能力

  1. **路由表生成和注册 **需要扩展性好,无需入侵原有代码逻辑
    1. 路由的生成(路由扫描,一般通过注解 apt 来实现)
    2. 自动注册能力(启动时扫描 dex,但一般用 ASM 插桩来实现自动注册),
    3. target 页面字符串支持正则(可选
    4. 多个字符串映射到同一个 target 页面
  2. 基础路由跳转能力(WMRouter 叫 URI 分发):能跳转到 target 页面
  3. 服务类组件的支持(WMRouter 叫 ServiceLoader):如去某个服务组件获取一些配置等,像获取登录组件中的的登录状态

扩展能力

  1. 外部路由分发器

外部三方应用、H5 页面,可直接通过路由 url 打开我们的 App,并跳转到指定的目标页面;一般通过一个 RouteProxyActivity 来实现,配置好 intent-filter,它的作用就是一个外部路由的分发器

  1. 路由拦截能力:比如登录、统一鉴权
  2. 可定制的降级能力:找不到组件时的兜底,比如回到首页
  3. IOC 功能:目标页面参数自动注入
  4. 动态更新路由能力

通常安装包里会包含一份初始的配置文件,但是当应用发布之后,某个页面出现严重 bug,或者我们想改变某个入口点击后的跳转目标页面,这时可以通过动态更新路由配置文件来实现。 新的配置文件里,只需要把原本配置里的 aclass、iclass 替换成新的目标页面类名即可,而不用重新发布 app 版本。

  1. 多进程支持
  2. 安全性
    1. 路由白名单:没有路由白名单的话,外部可以跳转到任意指定页面,这是很危险的操作,如果 App 有钱包的话,外部可以随意跳转到你的钱包页面去。所以我们对外部应用的路由跳转时,要设置白名单,只有白名单中的路由 url 才可以跳转到目标页面,否则只能进入到首页
  3. [可选] 组件间初始化

3、如何设计一个路由框架

3.1 路由收集

通过编译时的注解,@Route,通过 kapt 在编译器生成路由表信息,

3.2 路由初始化

  • 可以在运行时扫描 dex 装载路由
  • 一般可用 Transform+ASM 在编译器初始化路由信息,可提升启动速度

3.3 页面路由

  1. 路由信息的收集,完善
  2. 路由异步:路由的过程在线程池中
  3. 路由拦截器
  4. 路由降级服务

4、三方路由框架选择

TheRouter 介绍 https://www.kymjs.com/code/2022/09/05/01/

  • BRouter
  • ActivityRouter
本文由作者按照 CC BY 4.0 进行授权