- 0.1:创建新的Android项目
- 0.2:创建buildSrc目录
- 0.3:创建build.gradle文件
- 0.4:编写插件
- 0.5:注册插件
- 0.6:应用插件并运行
几年前引入 Gradle 作为 Android 的首选构建工具为 Android 开发人员提供了很多可能性,使他们的构建脚本更加高效和强大。Gradle 是一个灵活、强大的工具,如果使用得当,它可以通过自动化开发人员每天需要处理的许多其他重复性手动任务来极大地提高生产力。
什么是插件:Gradle 插件打包了可重用的构建逻辑片段,可以在许多不同的项目和构建中使用。Gradle 允许实现自己的插件,因此可以重用您的构建逻辑,并与他人共享。
创建新的Android项目
首先创建新的Android项目,项目的主要模块将是一个包含一个Activity的应用程序。
创建buildSrc目录
接下来将切换到项目视图并在项目中创建一个新目录,名为buildSrc
此处的命名很重要,因为 Gradle 现在会将我们的目录识别为自定义脚本的来源,并将在其中设置所需的管道。接下来单击build -> Rebuild project。完成后,会发现 `buildSrc` 目录已经额外生成的子目录:
创建build.gradle文件
接下来需要在buildSrc下创建文件build.gradle:
apply plugin: 'java-gradle-plugin' // 允许我们创建和配置自定义插件
apply plugin: 'kotlin' // 需要,因为我们将用Kotlin中编写我们的插件
buildscript {
ext.kotlin_version = "1.5.10"
ext.gradle_version = '4.2.2'
repositories {
google()
jcenter()
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "com.android.tools.build:gradle:$gradle_version"
}
}
repositories {
google()
jcenter()
}
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
// Android gradle plugin will allow us to access Android specific features
implementation "com.android.tools.build:gradle:$gradle_version"
}
在snyc后,buildSrc将包含到项目中:
完成此操作后,需要创建基本目录结构来编写插件代码。这是src.main.java
大多数 Android 项目中常见的。只需添加目录,Android Studio 就会自动将它们标记为源文件夹。
编写插件
在java目录创建对应包后,创建一个类FirstPlugin来扩展org.gradle.api.Plugin
接口。这个接口有一个apply
方法,我们可以在里面编写插件逻辑:
package com.melrose.plugin
import org.gradle.api.Plugin
import org.gradle.api.Project
import java.io.File
import java.text.SimpleDateFormat
import java.util.*
/**
* @author Melrose
* @since 1.0.0.0
*/
class FirstPlugin : Plugin<Project> {
override fun apply(project: Project) {
}
}
由于要访问 Project 对象,将它指定为插件的参数,以便 Gradle 将在apply
方法中提供它。但在操作之前,首先需要确保实际上是在处理一个 Android 项目。以下 2 个扩展将为做到这一点,同时允许访问项目变体:
package com.melrose.plugin</p>
import com.android.build.api.dsl.TestExtension
import com.android.build.gradle.*
import com.android.build.gradle.api.BaseVariant
import org.gradle.api.DomainObjectSet
import org.gradle.api.GradleException
import org.gradle.api.Project
/**
* @author Melrose
* @since 1.0.0.0
*/
/**
* 找到安卓项目的基本扩展
*/
@Throws(GradleException::class)
fun Project.android(): BaseExtension {
val android = project.extensions.findByType(BaseExtension::class.java)
if (android != null) {
return android
} else {
throw GradleException("Project $name is not an Android project")
}
}
/**
* 找到对应渠道
*/
fun BaseExtension.variants(): DomainObjectSet<out BaseVariant> {
return when (this) {
is AppExtension -> {
applicationVariants
}
is LibraryExtension -> {
libraryVariants
}
else -> throw GradleException("Unsupported BaseExtension type!")
}
}
接下来,开始构建任务。这将是一个很简单的任务,将文件添加到应用程序的根目录:
package com.melrose.plugin</p>
import org.gradle.api.Plugin
import org.gradle.api.Project
import java.io.File
import java.text.SimpleDateFormat
import java.util.*
/**
* @author Melrose
* @since 1.0.0.0
*/
class FirstPlugin : Plugin<Project> {
override fun apply(project: Project) {
project.android().variants().all { variant ->
// 为构建类型和产品渠道的每种组合制定一项任务
val myTask = "myFirstTask${variant.name.capitalize()}"
// 创建任务并指定它的任务组
project.tasks.create(myTask){
task ->
// 将所有插件的任务组合在一起
task.group = "MyPluginTasks"
task.doLast {
File("${project.projectDir.path}/myFirstGeneratedFile.txt").apply {
writeText("Hello Gradle!\nPrinted at: ${SimpleDateFormat("HH:mm:ss").format(
Date()
)}")
}
}
}
}
}
}
注册插件
在编写完后就需要注册插件,在buildSrc目录下的build.gradle下面添加如下代码库注册插件:
gradlePlugin {
plugins {
create("MyFirstPlugin") {
id = "MyFirstPlugin"
implementationClass = "com.melrose.plugin.FirstPlugin"
}
}
}
应用插件并运行
在应用程序模块build.gradle添加插件:
apply plugin: 'MyFirstPlugin'
接下来只需要点击任务就可以在应用模块下生成文件: