Android 自定义gradle plugin

141 阅读2分钟

插件 module

目录结构(java library)

clipboard.png

  • groovy 和 resources 等是固定目录
  • zkt-plugin.properties 其中 zkt-plugin 是apply plugin时引用的名字

创建 Plugin

package com.zkt.plugin

import org.gradle.api.Action
import org.gradle.api.Plugin
import org.gradle.api.Project

class MyPlugin implements Plugin<Project> {

    void apply(Project project) {

        //创建extension
        def obj = project.extensions.create("test111", MyExtension)

        // 第一种
//        project.task('zkt') {
//            doLast {
//                println "====== key1 : ${obj.key1}  === key2 : ${obj.key2} ============="
//            }
//        }.setGroup('zktGroup')


        //第二种
        // 所有Project配置完成后,会回调project.afterEvaluate()
        // 之所以在此回调中获取值,是因为build.gradle中对插件apply在前,extension配置在后,所以需要等配置之后才能获取到extension的赋值
        project.afterEvaluate(new Action<Project>() {
            @java.lang.Override
            void execute(Project p) {
                //创建task
                project.getTasks().create("zkt", MyTask, obj.key1, obj.key2)
                        .setGroup('zktGroup')
            }
        })
    }
}

声明 Task

package com.zkt.plugin

import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction

import javax.inject.Inject

class MyTask extends DefaultTask {

    String key = ""
    String key2 = ""

    // 添加构造参数
    @Inject
    MyTask(String key, String key2) {
        this.key = key
        this.key2 = key2
    }

    // 添加要执行动作
    @TaskAction
    def onTaskMethod() {
        println "====== key : $key  === key2 : $key2 ============="
    }
}

声明 Extension

package com.zkt.plugin

class MyExtension {
    def key1
    def key2
}

properties 配置

implementation-class = com.zkt.plugin.MyPlugin

build.gradle 配置

直接复制

plugins {
    // 如果用了groovy语言开发,那需要加上此插件
    id 'groovy'
    //gradle7以下将插件上传至maven 仓库
    // id 'maven'
    //gradle7以后要用这个插件上传maven
    id 'maven-publish'
    id 'java-gradle-plugin'
}

dependencies {
    // 不需要,id 'java-gradle-plugin'搞定
    //    implementation(gradleApi())
    //    implementation(localGroovy())

    implementation 'com.android.tools.build:gradle:3.5.2'      // 如果Android 编译相关,需依赖这个
}

repositories {
    mavenCentral()
}

// uploadArchives 和 publications 是gradle 提供的两种发布机制
// uploadArchives 是基于 Upload 类型的任务,是原始的、与java插件配合使用的机制
// publications 是基于MavenPublication类型的任务,是新的、与 maven-publish 插件配合使用的机制
// uploadArchives 在 gradle7 中已经被移除,建议迁移到 maven-publish
//uploadArchives {
//    repositories.mavenDeployer {
//        repository(url: uri('../repo')) //upload时 根目录下会自动生成repo文件夹作为仓库
//        pom.groupId = 'com.zkt.plugin'
//        pom.artifactId = 'zktPlugin'
//        pom.version = '1.0.0'
//    }
//}

//***************** 新的方式,与uploadArchives的方式二选一 ************************

//配置发布本地 maven
publishing {
    repositories {
        maven { url uri("../repo") }
    }
    publications {
        debug(MavenPublication) {
            from components.java
            groupId 'me.zkt.asm'
            artifactId 'lib-asm'
            version "1.0.0"
        }
    }
}

发布插件到本地maven

clipboard.png

其他module中使用插件

根 build.gradle 中配置

buildscript {

    repositories {
        ...
        //引用本地声明的插件仓库
        maven { url uri('/repo') }
    }
    dependencies {
        ...
        //插件版本
        classpath 'com.zkt.plugin:zktPlugin:1.0.0'
    }
}

子module中引用并赋值extension

apply plugin: 'zkt-plugin'

//给Extension赋值
test111 {
    key1 "hahahhahah"
    key2 "hhhhhh"
}