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 插件,

路由機制

 

注入機制

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章