流程来自https://docs.gradle.org/current/userguide/custom_plugins.html
前置条件:Gradle7
要创建 Gradle 插件,需要编写一个实现 Plugin 接口的类。当插件应用于项目时,Gradle 会创建插件类的实例并调用实例的 Plugin.apply() 方法。创建的对象作为参数传递传递到gradle,插件可以根据需要使用它来配置项目。以下示例向项目添加了一个 hello 任务。

build.gradle
class GreetingPlugin implements Plugin<Project> {void apply(Project project) {project.task('hello') {doLast {println 'Hello from the GreetingPlugin'}}}
}
// Apply the plugin
apply plugin: GreetingPlugin


输入gradle -q hello查看运行结果:
Hello from the GreetingPlugin
需要注意的一点是,一个Plugin的新实例是为每个应用它的项目创建的。另外,Plugin类是泛型类型,此示例将 Project 类型作为类型参数接收。插件可以改为接收 Settings 类型的参数,在这种情况下,插件可以在setting.gradle中应用,或者 Gradle 类型的参数,在这种情况下,插件可以在初始化脚本中应用

可配置插件

大多数插件为构建脚本和其他插件提供了一些配置选项,用于自定义插件的工作方式。插件使用扩展对象来做到这一点。 Gradle 项目有一个关联的 ExtensionContainer 对象,其中包含已应用于项目的插件的所有设置和属性。您可以通过向此容器添加扩展对象来为您的插件提供配置。扩展对象只是具有代表配置的 Java Bean 属性的对象。 让我们在项目中添加一个简单的扩展对象。在这里,我们向项目添加了一个问候扩展对象,它允许您配置问候语。

abstract class GreetingPluginExtension {abstract Property<String> getMessage()GreetingPluginExtension() {message.convention('Hello from GreetingPlugin')}
}class GreetingPlugin implements Plugin<Project> {void apply(Project project) {// Add the 'greeting' extension objectdef extension = project.extensions.create('greeting', GreetingPluginExtension)// Add a task that uses configuration from the extension objectproject.task('hello') {doLast {println extension.message.get()}}}
}apply plugin: GreetingPlugin// Configure the extension
greeting.message = 'Hi from Gradle'

在这个例子种,GreetingPluginExtension拥有一个叫做message的变量,插件通过他的名字greeting添加到project中。然后,此对象可用作与扩展对象同名的项目属性。通常,您需要在单个插件上指定多个相关属性。 Gradle 为每个扩展对象添加了一个配置块,因此您可以将设置组合在一起。以下示例向您展示了它是如何工作的。

interface GreetingPluginExtension {Property<String> getMessage()Property<String> getGreeter()
}class GreetingPlugin implements Plugin<Project> {void apply(Project project) {def extension = project.extensions.create('greeting', GreetingPluginExtension)project.task('hello') {doLast {println "${extension.message.get()} from ${extension.greeter.get()}"}}}
}apply plugin: GreetingPlugin// Configure the extension using a DSL block
greeting {message = 'Hi'greeter = 'Gradle'
}

在这个例子中,几个设置可以在问候闭包中组合在一起。构建脚本(问候语)中的闭包块的名称需要与扩展对象名称相匹配。然后,当闭包执行时,扩展对象上的字段将根据标准的 Groovy 闭包委托特性映射到闭包内的变量。 这样,使用扩展对象扩展 Gradle DSL 来为插件添加项目属性和 DSL 块。由于扩展对象只是一个常规对象,因此您可以通过向扩展对象添加属性和方法来提供嵌套在插件块内的自己的 DSL

开发项目扩展

You can find out more about implementing project extensions in Developing Custom Gradle Types.
Working with files in custom tasks and plugins
在开发自定义任务和插件的时候,推荐使用文件作为配置项。你可以使用Gradle的托管属性和project.layout去选择文件或者文件夹。通过这种方式,只有在真正使用这个文件的时候才会访问定义的路径,所以可以在任何时候配置文件。

abstract class GreetingToFileTask extends DefaultTask {@OutputFileabstract RegularFileProperty getDestination()@TaskActiondef greet() {def file = getDestination().get().asFilefile.parentFile.mkdirs()file.write 'Hello!'}
}def greetingFile = objects.fileProperty()tasks.register('greet', GreetingToFileTask) {destination = greetingFile
}tasks.register('sayGreeting') {dependsOn greetdoLast {def file = greetingFile.get().asFileprintln "${file.text} (file: ${file.name})"}
}greetingFile.set(layout.buildDirectory.file('hello.txt'))

在这个例子中,我们将 greet 任务destination配置为一个闭包/提供者,使用 Project.file(java.lang.Object) 方法来赋值,最后将闭包/提供者的返回值转换为 File 对象。您会注意到,在上面的示例中,我们在配置为将它用于任务之后指定了 greetingFile 属性值。这种惰性求值的主要好处是在设置文件属性时接受任何值,然后在读取属性时解析该值。
将扩展属性映射到任务属性
通过扩展从构建脚本中捕获用户输入并将其映射到自定义任务的输入/输出属性是一种有用的模式。构建脚本作者仅与扩展定义的 DSL 交互。命令式逻辑隐藏在插件实现中。

AndroidStudio Plugin插件开发相关推荐

  1. Qt Plugin插件开发指南(1)- 一般开发流程

    Qt Plugin插件开发指南(1)- 一般开发流程 Date Author Version Note 2020.02.17 Dog Tao V1.0 整理后发表. 2020.12.10 Dog Ta ...

  2. android studio 自动生成sql语句,Android Studio Plugin 插件开发教程(三) —— 制作一个自动生成数据库代码的插件...

    项目源码 系列教程 插件介绍 本篇实战撸个自动生成安卓Sqlite数据库代码的插件,先演示下最终效果 db文件夹下的都是插件自动生成的,而MainActivity里面的代码是我提前写好的,用于实验插件 ...

  3. android sdk插件开发教程,Android Studio Plugin 插件开发教程(二) —— 插件SDK中的常用对象介绍...

    项目源码 系列教程 先树立一个概念,AS里项目的一切都可以视为对象,比如整个项目,项目里的每个文件,文件里的每个方法.每行语句等等都是一个对象.我们插件SDK的开发,主要工作就是针对这一个个的对象的分 ...

  4. Android Studio 插件开发详解一:入门练手

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/78112003 本文出自[赵彦军的博客] 系列目录 Android Gradle使用 ...

  5. github android

    作者:ruijun 链接:https://www.zhihu.com/question/37160415/answer/79569042 来源:知乎 著作权归作者所有,转载请联系作者获得授权.###开 ...

  6. gstreamer应用笔记

    gstreamer官网 https://gstreamer.freedesktop.org/ 应用手册 https://gstreamer.freedesktop.org/documentation/ ...

  7. Flutter学习笔记学习资料推荐,手机端开发工具

    打开该目录下的flutter.gradle文件修改如下内容: buildscript { repositories { //google() //jcenter() maven { url 'http ...

  8. Flutter学习笔记学习资料推荐

    对Flutter的学习已经有一段时间了,这里做一下总结记录,东西比较多,可能主要是一些学习资料的记录,还有一些杂七杂八的学习笔记. 文章目录 Flutter 初体验 Flutter 环境配置 Flut ...

  9. [Android Pro] AndroidStudio IDE界面插件开发(进阶篇之Action机制)

    转载请注明出处:[huachao1001的专栏:http://blog.csdn.net/huachao1001/article/details/53883500] 从上一篇<AndroidSt ...

最新文章

  1. 修改html时webpack热更新,webpack学习之路(二)webpack-dev-server实现热更新
  2. Grafana4.2安装
  3. CSM+3PAR帮助XXX教育技术中心
  4. C#:多线程使用TextBox控件
  5. 为什么有如此多的C++测试框架 - from Google Testing Blog
  6. javascript中alert函数的替代方案,一个自定义的对话框的方法(引用)
  7. Excel计数(count)可视化
  8. kaggle实战_3模型分析与模型融合
  9. ASP.NET MVC程序播放H.264视频
  10. 如何在eclipse中添加android ADT
  11. Github windows客户端简单上手教程
  12. 想请问下PDF双面打印时(打印机自动双面打印)为什么反面那页的内容是倒过来的,应该怎么设置?...
  13. 面试题(两个栈实现一个队列和两个队列实现一个栈)
  14. 美国少年14岁造出核反应堆
  15. 【轻量型卷积网络】ResNeXt网络解析
  16. 渗透测试的目标、思路
  17. 7-1 九宫格密码 (100 分)
  18. 制作黑苹果安装U盘(Clover+OC+PE)三引导
  19. SUSCTF2022misc——Tanner
  20. 5000字干货,10分钟进阶超级用户运营

热门文章

  1. 5454. 统计全 1 子矩形(Leetcode 196周赛)
  2. php判断股票涨停,情绪周期的简单判断与选股(图解)
  3. games java mtech_JEIL MTECH打号机打码机
  4. Can't clobber writable file **************
  5. what Data Fabric
  6. Windows server 2012 服务器挂载NAS盘
  7. QT 图片浏览器(一)
  8. Google Earth Engine(GEE)——
  9. std::tuple、std::tie(可用于结构体大小比较)、std::pair用法
  10. ACCESS MDB数据库“对象的必要权限。请让管理员或安装此对象的人为你设置适当的权限”解决办法