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'
implementation 'com.squareup:javapoet:1.10.0'
}
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,比如GRouterCompileDebug
和GRouterCompileRelease
。由于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'
}
}
}
网友评论