Gradle 插件开发教程

·  阅读 2326

Gradle是非常强大的项目自动化构建开源工具,Gradle 插件是基于Groovy语言开发,本文将会介绍如何开发Gradle插件。

创建Groovy项目

创建一个普通的Java项目,然后修改build.gradle

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

sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8

dependencies {
    compile gradleApi()
    compile localGroovy()
    implementation  'com.android.tools.build:gradle:2.3.3'
    implementation  'org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.31'
}
repositories {
    jcenter()
    google()
    mavenCentral()
}
group = 'com.grouter'
version = '1.0.0'

// 发布到本地仓库
uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: uri('../repo'))
        }
    }
}
复制代码

编写Groovy代码 router-gradle/src/main/groovy/grouter/GRouterPlugin.groovy

// GRouterPlugin.groovy
package grouter

import org.gradle.api.Plugin
import org.gradle.api.Project
class GRouterPlugin implements Plugin<Project> {
    @Override
    void apply(Project project) {
        project.tasks.create("GRouterCompile").doLast {
            // do something
        }
    }
}
复制代码

编写 GRouter.properties 文件 router-gradle/src/main/resources/META-INF/gradle-plugins/GRouter.properties

implementation-class=grouter.GRouterPlugin
复制代码
发布到本地

执行uploadArchives命令,发布当前Module到本地

引入插件

在Android项目中引入本地仓库,添加插件

buildscript {
    repositories {
        jcenter()
        maven {
            url uri('../repo')
        }
    }
    dependencies {
        classpath 'com.grouter:router-gradle:1.0.0'
    }
}
apply plugin: 'com.android.application'
apply plugin: 'GRouter'
复制代码

查看Gradle面板,就可以看到生成了一个GRouterCompile Task

Task

Variants

Android开发中至少会有两种模式,Debug和Release,我们在Android开发中创建Task基本都会为每一种模式创建一个Task,比如GRouterCompileDebugGRouterCompileRelease。由于Android的Module有application和library区分,Variants也不一样。

package router
import com.android.build.gradle.AppPlugin
import com.android.build.gradle.LibraryPlugin
import org.gradle.api.Plugin
import org.gradle.api.Project

class GRouterPlugin implements Plugin<Project> {
    @Override
    void apply(Project project) {
        def hasApp = project.plugins.withType(AppPlugin)
        def hasLib = project.plugins.withType(LibraryPlugin)
        if (!hasApp && !hasLib) {
            throw new IllegalStateException("'android' or 'android-library' plugin required.")
        }
        final def variants
        if (hasApp) {
            variants = project.android.applicationVariants
        } else {
            variants = project.android.libraryVariants
        }
        variants.all { variant ->
            String variantName = variant.name.capitalize() // Debug、Release
            println("variantName $variantName")
        }
    }
}
复制代码
创建Task
variants.all { variant ->
    String variantName = variant.name.capitalize() // Debug、Release
    def task = project.tasks.create("GRouterCompile" + variantName).doLast {
        println("执行任务")
    }
    // 设置分组
    task.setGroup("GRouter")
    // 设置依赖,先执行完generateDebugSources后再执行当前任务
    task.dependsOn project.tasks["generate${variantName}Sources"]
}
复制代码
dependsOn
variants.all { variant ->
    String variantName = variant.name.capitalize() // Debug、Release
    def task = project.tasks.create("UploadApk" + variantName).doLast {
        File apkFile = variant.outputs[0].outputFile
        // do something
    }
    // 设置依赖,先执行完assembleRelease
    task.dependsOn project.tasks["assemble${variantName}"]
}
复制代码
自动化执行

有时候我们需要创建自动化任务,而不是手动执行命令,比如每次打包正式版本之后就自动上传apk到云盘备份。

variants.all { variant ->
    String variantName = variant.name.capitalize() // Debug、Release
    if (variantName.contains("Release")) {
        project.tasks["assemble${variantName}"].doLast {
            File apkFile = variant.outputs[0].outputFile
            // do something
        }
    }
}
复制代码
Group 分组

设置分组,方便查找Task。

task.setGroup("grouter")
复制代码

project.dependencies

可以通过插件方式为我们的目标Module增加依赖

class GRouterPlugin implements Plugin<Project> {
    @Override
    void apply(Project project) {
        project.dependencies {
            implementation 'com.alibaba:fastjson:1.1.45.android'
        }
    }
}
复制代码
分类:
Android
标签:
分类:
Android
标签: