AutoRegister 是一个使用字节码插桩技术实现的通用注册的框架,这个框架对使用场景有一些约定。
- 字节码插桩技术:# 看这一篇,你也可以自如的掌握字节码插桩
- ASM:字节码插桩的一个框架实现 - # ASM4使用手册-中文
使用配置
AutoRegister项目app模块中配置代码如下:
apply plugin: 'auto-register'
project.ext.registerInfoList = [
[
'scanInterface' : 'com.billy.app_lib_interface.ICategory'
// scanSuperClasses 会自动被加入到exclude中,下面的exclude只作为演示,其实可以不用手动添加
, 'scanSuperClasses' : ['com.billy.android.autoregister.demo.BaseCategory']
, 'codeInsertToClassName' : 'com.billy.app_lib_interface.CategoryManager'
//未指定codeInsertToMethodName,默认插入到static块中,故此处register必须为static方法
, 'registerMethodName' : 'register' //
, 'exclude' : [
//排除的类,支持正则表达式(包分隔符需要用/表示,不能用.)
'com.billy.android.autoregister.demo.BaseCategory'.replaceAll('\.', '/') //排除这个基类
]
],
[
'scanInterface' : 'com.billy.app_lib.IOther'
, 'codeInsertToClassName' : 'com.billy.app_lib.OtherManager'
, 'codeInsertToMethodName' : 'init' //非static方法
, 'registerMethodName' : 'registerOther' //非static方法
]
]
autoregister {
registerInfo = registerInfoList
cacheEnabled = true
}
配置说明
上面配置代码中,AutoRegister通过autoregister闭包结构,映射参数配置。registerInfoList是一个配置列表,每个配置项都有固定的结构,插件通过结构中指定的参数,下面是配置数据在插件中对应的解析代码,可以看到_八个_配置:
void convertConfig() {
registerInfo.each { map ->
RegisterInfo info = new RegisterInfo()
info.interfaceName = map.get('scanInterface')
def superClasses = map.get('scanSuperClasses')
if (!superClasses) {
superClasses = new ArrayList<String>()
} else if (superClasses instanceof String) {
ArrayList<String>