当前位置: 首页 > news >正文

一个简简单单的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。

相关文章:

  • 给大家分享一下阿里三面的面试真题
  • WebRTC Android 开发学习环境搭建~
  • Android 11 最终 Beta 版发布,正式版即将到来!
  • NDK中使用 MediaCodec 编解码视频
  • 【资源分享】免费学 清华大学 · 游戏程序设计公开课啦!!!
  • 谈一谈Android上的SurfaceTexture
  • 你还不知道 OpenGL ES 和 EGL 的关系?
  • 腾讯云视频云巅峰论剑——王者对决,等你来评!
  • 高大上的非线性编辑是怎么一回事?
  • C++ 万字长文第二篇---拿下字节面试
  • Android自定义View-SVG动画
  • 谈一谈Flutter外接纹理
  • Android 11 强制用户使用系统相机?
  • 3A之自动白平衡(AWB)篇
  • Shader基础技巧整理
  • [译]Python中的类属性与实例属性的区别
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • 【知识碎片】第三方登录弹窗效果
  • ES学习笔记(12)--Symbol
  • Laravel核心解读--Facades
  • node-glob通配符
  • Python_OOP
  • SegmentFault 2015 Top Rank
  • Selenium实战教程系列(二)---元素定位
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 技术:超级实用的电脑小技巧
  • 判断客户端类型,Android,iOS,PC
  • 实现菜单下拉伸展折叠效果demo
  • 微信小程序开发问题汇总
  • ​Java并发新构件之Exchanger
  • (4)(4.6) Triducer
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • .NET Core 中插件式开发实现
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .NET程序员迈向卓越的必由之路
  • .NET轻量级ORM组件Dapper葵花宝典
  • .NET上SQLite的连接
  • .net实现头像缩放截取功能 -----转载自accp教程网
  • .NET下的多线程编程—1-线程机制概述
  • []AT 指令 收发短信和GPRS上网 SIM508/548
  • [28期] lamp兄弟连28期学员手册,请大家务必看一下
  • [android学习笔记]学习jni编程
  • [Angular] 笔记 6:ngStyle
  • [AutoSar]工程中的cpuload陷阱(三)测试
  • [C++] 如何使用Visual Studio 2022 + QT6创建桌面应用
  • [C++]打开新世界的大门之C++入门
  • [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated c
  • [HCIE] IPSec-VPN (手工模式)
  • [HNOI2008]玩具装箱toy
  • [Latex学习笔记]数学公式基本命令