网络上已经有很多分析ARouter的文章了,但是各有偏重;这里整理一些关键技术点,尽量能够将完整的流程都覆盖到,并且将一些容易错误使用的细节列举出来。
Java注解处理
ARouter大量使用了Java注解,并且通过APT(Annotation Processing Tool )自动处理注解,生成完成路由功能的代码。
ARouter使用的是RetentionPolicy.CLASS形式的注解,也就是注解只存在于编译阶段,生成的class文件中没有这些注解了。
ARouter APT的实现位于 arouter-compiler 中,比如处理路由注解(@Route)的 RouteProcessor,同时也处理注入注解(@Autowired)。
@AutoService(Processor.class)
@SupportedAnnotationTypes({ANNOTATION_TYPE_ROUTE, ANNOTATION_TYPE_AUTOWIRED})
public class RouteProcessor extends BaseProcessor {
}
APT自动生成代码,生成的代码在 build/generated/source/apt/com/alibaba/android/arouter/routes 目录下,具体代码在后面分析。
ARouter APT处理不需要 gradle 插件机制,默认 Java 编译就有帧对 APT 的编译阶段,只要在项目依赖中声明 APT 处理工具,APT 处理生成的代码可以看成项目代码的依赖。
dependencies {
annotationProcessor "com.alibaba:arouter-compiler:1.2.2"
}
Gradle插件
ARouter 插件完成最后的路由自动注册,实现位于 arouter-gradle-plugin 中。
通过 ARouter gradle 插件源码,我们能够大致理解 gradle 插件的实现过程。
在 resources/META-INF/gradle-plugins 目录下有一个 com.alibaba.arouter.properties 文件,内容如下:
implementation-class=com.alibaba.android.arouter.register.launch.PluginLaunch
由此可知, Gradle 通过 gradle-plugins 目录识别其插件,这里有一个插件 com.alibaba.arouter,实现类是 PluginLaunch。
代码中有 PluginLaunch.groovy 文件,是具体功能实现:
public class PluginLaunch implements Plugin<Project> {
@Override
public void apply(Project project) {
}
}
ARouter gradle 插件依赖 com.android.tools.build:gradle 插件,