Gradle 插件与ASM入门

本文介绍了如何使用Gradle插件和ASM库在Android应用编译期间动态插入代码,以统计方法的执行时间。通过Gradle Transform API注册自定义插件,利用ASM生成和修改字节码,同时讲解了遇到的问题和解决方案,如groovy文件的命名、 DexMerger错误等。文章提供了一个完整的项目实例链接。
摘要由CSDN通过智能技术生成

前言

需要了解一点gradle知识,一点groovy语言,简单的ASM知识,这个插件的功能只是用ASM在编译期间插入代码,做简单的方法执行时间统计。

主要内容

  1. 自定义插件
  2. 使用ASM插入代码
  3. 统计方法耗时

首先我们先看一张经典的打包流程图:


  我们这次要干的就是在.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):这方法才是真正的插件实现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值