前言
需要了解一点gradle知识,一点groovy语言,简单的ASM知识,这个插件的功能只是用ASM在编译期间插入代码,做简单的方法执行时间统计。
主要内容
- 自定义插件
- 使用ASM插入代码
- 统计方法耗时
首先我们先看一张经典的打包流程图:
我们这次要干的就是在.class文件转为Dex之前做代码插入,来达到编译时插入代码。
那么问题来了:
我怎么知道什么时候生成了.class文件,而且还要是没转成dex?
怎么在编译时候插入代码?
带着这两个问题,往下走:
在gradle插件1.5.0-beta1
版本时候,提供了一个Transform API,这个API专门就是为了第三方插件对编译后class文件转为dex之前而提供的,直接撸一个代码,因为是插件所以直接新建一个module,命名为buildSrc
,至于为啥要叫BuildSrc是因为这是Android保留给自定义plugin的名字,需要新建一个放插件的目录,都是用groovy语言写的所有目录层级如下图:
当然还需要新建一个build.gradle里面如下图:
注:这里面懒的去找asm的依赖,就直接用的android.tools.build
里面的asm。
然后就可以开始写groovy脚本了,既然前面说了是用Transform API那么就来继承这个API,还需要实现Plugin
这个接口,plugin
这个接口非常重要是用来把我们这个自定义的插件注册到project的task中,回到transform中,这个类需要实现getName,getInputTypes,getScopes,isIncremental四个抽象方法,还有一个tranform方法:
getInputTypes():限定输入文件的类型(例如:class,jar,dex等)
getScopes():限定文件所在的区域(例如:所有project,只有主工程等)
isIncremental():是否增量更新
getName():在控制台打印的transform名字(只是把这个名字拼接上去而已,例如:transformClassesWith+name+ForDebug)
transform(TransformInvocation transformInvocation):这方法才是真正的插件实现