ARouter源码阅读笔记

65 阅读2分钟

一、首先注解处理器

注解处理器的基类BaseProcessor

init方法

主要是初始化一些工具,比较重要的是使用

ProcessingEnvironment.getOptions().getKey(MOUDLE_NAME)

来获取当前module的名称,比如module1、module2等,通过map来进行存储,这个map中存储的就是module1、module2对应的值。对应的就是不同模块下的路由集合。避免不同模块使用到了相同的路由。所以在多模块的工程中,还是很有必要的。 MOUDLE_NAME:需要在module下的build.gradle中进行配置

javaCompileOptions {
    annotationProcessorOptions {
        arguments = [ AROUTER_MODULE_NAME : project.getName() ]
    }
}

Element:操作元素最主要的类

Filer:Filer接口支持通过注解处理器创建新文件。可以创建三种文件类型:源文件、类文件和辅助资源文件

Messager:Messager接口提供注解处理器用来报告错误消息、警告和其他通知的方式

Options:通过getOptions()方法获取选项参数,在gradle文件中配置选项参数值

RouteProcessor:RouterAnnotation的注解处理器

init方法:创建了一个文件名称“arouter-map-of-modulejava.json”以及一些初始化工具

process方法:处理所有带有@Router注解的class文件以及@Autowired注解的变量,生成对应的文件

1、创建两个map,分别是

Map<String, Class<? extends IRouteGroup>>

image.png ——将所有的group与生成的class对应起来

Map<String, RouteMeta>

image.png ——用于存储每个path下面的所有deeplink

IRouteGroup接口解释:生成的所有routerClass文件都继承自这个接口,有一个loadInto()方法

RouteMeta类解释:生成的所有routerClass文件中记录下所有使用router注解的类,每一个对应的类有自己的RouteMeta数据,内容包括:类型:activity还是fragment,路径,group,需要的参数,优先级,其他等。

2、遍历所有带有Router注解的元素

1)如果当前元素类型是activity或者fragment的时候,创建对应的RouteMeta()

——RouteMeta中的必要参数需要找到通过此类中带有@Autowired注解的变量,放入一个Map<String, Integer>中

——如果此类还有父类,父类也需要遍历,然后再进行添加进map中

解惑:为何这个map的value是Integer? 答:因为是对应的是变量的枚举状态

2)Provider以及service不需要param,也是创建对应的RouteMeta(),只是类型不一样

3)验证下每个创建出来的RouteMeta数据,处理path以及group有问题的情况,没有问题加进对应module的groupMap中。groupMap类型是:Map<String, Set>。String是每个RouteMeta集合对应的group

3、创建对应的生成类

1)遍历groupMap,创建loadInto方法

2)遍历groupMap中的RouteMeta元素

——根据type判断是否是provider,provider单独处理,先直接获取provider父类接口,遍历接口,如果是直接子类,先找到父类,将父类以及子类都通过addStatement加进文件里。

——对于非provider,先遍历所有带Autowired注解的必要参数,然后再增加addStatement语句,创建对应的文件