自定义Gradle插件的开发

8,560 阅读4分钟

开发一个插件的步骤

  1. 新建一个Android library类型的module, 删掉src目录下的androidTest, test目录。
  2. src/main目录下,新建一个groovy目录,用来放相关的groovy文件
  3. src/main/groovy目录下新建一个目录com.fred.asm(请注意是一个目录名为com.fred.asm, 不是建了一个com/fred/asm目录)
  4. src/main/groovy/com.fred.asm/目录下,新建一个类, 这个类是我们的插件入口,我最初的想法是想写一个插件来统计方法的执行时间,所以写了一个类MethodStatPlugin.groovy
public class MethodStatPlugin implements Plugin<Project> {

    @Override
    void apply(Project target) {
        println "plugin execute";
    }
}
  1. src/main目录下面新建一个resources目录
  2. src/main/resources/下新建一个目录META-INF, 在META-INF下面再建一个目录gradle-plugins
  3. 以上步骤完成,便有了src/main/resources/META-INF/gradle-plugins目录,接着在这个目录下,我们建一个performance.methodstat.properties文件
  4. performance.methodstat.properties 文件中,添加如下代码
implementation-class=com.fred.asm.MethodStatPlugin
  1. build.gradle文件中添加如下代码:
apply plugin: 'groovy'
apply plugin: 'maven'
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])

    implementation gradleApi()
    implementation localGroovy()

    implementation 'com.android.tools.build:gradle:3.4.2'

    implementation 'org.ow2.asm:asm:7.1'
    implementation 'org.ow2.asm:asm-commons:7.1'
}

group='com.fred.asm.plugin'
version='1.0.0'

uploadArchives {
    repositories {
        mavenDeployer {
            //本地的Maven地址设置
            repository(url: uri('../asm_plugin_repo'))
        }
    }
}

这一波操作完了,我们的插件module便完成了,其结构如下:

image.png

需要注意

  • 图片中的META-INF.gradle-plugins是android studio折叠后的显示效果,其对应的物理路径是META-INF/gradle-plugins, performance.methodstat.properties文件必须是要在src/main/resources/META-INF/gradle-plugins目录下。

与此同时,我们双击执行android studio右侧的uploadArchivestask, 如下:

image.png

便会生成一个本地仓库,将打好的jar包放到这个目录下。

image.png

使用插件

在我们的应用的build.gradle文件中,我们需要引入这个插件:

  1. 设置依赖库
buildscript {
    repositories {
        google()
        jcenter()
        //自定义插件maven地址
        maven { url '../asm_plugin_repo' }
    }
    dependencies {
        //加载自定义插件 group + module + version
        classpath 'com.fred.asm.plugin:asm-tool:1.0.0'
    }
}
  1. 添加插件 apply plugin: 'performance.methodcost'

还记得我们上面插件开发的时候有src/main/resources/META-INF/gradle-plugins目录下有一个performance.methodstat.properties文件不,这里的 apply plugin: {pluginId}, {pluginId}便是和上面的performance.methodstat.properties文件相对应。

3.当我们编译应用时如执行assembleDebug, 可以看到控制台会打印出plugin execute

image.png

再来用java写一次

我们知道Groovy也是JVM类的语言,它能做的事,java也可以,我们来用java写一次。还是一样:

  1. 新建一个Android library类型的module, 删掉src目录下的androidTesttest目录。
  2. src/main/java目录下,新建一个包com.fred.asm, 注意这是java的包结构,对应到物理目录便是src/main/java/com/fred/asm
  3. src/main/java/com/fred/asm下新建一个java类MethodStatPlugin.java和上面用groovy写时是一样的命名,这样我们的src/main/resources/META-INF/gradle-plugins下的配置,还有pluginId都可以保持一致。
  4. MethodStatPlugin.java中写入如下代码:
public class MethodStatPlugin implements Plugin<Project> {
    @Override
    public void apply(Project target) {
        System.out.println("plugin execute [write by java]");
    }
}
  1. 同样用uploadArchives编译, 打包,上传插件到本地仓库
  2. 再重新编译一下使用插件的模块,可以看到控制台输出了plugin execute [write by java], 插件应用成功

image.png

采用buildSrc简化开发

先来了解一下什么是buildSrc?当我们需要写一些插件的时候,可以在Android Studio中创建一个buildSrc的module, 一个android工程中该module只能有一个。

  • Gradle在编译某个module时,会先编译buildSrc这个项目, 并配置到classpath下
  • 如果buildSrc是一个插件项目,Gradle默认会自动配置该Gradle插件,在项目中直接apply开发的插件即可。

开发步骤

  1. 用Android studio新建一个java类型的module, 并命名为buildSrc(名字必须得是这个)
  2. 修改build.gradle添加相关的依赖,如下:
apply plugin: 'java-library'

repositories {
    maven { url 'https://jitpack.io' }

    maven {
        url 'http://maven.aliyun.com/nexus/content/groups/public/'
    }
    google()
    jcenter()
}

dependencies {
    //添加gradle版本
    implementation 'com.android.tools.build:gradle:3.4.2'
    //添加gradle对应api
    implementation gradleApi()
}
  1. 编写插件
public class MyPlugin implements Plugin<Project> {
    @Override
    public void apply(Project target) {
        System.out.println("[App Log]-------------->MyPlugin" );
    }
}
  1. 插件的配置

image.png

  1. 在需要使用插件的位子添加的引用
apply plugin: 'com.fred.plugin'

至此gradle插件的开发已介绍完毕,后续便是需要熟悉相关的api,根据自己的项目需要,做相关的业务开发。

参考