ARouter 梳理

ARouter是实现项目组件化的重要工具,通过编译期扫描和自动注册实现解耦。它在编译期处理module和Activity的注入,并在运行时找到目标进行调用。涉及的知识点包括编译期注解处理、ASM、JavaAssist以及Android的SPI机制。
摘要由CSDN通过智能技术生成

ARouter作为项目组件化的一个非常重要的工具,实现了很大的解耦

原理:

 简单调用

@Route(path = "/test/activity1", name = "测试用 Activity")
public class Test1Activity extends AppCompatActivity {

path = "/test/activity1"  代理了两部分: group: test  , path:/test/activity1

代码中通过  RouteMeta 这个类与path 作为映射关系

1 关于module的注册:

Arouter通过在编译器,扫描需要注册的类,如上面的Test1Activity ,然后生成相应的注册代码

如下代码是Arouter编译器生成的:

/**
 * DO NOT EDIT THIS FILE!!! IT WAS GENERATED BY AROUTER. */
public class ARouter$$Group$$module implements IRouteGroup {
  @Override
  public void loadInto(Map<String, RouteMeta> atlas) {
    atlas.put("/module/1", RouteMeta.build(RouteType.ACTIVITY, TestModuleActivity.class, "/module/1", "module", null, -1, -2147483648));
  }
}

关注module的自动注册,ARouter通过asm 代码注入的方式,在编译期向LogisticsCenter.java的loadRouterMap 方法注入代码

如下:

private static void loadRouterMap() {
    registerByPlugin = false;
    //auto generate register code by gradle plugin: arouter-auto-register
    // looks like below:
    // registerRouteRoot(new ARouter..Root..modulejava());
    // registerRouteRoot(new ARouter..Root..modulekotlin());
}

在ARouter初始化时,将需要的module进行注册

以上就是ARouter的注册逻辑,可以看出ARouter在编译期做了很多的生气,包括module的自动注入 ,Activity的自动注入等

 

2 调用逻辑:

先猜想一下如何调用:

1) 调用方传入参数以及对应的url

2)   处理逻辑找对对应的被调用发

3) 启动activity或者拿到fragment或者IProvider的实现者

ARouter.getInstance()
        .build("/kotlin/test")
        .withString("name", "老王")
        .withInt("age", 23)
        .navigation();

这段代码就是启动activity的逻辑 ,最终的处理逻辑如下:

// 寻找目标 _Arouter.java

public synchronized static void completion(Postcard postcard) {
    if (null == postcard) {
        throw new NoRouteFoundException(TAG + "No postcard!");
    }

    RouteMeta routeMeta = Warehouse.routes.get(postcard.getPath());
    if (null == routeMeta) {    // Maybe its does't exist, or didn't load.
        Class<? extends IRouteGroup> groupMeta = Warehouse.groupsIndex.get(po
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值