前言
有段日子没写文章了,最近不算很忙,所以搞了搞关于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。