ARouter实现分析

网络上已经有很多分析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 插件,

路由机制

注入机制

猜你喜欢

转载自blog.csdn.net/luansxx/article/details/90207661