plugin是什么文件可以删吗(一个简简单单的Plugin入门)

时间:2024-08-09 14:45:57

前言

有段日子没写文章了,最近不算很忙,所以搞了搞关于Gradle中Plugin相关的内容。 全文主要是以下的内容:

  • Plugin相关的流程
  • 简单的写/调试一个Plugin

正文

一、如何理解Gradle

Gradle在AndroidStudio时代,作为官方主推的构建工具。我们日常的依赖,打包,编译等等工作都依赖Gradle,而这其中的每一项工作都依赖Task这个概念。

一个Gradle的构建会分为三个阶段:

初始化阶段:

这个阶段做的事情是,根据项目中的buid.gradle文件,转化成对应的Project类。而我们gradle中写的内容,也都Project类中的一些方法或者变量。

配置阶段:

这个阶段是基于上个阶段的延续,此阶段会执行build.gradle,而这过程中是要将需要执行的内容转成Task。

执行阶段:

此过程则是将前一个过程生成出来的Task进行执行。

二、简单写一个Plugin

Plugin的写法有很多,比如:maven依赖、源码直接依赖。今天咱们就以源码的形式来写一个Plugin。

源码Plugin

1.1、buildSrc

首先我们需要了解一个特殊的模块:buildSrc。如果我们的根目录上有这么一个buildSrc子模块,那么Gradle会将其定位插件工程,按插件工程的模式去执行文件。

在当前工程下创建一个 Java Library 的 module,起名字为 buildSrc。

这里很多文章会说:将 main/src/java 修改为 main/src/groovy。其实这个没有必要的,现在Plugin对语言的支持比较的宽。Kotlin也是可以的,因此今天的Plugin咱们就是用Kotlin去写。

1.2、build.gradle

想要使用Kotlin,gradle少不了配置。我这里直接贴上我的配置:

apply plugin: 'groovy'apply plugin: 'java'apply plugin: 'maven'apply plugin: 'kotlin'sourceCompatibility = "1.8"targetCompatibility = "1.8"buildscript {    ext.kotlin_version = '1.3.21'    repositories {        google()        jcenter()        mavenCentral()        maven { url 'https://maven.google.com' }    }    dependencies {        classpath 'com.android.tools.build:gradle:3.0.1'        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"    }}allprojects {    repositories {        google()        jcenter()        mavenCentral()        maven { url 'https://maven.google.com' }    }}dependencies {    implementation gradleApi()    implementation localGroovy()}

当然,这里如果你不需要groovy的支持,也可以自行删除。

1.3、自定义Plugin

这里咱们定一个读取文件的Plugin(简单模拟一下日常中读取配置文件的流程)。

先简单搞个demo的文件:

json内容很简答,随便写写。

{  "object": [    {      "name": "Haha-1",      "age": 1,      "title": "~~~~~"    },    {      "name": "Haha-2",      "age": 2,      "title": "~~~~~"    }  ]}

接下来就是咱们的Plugin了,我们只需要继承 Plugin<Project>,然后实现 apply():

class TestObject {    @SerializedName("object")    val objects: List<TestBean>? = null}data class TestBean(    @SerializedName("name")    val name: String? = null,    @SerializedName("age")    val age: Int = 0,    @SerializedName("title")    val title: String? = null)class ToolsPlugin : Plugin<Project> {    override fun apply(target: Project) {        target.tasks.create("printJson"){            val jsonStr = File("test/Test.json").readText()            val testObject = Gson().fromJson(jsonStr, TestObject::class.java)            testObject.objects?.forEach {                println("${it.name}--->${it.age}--->${it.title}")            }        }    }}

编写完了Plugin,接下来就是让它能够运行起来。

1.4、Plugin引导

我们需要设置一个properties文件,为我们的Plugin做一个“引导”。

留意这个toolsplugin.properties文件,这个文件名toolsplugin使我们的插件名字,记住它以后会用到。我们的toolsplugin.properties文件内容也很简单,就是指明Plugin的地址:

implementation-class=com.mdove.plugin.tools.ToolsPlugin

1.5、应用

走到这一步,一个Plugin就算ok了。接下来我们只需要应用即可,比如在我们的app模块的build.gradle:

apply plugin: 'toolsplugin'

运行起来是这样的:

1.6、Debug插件

因为Plugin是在编译器进行的,因此“传统”的Debug方式没办法断点Plugin。想要断点Plugin需要先添加一个Remote:

配置内容:

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005

接下我们需要在运行Task的时候加一些参数:

./gradlew app:printJson -Dorg.gradle.debug=true。

尾声

到此一个简单的Plugin就接近尾声了。Plugin本身没有什么神秘的,说白了就是Android在Gradle上的基础上对外暴露的一些能力...如何理解、如何应用才是Plugin最有力量的内容~

有兴趣的同学可以继续深入其他框架,通过其他框架的源码来理解Plugin。