AutoRegister框架分析

47 阅读6分钟
    info.interfaceName = map.get('scanInterface')

    def superClasses = map.get('scanSuperClasses')

    if (!superClasses) {

        superClasses = new ArrayList<String>()

    } else if (superClasses instanceof String) {

        ArrayList<String> superList = new ArrayList<>()

        superList.add(superClasses)

        superClasses = superList

    }

    info.superClassNames = superClasses

    info.initClassName = map.get('codeInsertToClassName') //代码注入的类

    info.initMethodName = map.get('codeInsertToMethodName') //代码注入的方法(默认为static块)

    info.registerMethodName = map.get('registerMethodName') //生成的代码所调用的方法

    info.registerClassName = map.get('registerClassName') //注册方法所在的类

    info.include = map.get('include')

    info.exclude = map.get('exclude')

    info.init()

    if (info.validate())

        list.add(info)

    else {

        project.logger.error('auto register config error: scanInterface, codeInsertToClassName and registerMethodName should not be null\n' + info.toString())

    }

}



if (cacheEnabled) {

    checkRegisterInfo()

} else {

    deleteFile(AutoRegisterHelper.getRegisterInfoCacheFile(project))

    deleteFile(AutoRegisterHelper.getRegisterCacheFile(project))

}

}




##### [](https://github.com/a120464/Android-P7/blob/master/Android%E5%BC%80%E5%8F%91%E4%B8%8D%E4%BC%9A%E8%BF%99%E4%BA%9B%EF%BC%9F%E5%A6%82%E4%BD%95%E9%9D%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md)被收集的类配置:接口、基类及范围规定



> scanInterface、scanSuperClasses、include、exclude,下面内容来自框架文档



scanInterface : (必须)字符串,接口名(完整类名),所有直接实现此接口的类将会被收集

scanSuperClasses : 字符串或字符串数组,类名(完整类名),所有直接继承此类的子类将会被收集

include : 数组,需要扫描的类(正则表达式,包分隔符用/代替,如: com/billy/android/.*),默认为所有的类

exclude : 数组,不需要扫描的类(正则表达式,包分隔符用/代替,如: com/billy/android/.*),列表项(正则)匹配到最终的实现类,指定基类/接口不会对其子类/实现类生效




> 如下方法,确定扫描类列表,代码有删减:



class ScanClassVisitor extends ClassVisitor {

void visit(int version, int access, String name, String signature,

           String superName, String[] interfaces) {

    super.visit(version, access, name, signature, superName, interfaces)

    //抽象类、接口、非public等类无法调用其无参构造方法

    if (is(access, Opcodes.ACC_ABSTRACT)

            || is(access, Opcodes.ACC_INTERFACE)

            || !is(access, Opcodes.ACC_PUBLIC)

    ) {

        return

    }

    infoList.each { ext ->

        if (shouldProcessThisClassForRegister(ext, name)) {

            if (superName != 'java/lang/Object' && !ext.superClassNames.isEmpty()) {

                for (int i = 0; i < ext.superClassNames.size(); i++) {

                    if (ext.superClassNames.get(i) == superName) {

                        //  println("superClassNames--------"+name)

                        ext.classList.add(name) //需要把对象注入到管理类 就是fileContainsInitClass

                        found = true

                        addToCacheMap(superName, name, filePath)

                        return

                    }

                }

            }

            if (ext.interfaceName && interfaces != null) {

                interfaces.each { itName ->

                    if (itName == ext.interfaceName) {

                        ext.classList.add(name)//需要把对象注入到管理类  就是fileContainsInitClass

                        addToCacheMap(itName, name, filePath)

                        found = true

                    }

                }

            }

        }

    }

}

}

// include和exclude的处理,exclude的优先级高于include

private static boolean shouldProcessThisClassForRegister(RegisterInfo info, String entryName) {

if (info != null) {

    def list = info.includePatterns

    if (list) {

        def exlist = info.excludePatterns

        Pattern pattern, p

        for (int i = 0; i < list.size(); i++) {

            pattern = (Pattern)list.get(i)

            if (pattern.matcher(entryName).matches()) {

                if (exlist) {

                    for (int j = 0; j < exlist.size(); j++) {

                        p = (Pattern)exlist.get(j)

                        if (p.matcher(entryName).matches())

                            return false

                    }

                }

                return true

            }

        }

    }

}

return false

}




##### [](https://github.com/a120464/Android-P7/blob/master/Android%E5%BC%80%E5%8F%91%E4%B8%8D%E4%BC%9A%E8%BF%99%E4%BA%9B%EF%BC%9F%E5%A6%82%E4%BD%95%E9%9D%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md)管理和注册方法设置



codeInsertToClassName : (必须)字符串,类名(完整类名),通过编译时生成代码的方式将收集到的类注册到此类的codeInsertToMethodName方法中

codeInsertToMethodName: 字符串,方法名,注册代码将插入到此方法中。若未指定,则默认为static块,(方法名为:)

registerClassName: 无

registerMethodName : (必须)字符串,方法名,静态方法,方法的参数为 scanInterface




参数分为两组:**codeInsertToClassName** / **codeInsertToMethodName****registerMethodName** / **registerClassName**1.  第一组是管理类和管理方法:对应到示例中是 CategoryManager#initCategory

2.  第二组是注册类和注册方法:对应到示例中是 CategoryManager#register



示例中没有明确指定registerClassName,会默认赋值initClassName,也就是 **codeInsertToClassName**。所以,框架的设置中允许把管理类和注册类分开来写的。



// 代码有删减

void convertConfig() {

registerInfo.each { map ->

    RegisterInfo info = new RegisterInfo()

    info.initClassName = map.get('codeInsertToClassName')    //代码注入的类

    info.initMethodName = map.get('codeInsertToMethodName')  //代码注入的方法(默认为static块)

    info.registerMethodName = map.get('registerMethodName')  //生成的代码所调用的方法

    info.registerClassName = map.get('registerClassName')    //注册方法所在的类

    info.init()

}

}

void init() {

if (!registerClassName) {

    registerClassName = initClassName

}

}




> 注释:从示例中可以看出 **codeInsertToMethodName****registerMethodName** 需要保持一致,同时为静态方法或者同时非静态方法;如果没有指定**codeInsertToMethodName**,默认是静态代码块,视为静态方法,此时 **registerMethodName** 需指定静态方法。



> 对于四个参数的解释,参考框架中的实现类,略有修改。从下面的代码可以看出,AutoRegister的主要作用是从不同的模块收集子类和实现类(CategoryA/CategoryB),生成注册函数(register)调用代码,插入到初始化入口函数 **initCategory()****static** 代码块。在此基础上,APP初始化时只需要调用 **initCategory()** 或者自动执行 **static** 代码块,就可以做到添加一系列实例对象到初始化列表(CATEGORIES)中,完成注册工作。



// codeInsertToClassName | registerClassName

public class CategoryManager {

private static final HashMap<String, ICategory> CATEGORIES = new HashMap<>();



// 不指定 codeInsertToMethodName 时生效

static {

    register(new CategoryA()); //scanInterface的实现类

    register(new CategoryB()); //scanSuperClass的子类

}



// codeInsertToMethodName

public static void initCategory() {

    register(new CategoryA()); //scanInterface的实现类

    register(new CategoryB()); //scanSuperClass的子类

}



// registerMethodName

static void register(ICategory category) {

    if (category != null) {

        CATEGORIES.put(category.getName(), category);

    }

}



public static Set<String> getCategoryNames() {

    return CATEGORIES.keySet();

}

}

ory) {

    if (category != null) {

        CATEGORIES.put(category.getName(), category);

    }

}



public static Set<String> getCategoryNames() {

    return CATEGORIES.keySet();

}

}




[](https://github.com/a120464/Android-P7/blob/master/Android%E5%BC%80%E5%8F%91%E4%B8%8D%E4%BC%9A%E8%BF%99%E4%BA%9B%EF%BC%9F%E5%A6%82%E4%BD%95%E9%9D%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md)最后

==================================================================



按照国际惯例,给大家分享一套十分好用的Android进阶资料:《全网最全Android开发笔记》。



整个笔记一共**8大模块、729个知识点,3382页,66万字**,可以说覆盖了当下Android开发最前沿的技术点,和阿里、腾讯、字节等等大厂面试看重的技术。



![图片](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/f01be9bb2e5e40e0a7b1573dfe7820ca~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzYyMzc4NjkxMjU5:q75.awebp?rk3s=f64ab15b&x-expires=1772533073&x-signature=PvDeCn0qdqK7lvI9sGWH99DV2HA%3D)



![图片](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/785e11d7fc204b879c2bbad7cefff427~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzYyMzc4NjkxMjU5:q75.awebp?rk3s=f64ab15b&x-expires=1772533073&x-signature=lSvhqk%2FIS%2Bi2NP%2BkIFl6ElsVmNI%3D)



因为所包含的内容足够多,所以,这份笔记不仅仅可以用来当学习资料,还可以当工具书用。



如果你需要了解某个知识点,不管是Shift+F 搜索,还是按目录进行检索,都能用最快的速度找到你要的内容。



相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照整个知识体系编排的。



### [](https://github.com/a120464/Android-P7/blob/master/Android%E5%BC%80%E5%8F%91%E4%B8%8D%E4%BC%9A%E8%BF%99%E4%BA%9B%EF%BC%9F%E5%A6%82%E4%BD%95%E9%9D%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md)(一)架构师必备Java基础



1、深入理解Java泛型



2、注解深入浅出



3、并发编程



4、数据传输与序列化



5、Java虚拟机原理



6、高效IO



……



![图片](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/8194f141d8a74d088684158e97f2aa3b~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzYyMzc4NjkxMjU5:q75.awebp?rk3s=f64ab15b&x-expires=1772533073&x-signature=7AArCO%2BrU0fHqOKVFcRIm82leR4%3D)



### [](https://github.com/a120464/Android-P7/blob/master/Android%E5%BC%80%E5%8F%91%E4%B8%8D%E4%BC%9A%E8%BF%99%E4%BA%9B%EF%BC%9F%E5%A6%82%E4%BD%95%E9%9D%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md)(二)设计思想解读开源框架



1、热修复设计



2、插件化框架设计



3、组件化框架设计



4、图片加载框架



5、网络访问框架设计



6、RXJava响应式编程框架设计



……



![图片](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/29572d47e3854c168a4fcafcd2df6fda~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzYyMzc4NjkxMjU5:q75.awebp?rk3s=f64ab15b&x-expires=1772533073&x-signature=cofkZg%2BevsXpJqBDzBMDqKlPrCk%3D)



### [](https://github.com/a120464/Android-P7/blob/master/Android%E5%BC%80%E5%8F%91%E4%B8%8D%E4%BC%9A%E8%BF%99%E4%BA%9B%EF%BC%9F%E5%A6%82%E4%BD%95%E9%9D%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md)(三)360°全方位性能优化



1、设计思想与代码质量优化



2、程序性能优化



*   启动速度与执行效率优化

*   布局检测与优化

*   内存优化

*   耗电优化

*   网络传输与数据储存优化

*   APK大小优化



3、开发效率优化



*   分布式版本控制系统Git

*   自动化构建系统Gradle



……



![图片](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/c8b8f52e008a4dd6b6b85c2ce5b83023~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzYyMzc4NjkxMjU5:q75.awebp?rk3s=f64ab15b&x-expires=1772533073&x-signature=rj4OpP16bVUB7MjxMvjHxp1xdhA%3D)



### [](https://github.com/a120464/Android-P7/blob/master/Android%E5%BC%80%E5%8F%91%E4%B8%8D%E4%BC%9A%E8%BF%99%E4%BA%9B%EF%BC%9F%E5%A6%82%E4%BD%95%E9%9D%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md)(四)Android框架体系架构



1、高级UI晋升



2、Android内核组件



3、大型项目必备IPC



4、数据持久与序列化



5、Framework内核解析



……



![图片](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/7faf917698d1493cbfbaa3ddf625e4fd~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzYyMzc4NjkxMjU5:q75.awebp?rk3s=f64ab15b&x-expires=1772533073&x-signature=npy7Bu2huXAQ%2B%2FIMFhYQwEcyBZk%3D)



### [](https://github.com/a120464/Android-P7/blob/master/Android%E5%BC%80%E5%8F%91%E4%B8%8D%E4%BC%9A%E8%BF%99%E4%BA%9B%EF%BC%9F%E5%A6%82%E4%BD%95%E9%9D%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md)(五)NDK模块开发



1、NDK开发之C/C++入门



2、JNI模块开发



3、Linux编程



4、底层图片处理



5、音视频开发



6、机器学习



……



![图片](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/397a9196dc6f4f19a9e1351e79cff9d6~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzYyMzc4NjkxMjU5:q75.awebp?rk3s=f64ab15b&x-expires=1772533073&x-signature=%2BbEicXfcaC2t03%2F0HiCVCI5URCs%3D)



### [](https://github.com/a120464/Android-P7/blob/master/Android%E5%BC%80%E5%8F%91%E4%B8%8D%E4%BC%9A%E8%BF%99%E4%BA%9B%EF%BC%9F%E5%A6%82%E4%BD%95%E9%9D%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md)(六)Flutter学习进阶



1、Flutter跨平台开发概述



2、Windows中Flutter开发环境搭建



3、编写你的第一个Flutter APP



4、Flutter Dart语言系统入门



……



![图片](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/7dca707e04c241d49154d66bf799898e~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzYyMzc4NjkxMjU5:q75.awebp?rk3s=f64ab15b&x-expires=1772533073&x-signature=%2FAoiWIL6CQW2Txnyz%2B4nGzyVtF0%3D)



### [](https://github.com/a120464/Android-P7/blob/master/Android%E5%BC%80%E5%8F%91%E4%B8%8D%E4%BC%9A%E8%BF%99%E4%BA%9B%EF%BC%9F%E5%A6%82%E4%BD%95%E9%9D%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md)(七)微信小程序开发



1、小程序概述及入门



2、小程序UI开发


[**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的社区(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**](https://github.com/a120464/Android-P7/blob/master/Android%E5%BC%80%E5%8F%91%E4%B8%8D%E4%BC%9A%E8%BF%99%E4%BA%9B%EF%BC%9F%E5%A6%82%E4%BD%95%E9%9D%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md)