一个简简单单的Plugin入门

前言

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

  • Plugin相关的流程

  • 简单的写/调试一个Plugin

文末依然献上今日份的沙雕gif

正文

一、如何理解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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值