arouter-compiler version : 1.2.2
前言
之前对 arouter-api 做了整个流程的分析,今天来看看 arouter-compiler 。
arouter-compiler 主要是利用 apt 在编译期自动生成代码的。之前我们看到的 ARouter$$Root$$app
、 ARouter$$Group$$test
和 Test1Activity$$ARouter$$Autowired
等都是 arouter-compiler 生成的。
那接下来就分析分析 arouter-compiler 是怎么生成这些源码的。
arouter-compiler
arouter-compiler 中 processor 有三种:
- AutowiredProcessor : 用来生成像
Test1Activity$$ARouter$$Autowired
这种类型; - InterceptorProcessor : 用来生成像
ARouter$$Interceptors$$app
这种类型; - RouteProcessor : 用来生成像
ARouter$$Root$$app
,ARouter$$Providers$$app
和ARouter$$Group$$test
这种类型;
RouteProcessor
在这里我们就只分析 RouteProcessor 了。
RouteProcessor 相比其他两个 Processor 来说,代码更长,逻辑更加复杂。并且 RouteProcessor 主要处理的是路由映射这一块。其他两个 RouteProcessor 也是大同小异,有兴趣的同学可以自行阅读源码。
先来看看 RouteProcessor 的定义:
1 | @AutoService(Processor.class) |
RouteProcessor 类上面的注解很多,我们一个一个来看:
- @AutoService 会自动在 META-INF 文件夹下生成 Processor 配置信息文件,避免手动配置的麻烦;
- @SupportedOptions 指定 Processor 支持的选项参数名称,KEY_MODULE_NAME 就是 AROUTER_MODULE_NAME ,KEY_GENERATE_DOC_NAME 就是 AROUTER_GENERATE_DOC;没错,这两个就是我们一开始在 build.gradle 中配置的。
- @SupportedSourceVersion 指定 Processor 支持的 JDK 的版本;
- @SupportedAnnotationTypes 指定 Processor 处理的注解;
接着,趁热打铁。来瞧瞧 RouteProcessor 的 init 方法。
1 | @Override |
在 init 方法中,主要获取了 KEY_MODULE_NAME 和 KEY_GENERATE_DOC_NAME 这两个编译选项参数。然后判断一下是否需要生成路由文档。
在 init 方法中获取参数后,接着就是 process 方法。
process 方法就好像是 main 方法一样,在这里面都是 processer 处理注解自动生成代码的逻辑。
1 | @Override |
在 process 中调用了 parseRoutes ,parseRoutes 方法实在是太长了,在这里我们进行分段讲解吧。
1 | private void parseRoutes(Set<? extends Element> routeElements) throws IOException { |
parseRoutes 方法一开始,做足了准备。下面就到了放大招的时候了。
1 | // Follow a sequence, find out metas of group first, generate java file, then statistics them as root. |
上面这段代码主要将每个 routeElement 进行了分类,将 @Route 修饰的类信息封装进 RouteMeta 中。再把 RouteMeta 按照组名分好组存进 groupMap 中。
1 | // 构造 ARouter$$Providers$$xxx 的 loadInto 方法 |
上面的代码最终会生成 ARouter$$Providers$$xxx 的 loadInto 方法,比如像这样:
providers.put("com.alibaba.android.arouter.demo.testservice.HelloService", RouteMeta.build(RouteType.PROVIDER, HelloServiceImpl.class, "/yourservicegroupname/hello", "yourservicegroupname", null, -1, -2147483648));
那我们接着看。
1 | // 构造 RouteMeta 的 paramType 参数 |
上面代码主要做的事情就是遍历 groupmap 集合给 ARouter$$Group$$xxx 类中的 loadInto 添加方法体,并生成 java 文件。
1 | if (MapUtils.isNotEmpty(rootMap)) { |
以上,就是整个 RouteProcessor 的流程。看完 RouteProcessor 之后,相信你对 ARouter 的的了解也更加深入了。
之后,也会对 ARouter 的 arouter-register 模块做一个深入解析,敬请期待吧。