Bootstrap

Gradle插件、注解、javapoet和asm实战

实战库ImplLoader的介绍

首先来介绍一下实战项目的所解决的问题 : 当一个Android工程中如果已经使用不同的module来做业务隔离。那我们就可能有这种需求,module1想实例化一个module2的类,一般要怎么解决呢?

  • module1依赖module2
  • module2的这个类沉到底层库,然后module1module2都使用这个底层库。
  • ....等

下面来介绍一个小库 : ImplLoader。可以很方便解决这个问题。只需这样使用即可:

  1. 使用@Impl标记需要被加载的类
//`module2`中的类:
@Impl(name = "module2_text_view")
public class CommonView extends AppCompatTextView {

}
  1. 使用 ImplLoader.getImpl("module2_text_view") 来获取这个类
public class Module1Page extends LinearLayout {
    public Module1Page(@NonNull Context context) {
        super(context);
        init();
    }

    private void init() {
        //根据name,获取需要加载的类
        View module1Tv = ImplLoader.getView(getContext(), "module2_text_view");
        addView(module1Tv);
    }
}
  1. 初始化ImplLoader
    ImplLoader.init()

库的代码放在: https://github.com/SusionSuc/ImplLoader

为什么要写这个库 ?

主要是为了练手

在阅读WMRouterARouter源码时发现这两个库都用到了自定义注解自定义gradle插件Gradle Transfrom APIjavapoet和asm库。而我对于这些知识很多我只是了解个大概,或者压根就没听说过。
因此ImplLoader这个库主要是用来熟悉这个知识的。当然这个库的实现思路主要参考WMRouterARouter

库的实现原理

用下面这种图概括一下:

 

其实整个库代码并不多,不过实现起来用到的东西不少,如果一些你使用的不熟悉,可以先看一下:

https://github.com/SusionSuc/AdvancedAndroid

这个库是用来总结我这两年Android所学和对自我提高的一个库。里面的文章我写的很用心,会一直频繁更新。

下面简单过一下ImplLoader的实现代码(只看主流程):

定义@Impl注解

@Retention(RetentionPolicy.RUNTIME)
public @interface Impl {
    String name() default "";
}

编译时注解处理器ImplAnnotationProcessor, 扫描@Impl,并生成ImplInfo_XXX.java

    //ImplAnnotationProcessor.p
;