手写Gradle Plugin(自定义Gradle插件)

手写Gradle Plugin(自定义Gradle插件)

插件编译Gradle环境配置

Android Studio 3.6.3
com.android.tools.build:gradle:3.5.3
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip

新建一个moudel

  新建一个moudel,选择Android Library类型,并将moudel命名为asmplugin,包名无所谓。新建成功后进入该module目录,删除src/main下的所有文件和目录,只保留如图所示文件
手写Gradle Plugin(自定义Gradle插件)_第1张图片
修改build.gradle

  将asmplugin moudel下的build.gradle文件中的内容全部删除,并修改如下

apply plugin: 'groovy'
apply plugin: 'maven'

repositories {
    jcenter()
    mavenCentral()
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    //依赖 gradle Api仓库
    implementation gradleApi()
    // 依赖 groovy本地仓库
    implementation localGroovy()

    implementation 'com.android.tools.build:gradle:3.5.3'
}

//以下配置信息可以根据情况修改

// maven仓库group名称
group = 'com.asm.fix'
// maven仓库插件版本号
version = '1.0.0'

//maven 仓库发布
uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: uri("../asm_fix"))
        }
    }
}

  group 和 version 都需要在 app module 引用此插件时使用。所有的插件都需要被部署到 maven 库中,我们可以选择部署到远程或者本地。这里只是演示,所以只是将插件部署到本地目录中。具体地址通过 repository 属性配置,如图所示我将其配置在项目根目录下的 asm_fix目录下。

创建groovy目录

  因为Gradle插件是基于Groovy语法开发的,所有我们在moudel的src/main目录下新建一个groovy目录。在groovy目录下新建包名:com.asm.fix(包名任取,跟开发java时一样)。然后在包下新建BytecodePlugin.groovy文件,文件内容如下:

由于groovy是基于JVM的DSL语言,在groovy中能完美调用Java API。

package com.asm.fix

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

//因为要创建Gradle插件就必须要实现Gradle包中的org.gradle.api.Plugin接口
public class BytecodePlugin implements Plugin {

    void apply(Project project) {
        System.out.println("Hello Gradle Plugin")
    }
}

创建META-INF目录

  插件定义好之后我们要告诉Gradle哪一个类是我们定义的插件类。所以我们需要在moudle的src/main目录下新建一个resources目录,然后在resources目录下新建一个META-INF目录,接着在META-INF目录下新建一个gradle-plugins目录,gradle-plugins目录是自定义Gradle插件的必备目录。最后在gradle-plugins目录下创建一个properties文件。文件名为com.asm.fix.properties,并在文件中添加一下配置内容:

implementation-class=com.asm.fix.BytecodePlugin

最终该module内容为:
手写Gradle Plugin(自定义Gradle插件)_第2张图片

使用插件

  使用插件前我们需要把我们定义好的插件打包到Maven仓库才可以使用,这里我们直接将插件打包到本地Maven仓库。在之前的build.gradle文件中我们已经配置好了插件的Maven发布配置。这时我们运行asmplugin下的uploadArchives Task
手写Gradle Plugin(自定义Gradle插件)_第3张图片

Task运行成功后,就会在asmplugin module的同级目录下生成一个asm_fix文件夹,该文件夹就是我们自定义插件的仓库。

手写Gradle Plugin(自定义Gradle插件)_第4张图片

插件打包到本地仓库后就可以在主项目的build.gradle中使用我们自定义的插件了,在根目录的build.gradle文件中添加Maven的本地依赖,代码如下所示:

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
   
    repositories {
        google()
        jcenter()
        //maven 仓库地址
        maven {
            url uri('./asm_fix')
        }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.6.3'
       
        // in the individual module build.gradle files
        classpath 'com.asm.fix:asmplugin:1.0.0'
    }
}

allprojects {
    repositories {
        google()
        jcenter()
        
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

在根目录的build.gradle配置完成之后,就可以只用我们自定义的插件了,在主项目的的build.gradle文件中添加如下依赖:

apply plugin: 'com.asm.fix'

配置成功后我们重新clean下代码,运行项目我们会在Studio的Build窗口中看到插件所打印的信息,表明插件成功生效。
手写Gradle Plugin(自定义Gradle插件)_第5张图片

至此我们手写Gradle Plugin插件就算大功告成了。

你可能感兴趣的:(Android,Gradle)