ARouter 原理后续

接上一篇 ARouter 简单使用及原理 在分析 LogisticCenter 的 init() 方法时,对于 routerMap 数据的生成当时还不是很明了,结合调试的结果,我推测是 @Route 注解自动生成了一些代码(之前没接触过,不了解这块东西,但是听人讲起过可以动态生成代码)。

求证过程

我先从依赖包的代码入手,在 Android Studio 里全部找完也没有找到相关代码。接着我又从 gradle 配置文件入手,想着既然自动生成,应该在编译或者运行的时候就已经生成代码了,可能和配置项会有点关系。

annotationProcessorOptions

抓住关键信息,通过搜索我找到了一些资料,让我对推测有了一个清晰的概念 APT,这个其实在项目配置依赖项的时候经常用到,但之前也没去了解过,现在算是前后贯通了。以下是我搜到的一些资料,用于理解概念,
Gradle之apt, annotationProcessor和kapt
编译时注解处理方
gradle之apt与annotationProcessor与kapt

建立了概念之后,我大概知道 ARouter 的依赖配置为什么要分 -api 和 -compiler 了。

这么一来可以明确在编译期会根据注解 @Route 生成相关类文件,接下去的任务依然是找生成类的代码逻辑,其实就是注解处理器逻辑。

真像浮出

本地能找的都找完了,下一步去 github 上看看,好在是开源,不然啥都看不到。上去就直接锁定 arouter-compiler 文件夹,往里走能看到 processor 文件夹,里面就三个文件,BaseProcessor 继承自 AbstractProcessor,其他两个又继承自 BaseProcessor,emmm~ 应该就是这里了,我又搜了 AbstractProcessor,找到了这篇,讲解了 AbstractProcessor 的使用,在Android中使用注解生成Java代码 AbstractProcessor,看完知道了核心方法是 process(),借助着解释,大致看了一遍 RouteProcessor,我知道我终于找到了,通过这个类,会对 Route 注解进行分析处理并生成代码文件,写到本地。

所以在经过编译阶段之后,根据注解生成的代码就已经准备好了,接着初始化执行到 LogisticCenter.init() 的时候,加载的类名集合里就包含了跟项目相关的路由 group 的类了。

你可能感兴趣的:(ARouter 原理后续)