目录
1.2 打开app目录下找到builde.gradle文件,在里面编写插件
最近在学习AOP全埋点,里面用到了Gradle插件,网上相关教程已经相当完备,学完之后感觉受益匪浅,所以准备把制作方法及学习过程中遇到的问题做个记录,便于以后查看。
Gradle插件制作方法一共三种,分别为:在app的builde.gradle中制作、在buildSrc文件夹下制作、自定义module并上传到maven仓库。三种方法实现大致相似,均实现了Plugin<Project>接口。下面分别介绍这三种方法的实现方式。
1.在app的builde.gradle中制作
1.1 创建一个Android项目
1.2 打开app目录下找到builde.gradle文件,在里面编写插件
如果不懂Groovy语法也没关系,我们可以直接使用java进行编写,如下:
class MyPlugin implements Plugin<Project>{
@Override
void apply(Project project) {
println("MyPlugin执行")
project.task("mytask"){
doLast {
println('doLast-MyPlugin中的task执行了')
}
doFirst {
println('doFirst-MyPlugin中的task执行了')
}
}
}
}
定义一个MyPlugin插件实现Plugin接口。然后在apply方法中自定义一个task。一个简单的插件就完成了。
然后在当前build.gradle文件中引入插件
apply plugin:MyPlugin
到此,一个简单的插件已经制作完成。
然后在控制台执行一下我们自己的task,window下命令:gradlew mytask
输出如下,Mac执行./gradlew mytask
,执行结果如下:
1.3 插件制作完成
下面图片为我的代码所在文件位置:
2.在buildSrc文件夹下制作
2.1 buildSrc文件夹是什么?
这个文件夹是可以直接被Android项目Geadle识别的,可以理解为一个专门用来管理插件的地方,编译的时候Gradle会自动识别这个目录,将其内的代码编译成插件。虽然是默认识别,但是我们创建的android项目中,默认是没有这个文件夹的,需要我们自己来创建。
由于是被Gradle默认识别的,所以该文件夹里的目录子文件夹名字是固定的,否则无法被项目识别到,具体结果如下(看红框部分即可):
2.2 创建buildSrc文件夹及插件编写
创建的方式有两种,一种是直接在项目根目录创建这个文件夹,另一种是创建 java/android module并以buildSrc命名,之后将module里的文件全部修改成buildSrc文件夹子目录规定的名称,因为创建module时,Android studio会自动将改module加入项目根目录的settings.gradle中,此时需要移除,否则会报错,因为buildSrc文件夹已经默认是一个module了,可以自动被识别到,不需要再添加到settings.gradle中。
- 在buildSrc文件夹下创建src文件夹和build.gradle文件
- build.gradle文件中添加一行代码即可
apply plugin: 'groovy'
- src文件下创建main/groovy文件夹,用来存放插件源码
- 在main目录下新建resources目录,然后在resources目录里面再新建META-INF目录,再在META-INF里面新建gradle-plugins目录。最后在gradle-plugins目录里面新建properties文件。properties文件名可以随便取,这个名字就是将来别人引用你这个插件时候的名字。因为插件名可以随便取的,为了保证能够通过这个名字可以映射到插件的源码,我门需要在这个配置文件中设置我门插件的入口,也就是我门插件入口的引用地址,设置给implementation-class,如下所示:
- 目录创建结束后,我们可以编写插件了,流程和创建一个java类一样,只不过我门的插件是groovy文件,插件的写法同第一种方法,如下所示:
2.3 引用插件
插件创建完成后,我门可以直接在app目录下的build.gradle中使用,如下:
2.4 验证插件功能
在控制台执行一下我们自己的task,window下命令:gradlew plugin3
输出如下,Mac执行./gradlew plugin3
2.5 buildSrc文件夹优缺点
该方式创建的插件整个项目都可以使用,但是如果其他项目也想使用就需要再拷贝一份,使用方式不够灵活。
3.自定义module并上传到maven仓库
第三种方法可以将写好的插件上传到远端仓库,弥补了第二种使用上不够灵活的缺点。
3.1 创建module
这一步可以创建java/android moudle,个人建议创建一个java module,这样改写来也简单,只需要把main/src/java改为main/src/groovy即可。之后把文件夹目录按照 2.2的3和4进行创建即可。创建完成后是下图这样的:
3.2 配置build.gradle
参照下图进行配置即可,尽量自己敲一遍,印象会更深。
3.3 编写插件
这一步和第一、二中的创建方式一样,创建groovy文件并集成与plugin即可:
3.4 配置properties文件
和第二种方式一样,创建完插件也是需要配置改文件的,这样别人才能引用到你的插件。如下:
3.5 上传插件到maven仓库
由于我还没建远程maven仓库,所以目前只上传到本地仓库。上传到远程的方式和这个一样,只是需要把3.2里的url换成你的远程仓库地址。
当我们在build.gradle中配置好uploadArchives里的仓库地址等内容后,as的gradle上就会出现一个uploadArchives任务,如下图,我门点击他就可以完成上传了。
3.6 使用插件
首先在项目中的build.gradle中配置插件maven地址和插件版本号,如下:
最好,在app的build.gradle中配置插件,这两布结束,一个简单的插件上传到maven及使用方法就学会了。
3.7 验证远程插件
执行./gradlew plugin4,结果如下:
正式我门插件所写的内容。
致此,三种插件的创建方式已经记录完毕。
4.参考资料:
4.1 Android ASM自动埋点方案实践 (算是读了这篇文章入的门吧)
4.2 Gradle之自定义插件(三种创建方式都讲了,很详细)
5.下篇预告
本打算这个月好好学下aop全埋点,无奈又有一堆需求过来了,哎,打工人太难了。不过,下一步准备研究下transform api和ASM的使用,最终会写一个简单的埋点demo,到时候学习笔记也会一并写了,大概5月底会完整这件事。