ARouter源码解析01-编译生成文件

Arouter源码解析

编译时注解

ARouter采用了编译时注解,在IDE编译阶段,即会生成相关文件,以供后续使用。具体实现在arouter-compiler,由于编译时注解的实现原理都大同小异,在这里就不详细说明了。

@AutoService(Processor.class)
@SupportedOptions(KEY_MODULE_NAME)
@SupportedSourceVersion(SourceVersion.RELEASE_7)
@SupportedAnnotationTypes({ANNOTATION_TYPE_ROUTE, ANNOTATION_TYPE_AUTOWIRED})
public class RouteProcessor extends AbstractProcessor {

@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
    if (CollectionUtils.isNotEmpty(annotations)) {
        Set<? extends Element> routeElements = roundEnv.getElementsAnnotatedWith(Route.class);
        //遍历注解,存储至map集合,再写入到文件中
        this.parseRoutes(routeElements);
        return true;
    }

    return false;
}

主要来看编译之后,ARouter产生的文件。文件的路径在
app/build/generated/source/apt/debug/com.alibaba.android.arouter/文件夹下

ARouter Builder文件

ARouter$$Group $ $service: service组的路由清单
public class ARouter$$Group$$service implements IRouteGroup {
  @Override
  public void loadInto(Map<String, RouteMeta> atlas) {
    atlas.put("/service/hello", RouteMeta.build(RouteType.PROVIDER, HelloServiceImpl.class, 
        "/service/hello", "service", null, -1, -2147483648));
    atlas.put("/service/json", RouteMeta.build(RouteType.PROVIDER, JsonServiceImpl.class, 
        "/service/json", "service", null, -1, -2147483648));
    atlas.put("/service/single", RouteMeta.build(RouteType.PROVIDER, SingleService.class,
        "/service/single", "service", null, -1, -2147483648));
  }
}  
ARouter$$Group $ $test: test组的路由清单
public class ARouter$$Group$$test implements IRouteGroup {
  @Override
  public void loadInto(Map<String, RouteMeta> atlas) {
    atlas.put("/test/activity1", RouteMeta.build(RouteType.ACTIVITY, Test1Activity.class,
        "/test/activity1", "test", new java.util.HashMap<String, Integer>(){{put("pac", 9);
        put("url", 8); }}, -1, -2147483648));
    atlas.put("/test/activity2", RouteMeta.build(RouteType.ACTIVITY, Test2Activity.class, 
        "/test/activity2", "test", new java.util.HashMap<String, Integer>(){{put("key1", 8); }}
        , -1, -2147483648));
    atlas.put("/test/fragment", RouteMeta.build(RouteType.FRAGMENT, BlankFragment.class, 
        "/test/fragment", "test", null, -1, -2147483648));
    atlas.put("/test/webview", RouteMeta.build(RouteType.ACTIVITY, TestWebview.class, 
        "/test/webview", "test", null, -1, -2147483648));
  }
}  
ARouter$$Root $ $app: 路由清单总表

用于记录组级别的路由清单,所有组级别的路由清单又会在此记录。

public class ARouter$$Root$$app implements IRouteRoot {
  @Override
  public void loadInto(Map<String, Class<? extends IRouteGroup>> routes) {
    routes.put("service", ARouter$$Group$$service.class);
    routes.put("test", ARouter$$Group$$test.class);
  }
}  
ARouter$$Interceptors $ $app: 拦截器路由清单

可以发现拦截器的put顺序,已在编译阶段,按照优先级排序好了。

public class ARouter$$Interceptors$$app implements IInterceptorGroup {
  @Override
  public void loadInto(Map<Integer, Class<? extends IInterceptor>> interceptors) {
    interceptors.put(3, Test2Interceptor.class);
    interceptors.put(5, Test3Interceptor.class);
    interceptors.put(7, Test1Interceptor.class);
  }
}
ARouter$$Providers $ $app: Provider路由清单
public class ARouter$$Providers$$app implements IProviderGroup {
  @Override
  public void loadInto(Map<String, RouteMeta> providers) {
    providers.put("com.alibaba.android.arouter.demo.testservice.HelloService", 
        RouteMeta.build(RouteType.PROVIDER, HelloServiceImpl.class, "/service/hello",
        "service", null, -1, -2147483648));
    providers.put("com.alibaba.android.arouter.facade.service.SerializationService", 
        RouteMeta.build(RouteType.PROVIDER, JsonServiceImpl.class, "/service/json", "service",
        null, -1, -2147483648));
    providers.put("com.alibaba.android.arouter.demo.testservice.SingleService", 
        RouteMeta.build(RouteType.PROVIDER, SingleService.class, "/service/single",
        "service", null, -1, -2147483648));
  }
}  

从ARouter编译的产物,我们可以猜测出,ARouter是通过加载这些路由清单,从而进行跳转等操作的。

下篇文章,我们来验证我们的猜想。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

氦客

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值