1、ARouter 是什么?作用是什么
答案
ARouter 是阿里开源的Android 路由框架。
核心作用:
- 实现组件化 / 模块化跨组件页面跳转,解耦;
- 跨组件方法通信、服务调用;
- 支持参数自动注入、拦截器、分组路由、依赖解耦;
- 不用硬依赖 Activity 类,靠路径字符串跳转。
2、为什么要用 ARouter?不用原生跳转不行吗
答案
原生跳转必须 Intent 显式指定 Activity 类,组件化时模块不能互相依赖,会耦合;
ARouter 通过字符串路径跳转,模块间无直接依赖,完全解耦,适合大型项目组件化架构。
3、ARouter 核心三大功能
答案
- 页面路由:跨组件 Activity、Fragment 跳转;
- 参数注入:自动解析 Intent 参数,
@Autowired自动赋值; - 服务路由:跨组件接口服务调用,实现模块间通信。
4、ARouter 简单使用流程
答案
- 项目引入ARouter依赖+APT注解处理器`
- 全局初始化
ARouter.init() - Activity / 页面上加
@Route(path = "/app/main") - APT 编译自动生成路由映射表
- 跳转:
ARouter.getInstance().build("/app/main").navigation() - 支持传参、拦截器、分组全部依赖生成好的路由表
5、ARouter 底层原理(核心必背)
答案
基于 APT 编译时注解处理 + 路由表映射 + 反射。
- 编译期:APT 扫描所有
@Route注解,自动生成路由映射表(路径 → Activity / 服务); - 初始化:加载所生成的路由表到内存;
- 采用分组懒加载,用到哪个组才加载哪个路由表,优化启动速度和内存;
- 跳转时:根据传入路径匹配路由表,通过反射实例化目标页面,完成跳转;
- 拦截流程:跳转前按优先级执行全局拦截器,可做登录、权限、埋点拦截;
6、@Route、@Autowired、@Interceptor 各自作用
答案
@Route:标记页面 / 服务的路由路径,编译时注册到路由表;@Autowired:自动注入跳转传递的参数、支持基本类型、对象、序列化对象;@Interceptor:自定义拦截器,做登录拦截、权限校验、埋点、路由预处理。
7、APT 是什么?ARouter 为什么用 APT
答案
APT:编译时注解处理器,在编译阶段自动生成 Java 代码。
好处:
- 路由表编译时就生成,不占用运行时性能;
- 避免运行时大量反射扫描,启动更快;
- 解耦、不侵入业务代码。
8、ARouter 路由分组的作用
答案
- 按业务模块划分路由组,方便管理;
- 懒加载机制:初始化不一次性加载所有路由表,只加载当前用到的分组;
- 减少 App 启动耗时、降低初始化内存占用。
9、ARouter 拦截器原理与使用场景
答案 拦截器可以在路由跳转前统一拦截、预处理,按优先级顺序执行。
适用场景:登录拦截、权限校验、版本更新弹窗、路由埋点、全局跳转重定向、网络状态判断。
10、ARouter 怎么实现跨组件通信(服务调用)
答案
- 定义公共模块的Service 接口;
- 业务模块实现该接口,并加
@Route注解; - 通过 ARouter 获取服务接口实例:
ARouter.getInstance().navigation(xxxService::class.java); - 面向接口调用方法,模块间无依赖,完全解耦。
11、ARouter 参数传递支持哪些类型
答案
-
基础类型:
withInt、withString、withBoolean -
对象传递:
- 序列化:
withParcelable - JSON 字符串传递
- 序列化:
-
自动注入
@Autowired接收 -
全局静态变量(不推荐)
12、ARouter 初始化流程
答案
- App 初始化
ARouter.init(application); - 加载路由表、分组表、拦截器表;
- 初始化路由内核、缓存映射关系;
- 后续跳转直接查表匹配。
13、ARouter 有什么优缺点
答案
优点:
- 完美支持组件化,模块解耦;
- APT 编译时生成路由表,性能高;
- 自带参数注入、拦截器、分组、服务路由;
- 支持 Fragment 路由、跨模块方法调用。
缺点:
路径硬编码易写错、
编译速度略微变慢、
多模块 APT 配置稍繁琐。
14、ARouter 能不能跳转 Fragment
答案
可以
kotlin
val fragment = ARouter.getInstance().build("/fragment/home").navigation() as Fragment
原理和 Activity 一致,编译注册路径,运行反射实例化 Fragment。
15、 @Autowired 自动注入原理
- 编译期 APT 扫描所有被
@Autowired标记的字段,自动生成注入辅助类。 - 调用
inject(this)时,通过生成的代码从 Bundle/Intent 中取值,自动赋值给对应字段。 - 本质:编译期生成赋值代码,无反射,效率高。
- 注意: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 全局降级策略
重写NavigationCallback里onLost方法,路径找不到时做兜底页面跳转、吐司提示。
23、 线程中可以使用 ARouter 跳转页面吗
可以,
但页面跳转必须切回主线程,子线程调用 navigation 会报错,需手动 post 到主线程。
24、能不能跳转 Fragment、子线程能用吗
可以跳转 Fragment;子线程不能直接跳转页面,必须切回主线程调用 navigation。
25、ARouter 为什么不用动态字节码 / 只用 APT
- APT 在编译期生成代码,稳定性高、无性能损耗、兼容性好
- 动态字节码易被混淆、兼容性差、排查问题困难
- 阿里 ARouter 设计思路:尽量编译期处理,减少运行时开销