Android 自定义 grdle 插件(二)

外部传入参数

今天继续学习gradle的其他用法,其中之一是增加参数,增加参数方便我们根据不同的情况去做个性化工作。

plugin文件中的改法:

      //定义参数 在build.gradle设置参数 XPJTestParams{ name = "" } XPJParams 这个类需要时open的类
        project.extensions.create("XPJTestParams", XPJParams::class.java)
        //获取参数
        // fixme 这里取值不对是因为先把自己还没有assemble的依赖里,这里的取值在赋值之前
        val name = project.extensions.findByType(XPJParams::class.java)?.name

       task.doLast {
                // fixme 这里可以是因为已经在上一个赋值之后了
                println("在dolast的时候再取值,这时候应该ok了")
                File("${project.projectDir.path}/XPJPluginStudy.txt").apply {
                    writeText(
                        "Hello ${project.extensions.findByType(XPJParams::class.java)?.name}! AAAA BBB CCC
Printed at: ${
                            SimpleDateFormat("HH:mm:ss").format(
                                Date()
                            )
                        }"
                    )
                }

然后在调用的app build文件中增加对应的调用

// fixme 这里就是按照顺序去执行的,在android的task之后
// 注意这里的名字是和添加到extensions里面的第一个参数是一致的,也就是key
XPJTestParams {
    println("这里创建的extensions实际上是一个groovy的闭包。 什么时候执行这个设置方法,是不是之后才高的呀")
    name = "啦啦啦,德玛西亚"
}

增量编译

首先是创建一个对应的task,如下

open class XPJFirstTask : DefaultTask(){
    @Input
    var inputName:String? = null
    @OutputFile
    var file: File? = null
    @TaskAction
    fun generateFile(){
        println("我在自定义task里面执行")
        file?.apply {
            writeText("Hello $inputName!
Printed at: ${SimpleDateFormat("HH:mm:ss").format(Date())}")
        }
    }
}

然后在我们的plugin文件中增加对应代码,编译几次,发现up to date。

//注册Task
        project.tasks.register(XPJ_PLUGIN_NAME_V2, XPJFirstTask::class.java) {
            it.group = XPJ_PLUGIN_TASKS
            //设置输入
            it.inputName = project.extensions.findByType(XPJParams::class.java)?.name
            //设置输出
            // fixme 这里的输出文件需要与之前的文件不同,不然通知执行两个task的时候由于第一个修改了这个文件,
            // fixme 那么第二个task探测到变了就会再次执行task了
            it.file = File("${project.projectDir.path}/$XPJ_PLUGIN_GENERATE_FILE_V2")
        }

        //将MyFirstPlugin添加到构建树
        val android = project.extensions.findByType(BaseExtension::class.java)
        (android as AppExtension).applicationVariants.all {
            //将MyFirstPlugin task添加到assemble task前
            //assemble依赖MyFirstPlugin的意思是说assemble运行前先运行MyFirstPlugin
            it.assembleProvider.dependsOn(XPJ_PLUGIN_NAME_V2)
            // fixme 连续增加两个不同的task
            it.assembleProvider.dependsOn(XPJ_PLUGIN_NAME)
        }

这里主要用了增量编译的几个注解api更多的需要查阅gradle官方。

原文地址:https://www.cnblogs.com/pjex/p/14916035.html