插件编写:
插件(逻辑任务的集合),如果需要将一系列任务复用的话,定义一个插件里面写上这些任务。其他项目只要引用这个插件即可,不需要重新写这些任务
定义插件
创建类实现Plugin接口重写apply接口,task是project的一个方法。
应用插件
apply plugin:插件类名(调用apply方法传入plugin值)
apply([plugin:插件类名])等价于方法调用传入map参数
当方法参数是map的时候可以将方括号去掉apply(plugin:插件类名 )
不引起歧义的时候可以吧括号去掉 就是上面的写法: apply plugin: 插件类名
插件内部使用三方jar
classPath不一致
在编译java代码的时候会使用到第三方的jar包,这是因为在dependencies的闭包中引入了对应的依赖库,在External Libraries中可以看到。
但是脚本的classPath和编译java代码的ClassPath是不一样的。脚本的ClassPath是从Gradle启动的JVM里面引入的,编译java代码的classPath是脚本配置dependcies闭包时引入的。
因此如果想要在脚本中也使用三方类的话,就需要引入对应的classPath。
这也就是buildscript的作用
在脚本中调用buildscript方法和主项目一样引入repositories和dependencies,只不过dependencies中引入三方依赖时前缀必须配置为classpath,代表为脚本引入这个类。
导包后就可以在脚本中也使用三方类了
总结下:也就是说想要在脚本中使用三方类的话必须在构建脚本buildscript中引入对应的classpath。
还有一种方式引用buildSrc下面的自定义Plugin,在编译的时候如果发现了有buildsrc目录会首先编译这个目录下的类,因此脚本中也可以直接使用这个下面的类
脚本内部使用类只能通过这两种方式引入
发布插件
当插件足够成熟的时候想要独立出来发布到内部仓库供其他人使用时(引入方式还是通过buildscript的classpath引用)
查找流程
当apply一个三方插件的时候,会去查找classpath中是否有对应的插件名.properties文件,找到这个文件解压,里面会有一行:implementation-class=com.android.build.gradle.AppPlugin , 这个的意思是说想要使用这个插件的话需要加载这个类到脚本的classpath中;然后实例化这个类并调用apply方法