为 Android 创建的第一个自定义 Gradle 插件 :基本设置

文章目录[x]
  1. 0.1:创建新的Android项目
  2. 0.2:创建buildSrc目录
  3. 0.3:创建build.gradle文件
  4. 0.4:编写插件
  5. 0.5:注册插件
  6. 0.6:应用插件并运行

创建新的Android项目

创建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) {

}
}

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'

接下来只需要点击任务就可以在应用模块下生成文件:

 

 

点赞

发表评论

昵称和uid可以选填一个,填邮箱必填(留言回复后将会发邮件给你)
tips:输入uid可以快速获得你的昵称和头像

Title - Artist
0:00