回答了问题4,通过减少使用反射提升了性能。
在原理和架构章节处给了一张架构的设计图:
整体架构分三层,自下而上是数据流层、组件层、开放接口层。
数据流层是DRouter最重要的核心模块,这里承载着插件生成的路由表、路由元素、动态注册、以及跨进程功能相关的序列化数据流。所有的路由流转都会从这里取得对应的数据,进而流向正确的目标。
RouterPlugin和MetaLoader负责生成路由表,路由元素指的是RouterMeta,存放scheme/host/path等信息。
组件层,核心的路由分发、拦截器、生命周期、异步暂存和监控、ServiceLoader、多维过滤、Fragment路由,以及跨进程命令打包等。
开放接口层则是使用时接触到的一些类,API设计得也很简单易用,DRouter类和Request类分别只有75和121行代码。
问题1得到解答,到此处也对整个框架有了一个整体的认识。
阅读源码
1.初始化流程
调用DRouter.init(app)后的时序图如下:
默认是在子线程实现路由表加载,不影响主线程。
public static void checkAndLoad(final String app, boolean async) {
if (!loadRecord.contains(app)) {
// 双重校验锁
synchronized (RouterStore.class) {
if (!loadRecord.contains(app)) {
loadRecord.add(app);
if (!async) {
Log.d(RouterLogger.CORE_TAG, “DRouter start load router table sync”);
load(app);
} else {
new Thread(“drouter-table-thread”) {
@Override
public void run() {
Log.d(RouterLogger.CORE_TAG, “DRouter start load router table in drouter-table-thread”);
load(app);
}
}.start();
}
}
}
}
}
最终走到了RouterLoader的load方法来加载路由表到一个map中,仔细看它的引入路径是com.didi.drouter.loader.host.RouterLoader
,是不存在于源码中的,因为它是编译的时候生成的,位置位于app/build/int