之前介绍了Gradle插件的开发,这次会对功能进行一部分拓展,建议没有读过第一篇文章的朋友,先看一下Gradle插件学习笔记(一)
Extension
之前的文章提到过,如何编写一个插件,但是并不能通过外面传递参数进来,如果想使用一些自定义的参数可以使用Extension,我们可以再建立一个MyExtension.groovy
class MyExtension {def aaa;def bbb;}
复制代码
然后找到插件类(可以参考上一篇文章):
public class TestPlugin implements Plugin<Project> {@Overridevoid apply(Project project) {project.extensions.create("deep", MyExtension)project.afterEvaluate {MyExtension extension = project['deep'];String a = extension.aaaString b = extension.bbbprintln("deep:${a},${b}")}}
}
复制代码
Project本身是支持拓展的,所以提供了create
方法,project.extensions.create("deep", MyExtension)
这句代码的意思是将我们的自定义的类作为Project的一个属性值,key是deep。
这里在普及一个小知识,项目中gradle执行的时候,会先解析setting.gradle,然后是build.gradle,如果想在解析build.gradle之前做点事,可以使用
project.beforeEvaluate
如果想在解析build.gradle之后做点事可以project.afterEvaluate。
所以我们在解析完build.gradle之后,在访问project中我们设置的属性,即可得到build.gradle中设入的值。 来看个例子(其中hhh就是我们写的插件名字,这个上篇文章提到过):
apply plugin: 'hhh'
deep{aaa="this is a"bbb="this is b"
}
复制代码
执行任务打印:
android
通过上面的例子,我想到了正经的android工程不是也是这样配置的吗,我们可以测试一下。 都知道android工程中的project,样式如下:
android {compileSdkVersion 26buildToolsVersion "26.0.3"defaultConfig {applicationId "deep.com.testgroovy"minSdkVersion 14targetSdkVersion 26versionCode 1versionName "1.0"}
}复制代码
这些不都是project的一个拓展类吗?我们可以测试一下,修改插件:
@Overridevoid apply(Project project) {project.afterEvaluate {println("包名:"+project['android']["defaultConfig"].applicationId)}
复制代码
我取project下的android,然后再取android下的defaultConfig,就可以得到包名,执行一下看看:
总结
好了今天有点时间,先写这么多吧,下篇文章具体说一下如何干预android编译 也欢迎关注我的公众号,之后会推荐更多好用的组件库。