Gradle插件学习笔记(二)

以前介绍了Gradle插件的开发,此次会对功能进行一部分拓展,建议没有读过第一篇文章的朋友,先看一下Gradle插件学习笔记(一)java


Extension

以前的文章提到过,如何编写一个插件,可是并不能经过外面传递参数进来,若是想使用一些自定义的参数可使用Extension,咱们能够再创建一个MyExtension.groovyandroid

class MyExtension {
    def aaa;
    def bbb;
   
}
复制代码

而后找到插件类(能够参考上一篇文章):bash

public class TestPlugin implements Plugin<Project> {

    @Override
    void apply(Project project) {
        project.extensions.create("deep", MyExtension)
        project.afterEvaluate {
            MyExtension extension = project['deep'];
            String a = extension.aaa
            String b = extension.bbb
            println("deep:${a},${b}")
            
        }
    }
}
复制代码

Project自己是支持拓展的,因此提供了create方法,project.extensions.create("deep", MyExtension)这句代码的意思是将咱们的自定义的类做为Project的一个属性值,key是deep。app

这里在普及一个小知识,项目中gradle执行的时候,会先解析setting.gradle,而后是build.gradle,若是想在解析build.gradle以前作点事,可使用project.beforeEvaluate若是想在解析build.gradle以后作点事能够project.afterEvaluate。ide

因此咱们在解析完build.gradle以后,在访问project中咱们设置的属性,便可获得build.gradle中设入的值。 来看个例子(其中hhh就是咱们写的插件名字,这个上篇文章提到过):学习

apply plugin: 'hhh'
deep{
    aaa="this is a"
    bbb="this is b"
}
复制代码

执行任务打印: 测试

android

经过上面的例子,我想到了正经的android工程不是也是这样配置的吗,咱们能够测试一下。 都知道android工程中的project,样式以下:gradle

android {
 compileSdkVersion 26
    buildToolsVersion "26.0.3"
    defaultConfig {
        applicationId "deep.com.testgroovy"
        minSdkVersion 14
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
    }
}

复制代码

这些不都是project的一个拓展类吗?咱们能够测试一下,修改插件:ui

@Override
    void apply(Project project) {

        project.afterEvaluate {
                println("包名:"+project['android']["defaultConfig"].applicationId)
        }
复制代码

我取project下的android,而后再取android下的defaultConfig,就能够获得包名,执行一下看看: this

果真能够获取包名,同理,在打包的时候能够拿到更多的设置信息。

总结

好了今天有点时间,先写这么多吧,下篇文章具体说一下如何干预android编译 也欢迎关注个人公众号,以后会推荐更多好用的组件库。

相关文章
相关标签/搜索