背景

想写一个Gradle Transform Api,真的是怎么建一个Gradle插件,网上一水的水文,写的不明不白。代码都不全,还是得靠自己摸索。因此,在这里整理总结一下为大家提供出来。

如何创建Gradle插件工程

基于com.android.tools.build:gradle:3.4.0,下面分为几步,介绍如何配置Gradle插件开发工程。
按照以下几步即可。

新建Android项目

这个不多说了,Android Studio中新建一个Android项目。

新建Gradle插件Module

这个也不多说,新建一个Android Module。

删除不要的文件

打开module,除了build.gradle、.gitignore、*.iml都可以删掉

开发目录配置

在module目录下进行以下操作:

  1. 新建src/main/groovy目录,用于编写代码,与Android项目类似,只是java变成了groovy
  2. 新建src/main/resoureces/META-INF/gradle-plugins目录,用于存放插件入库和名字配置
  3. 在build.gradle中添加以下内容:
apply plugin: 'groovy'
apply plugin: 'maven'
dependencies {
    //gradle sdk
    compile gradleApi()
    //groovy sdk
    compile localGroovy()

    //添加依赖,于Android一样
    compile "com.android.tools.build:gradle:3.4.0"
    compile "com.android.tools.build:transform-api:1.5.0"
    compile "javassist:javassist:3.12.1.GA"
    compile "commons-io:commons-io:2.5"
}
repositories {
    mavenCentral()
}
//以上都为固定写法
//打包到本地或者远程Maven库
uploadArchives {
    repositories {
        mavenDeployer {
            pom.groupId = 'com.xxx.plugin.gradle'   //groupId
            pom.artifactId = 'xxx'  //artifactId
            pom.version = '1.0.2' //版本号
            //提交到远程服务器:
            // repository(url: "http://www.xxx.com/repos") {
            //    authentication(userName: "admin", password: "admin")
            // }
            //本地的Maven地址设置为
            repository(url: uri('/Users/lhxia/Downloads'))

        }
    }
}
  1. 在src/main/groovy目录下右键【New->Package】创建包名:com.xxx.plugin
  2. 在com.xxx.plugin包下创建插件入口文件:
package com.xxx.plugin
import org.gradle.api.Plugin
import org.gradle.api.Project
class MyPlugin implements Plugin<Project> {
    void apply(Project project) {//当插件apply时调用
        System.out.println("自定义插件!") //输出一句话
    }
}
  1. 在src/main/resoureces/META-INF/gradle-plugins目录下创建plugin_name.properties文件:,添加以下内容:
implementation-class=com.xxx.plugin.MyPlugin  #配置前面的插件入口类
  1. sync一下,开发环境就配置好了,我们可以看到Android Studio已经识别出目录了。

插件发布

插件发布就简单了。前面在build.gradle中配置了上传maven的信息,直接执行upload即可。

androidstudio 调试gradle插件 android gradle 插件开发_kotlin

插件接入

当插件发布完成后就是接入了。与其他插件一样,按照以下步奏配置:

  1. 在项目最外面的build.gradle中添加classpath:
  2. androidstudio 调试gradle插件 android gradle 插件开发_kotlin_02


  3. 在需要插件的module的build.gradle里添加apply插件(plugin_name就是前面的properties文件名字):
  4. androidstudio 调试gradle插件 android gradle 插件开发_kotlin_03


  5. 随便执行一个task就可以看到控制台的插件输出了
  6. androidstudio 调试gradle插件 android gradle 插件开发_插件_04


如何使用kotlin编写插件呢?

其实kotlin写起来也挺简便,有些同学groovy不熟,因此用kotlin也能编写插件,这个配置也简单:

  1. src/main/groovy目录改成src/main/kotlin,然后在kotlin目录下边写kotlin代码。
  2. 修改插件module的build.gradle文件(我们可以看到对比前面的文件只是去掉了groovy,添加了kotlin的相关配置):
ext {
    kotlin_version = '1.3.40'
}
//apply plugin: 'groovy'
apply plugin: 'maven'
apply plugin: "kotlin"

sourceCompatibility = 1.8

dependencies {
    //gradle sdk
    compile gradleApi()
    //groovy sdk
//    compile localGroovy()
    //添加依赖,于Android一样
    compile "com.android.tools.build:gradle:3.4.0"
    compile "com.android.tools.build:transform-api:1.5.0"
    compile "javassist:javassist:3.12.1.GA"
    compile "commons-io:commons-io:2.5"
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.40"
}
compileKotlin {
    kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
    kotlinOptions.jvmTarget = "1.8"
}
repositories {
    mavenCentral()
}
//以上都为固定写法
//打包到本地或者远程Maven库
uploadArchives {
    repositories {
        mavenDeployer {
            pom.groupId = 'com.xxx.plugin.gradle'
            pom.artifactId = 'xxx'
            pom.version = '1.0.4'
            //提交到远程服务器:
            // repository(url: "http://www.xxx.com/repos") {
            //    authentication(userName: "admin", password: "admin")
            // }
            //本地的Maven地址设置为E:/Maven
            repository(url: uri('/Users/lhxia/Downloads'))
        }
    }
}
如何调试插件

打断点

打断点不说了。和java一样,点一下就行

执行编译

在命令行中执行APP的编译命令:

./gradlew assembleDebug -Dorg.gradle.daemon=false -Dorg.gradle.debug=true

后面两个参数是必须的,表示等待gradle调试。这个时候会卡在这:

androidstudio 调试gradle插件 android gradle 插件开发_插件_05


表示等待调试。

配置remote

  1. 创建新的运行配置
  2. androidstudio 调试gradle插件 android gradle 插件开发_android_06


  3. 创建remote类型的配置,本地调试默认配置即可直接点确定,如果远程调试请输入Host:
  4. androidstudio 调试gradle插件 android gradle 插件开发_kotlin_07


  5. 对remote点击调试按钮:
  6. androidstudio 调试gradle插件 android gradle 插件开发_插件_08

  7. 就会看见命令行往下走了。随后就会收到断点:
  8. androidstudio 调试gradle插件 android gradle 插件开发_groovy_09


总结

其实过程很简单,一步一步即可完成插件的配置及调试,后面就可以开发属于自己的插件了。