通过本系列课能学习到的东西
1、Android Gradle插件开发配置
2、Android Gradle插件调试
3、Android Gradle自定义Transform扫描Class文件、Jar文件
4、通过ASM完成字节码插入
5、运行插件Demo看整体效果
6、基于以上知识,分析AutoRegister基本原理
AutoRegister地址
AutoRegister 大体介绍
此插件要解决的问题是:
工厂模式中工厂创建的产品需要注册到工厂类中,每新增一个产品要修改一次工厂类的代码
策略模式中所有策略需要注册到管理类中,每新增一种策略需要修改一次管理类的代码
接口及其管理类在基础库中定义,其实现类在不同的module中,需要在主工程中进行注册,每新增一个实现类注册需要手动添加
比如在做组件化开发时,组件注册到主app中需要在主app的代码中import组件类进行注册,代码侵入性强
使用此插件后,在编译期(代码混淆之前)扫描所有打到apk包中的类,将符合条件的类收集起来,并生成注册代码到指定的类的static块中,自动完成注册
功能简介
在apk打包过程中,对编译后的所有class(包含jar包中的class)进行扫描,将 scanInterface的实现类 或 scanSuperClasses的子类扫描出来,并在 codeInsertToClassName 类的 static块 中生成注册代码,如demo中:
public class CategoryManager {
static
{
CategoryManager.register(new CategoryA()); //scanInterface的实现类
CategoryManager.register(new CategoryB()); //scanSuperClasses的子类
}
}
apply plugin: 'auto-register'
autoregister {
registerInfo = [
[
'scanInterface' : 'com.billy.app_lib_interface.ICategory'
, '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方法
]
]
}
本节课程就是大体介绍一下,下节课继续