ARouter

46 阅读7分钟

1、ARouter 是什么?作用是什么

答案

ARouter 是阿里开源的Android 路由框架

核心作用:

  1. 实现组件化 / 模块化跨组件页面跳转,解耦;
  2. 跨组件方法通信、服务调用
  3. 支持参数自动注入、拦截器、分组路由、依赖解耦;
  4. 不用硬依赖 Activity 类,靠路径字符串跳转。

2、为什么要用 ARouter?不用原生跳转不行吗

答案

原生跳转必须 Intent 显式指定 Activity 类,组件化时模块不能互相依赖,会耦合;

ARouter 通过字符串路径跳转,模块间无直接依赖,完全解耦,适合大型项目组件化架构。

3、ARouter 核心三大功能

答案

  1. 页面路由:跨组件 Activity、Fragment 跳转;
  2. 参数注入:自动解析 Intent 参数,@Autowired 自动赋值;
  3. 服务路由:跨组件接口服务调用,实现模块间通信。

4、ARouter 简单使用流程

答案

  1. 项目引入ARouter依赖+APT注解处理器`
  2. 全局初始化 ARouter.init()
  3. Activity / 页面上加 @Route(path = "/app/main")
  4. APT 编译自动生成路由映射表
  5. 跳转:ARouter.getInstance().build("/app/main").navigation()
  6. 支持传参、拦截器、分组全部依赖生成好的路由表

5、ARouter 底层原理(核心必背)

答案

基于 APT 编译时注解处理 + 路由表映射 + 反射。

  1. 编译期:APT 扫描所有 @Route 注解,自动生成路由映射表(路径 → Activity / 服务);
  2. 初始化:加载所生成的路由表到内存;
  3. 采用分组懒加载,用到哪个组才加载哪个路由表,优化启动速度和内存;
  4. 跳转时:根据传入路径匹配路由表,通过反射实例化目标页面,完成跳转;
  5. 拦截流程:跳转前按优先级执行全局拦截器,可做登录、权限、埋点拦截;

6、@Route、@Autowired、@Interceptor 各自作用

答案

  • @Route:标记页面 / 服务的路由路径,编译时注册到路由表;
  • @Autowired:自动注入跳转传递的参数、支持基本类型、对象、序列化对象;
  • @Interceptor:自定义拦截器,做登录拦截、权限校验、埋点、路由预处理。

7、APT 是什么?ARouter 为什么用 APT

答案

APT:编译时注解处理器,在编译阶段自动生成 Java 代码。

好处:

  1. 路由表编译时就生成,不占用运行时性能
  2. 避免运行时大量反射扫描,启动更快;
  3. 解耦、不侵入业务代码。

8、ARouter 路由分组的作用

答案

  1. 按业务模块划分路由组,方便管理;
  2. 懒加载机制:初始化不一次性加载所有路由表,只加载当前用到的分组;
  3. 减少 App 启动耗时、降低初始化内存占用。

9、ARouter 拦截器原理与使用场景

答案 拦截器可以在路由跳转前统一拦截、预处理,按优先级顺序执行。

适用场景:登录拦截、权限校验、版本更新弹窗、路由埋点、全局跳转重定向、网络状态判断。

10、ARouter 怎么实现跨组件通信(服务调用)

答案

  1. 定义公共模块的Service 接口
  2. 业务模块实现该接口,并加 @Route 注解;
  3. 通过 ARouter 获取服务接口实例:ARouter.getInstance().navigation(xxxService::class.java)
  4. 面向接口调用方法,模块间无依赖,完全解耦。

11、ARouter 参数传递支持哪些类型

答案

  • 基础类型:withInt、withString、withBoolean

  • 对象传递:

    • 序列化:withParcelable
    • JSON 字符串传递
  • 自动注入@Autowired接收

  • 全局静态变量(不推荐)

12、ARouter 初始化流程

答案

  1. App 初始化 ARouter.init(application)
  2. 加载路由表、分组表、拦截器表;
  3. 初始化路由内核、缓存映射关系;
  4. 后续跳转直接查表匹配。

13、ARouter 有什么优缺点

答案

优点:

  1. 完美支持组件化,模块解耦;
  2. APT 编译时生成路由表,性能高;
  3. 自带参数注入、拦截器、分组、服务路由;
  4. 支持 Fragment 路由、跨模块方法调用。

缺点:

路径硬编码易写错、

编译速度略微变慢、

多模块 APT 配置稍繁琐。

14、ARouter 能不能跳转 Fragment

答案

可以

kotlin

val fragment = ARouter.getInstance().build("/fragment/home").navigation() as Fragment

原理和 Activity 一致,编译注册路径,运行反射实例化 Fragment。

15、 @Autowired 自动注入原理

  1. 编译期 APT 扫描所有被@Autowired标记的字段,自动生成注入辅助类
  2. 调用inject(this)时,通过生成的代码从 Bundle/Intent 中取值,自动赋值给对应字段。
  3. 本质:编译期生成赋值代码,无反射,效率高。
  • 注意:Kotlin 必须加@JvmField去除 get/set,否则注入失败。
 ARouter.getInstance().inject(this) // 必须注入

APT 编译生成注入代码,调用inject()后自动从 Intent/Bundle 取值赋值;无反射,Kotlin >需加@JvmField才能正常注入。

16、ARouter 和原生 Intent 对比

答案

原生 Intent:耦合高、必须依赖目标类、不适合组件化;

ARouter:路径解耦、支持跨组件、自动参数注入、拦截器统一处理、适合大型项目架构。

17、ARouter 会不会有性能问题

答案

几乎没有。路由表编译时生成,运行时只是查表 + 少量反射

加上分组懒加载,初始化和跳转性能都很好,线上大型项目普遍使用。

18、ARouter 路由失败常见原因

答案

  • 忘记初始化ARouter.init()
  • 未配置 APT 注解处理器,编译没生成路由表
  • 路由路径写错、大小写不一致
  • 同一项目重复路由路径冲突
  • 目标 Activity 没在清单文件注册
  • 多模块未配置AROUTER_MODULE_NAME
  • 拦截器拦截了跳转
  • 没加 @Route 注解;

19、ARouter 核心原理

ARouter 是基于 APT 编译时注解 + 运行时路由表查找 + 反射 实现的路由框架。

  • 编译时期(APT 注解处理器)项目编译时,ARouter 的 APT 会扫描所有带有 @Route 注解的类(Activity、Fragment、服务),自动生成路由映射表,把路径字符串目标类一一对应起来。

  • 初始化时期App 启动调用 ARouter.init() 时,会加载所有编译时生成的路由表,并按分组管理,采用懒加载策略,用到哪个分组才加载哪个分组的路由。

  • 跳转时期调用 build("/xxx/xxx").navigation() 时:

    • ARouter 根据路径找到对应的分组
    • 在路由表中匹配目标类
    • 通过反射实例化目标 Activity / Fragment
    • 经过拦截器处理后,最终完成跳转
  • 拦截器原理跳转过程会经过全局拦截器,按优先级执行,可做登录校验、权限判断、埋点、重定向等。

  • 参数自动注入原理同样靠 APT 生成注入代码,跳转时自动从 Intent 解析参数,并赋值给使用 @Autowired 标记的字段。

20、拦截器优先级执行顺序

  • @Interceptor(priority = 数值)数值越小优先级越高,越先执行
  • 同步串行执行,上一个拦截器onContinue放行,才走下一个;调用onInterrupt直接终止跳转。
  • 适用场景:登录拦截、权限校验、版本更新、全局跳转监听。

21、ARouter 会不会用到反射?

极少

路由表注册、参数注入纯 APT 生成代码无反射;只有创建 Activity/Fragment 实例少量用到反射,整体性能接近原生跳转。

22、ARouter 全局降级策略

重写NavigationCallbackonLost方法,路径找不到时做兜底页面跳转、吐司提示。

23、 线程中可以使用 ARouter 跳转页面吗

可以,

页面跳转必须切回主线程,子线程调用 navigation 会报错,需手动 post 到主线程。

24、能不能跳转 Fragment、子线程能用吗

可以跳转 Fragment;子线程不能直接跳转页面,必须切回主线程调用 navigation。

25、ARouter 为什么不用动态字节码 / 只用 APT

  • APT 在编译期生成代码,稳定性高、无性能损耗、兼容性好
  • 动态字节码易被混淆、兼容性差、排查问题困难
  • 阿里 ARouter 设计思路:尽量编译期处理,减少运行时开销