Android Gradle 开发与应用 (六) : 创建buildSrc插件和使用命令行创建Gradle插件

1. 前言

前文中,我们介绍了在Android中,如何基于Gradle 8.2,创建Gradle插件。这篇文章,我们以buildSrc的方式来创建Gradle插件。此外,还介绍一种用Cmd命令行的方式,来创建独立的Gradle插件的方式。

1.1 本文环境

  • Android Studio 版本 : Android Studio Iguana | 2023.2.1
  • Gralde版本 : gradle 8.4

2. buildSrc插件

buildSrc是一个特殊的源代码集,通常用于存放项目内部使用的自定义Gradle插件和任务。它的主要优势在于它会自动被Gradle识别并编译,然后Android Studio自动会将其添加到构建脚本的classpath中,因此无需手动添加或配置。这使得在项目的多个模块之间共享构建逻辑变得非常方便。此外,由于buildSrc是项目的一部分,因此它可以直接访问和使用项目中的其他代码和资源。

2.1 buildSrc插件和独立Gradle插件的区别

相比之下,单独的Gradle插件通常作为独立的项目来开发,并通过二进制形式(如jar包)发布到仓库中,供其他项目使用。这种插件通常具有更广泛的适用性,因为它们设计用于多个项目之间的复用。然而,开发这种插件需要更多的配置和发布步骤,并且它们不会直接访问到使用它们的项目的内部代码和资源。

2.2 新建buildSrc目录

在项目的根目录下,新建buildSrc文件夹,并添加如下的项目结构

在这里插入图片描述

buildSrc目录下的build.gradle中写下如下的内容

plugins {id 'java-gradle-plugin'
}gradlePlugin {plugins {greeting {id = 'com.heiko.buildsrc.plugin' //这里是插件的IDimplementationClass = 'com.heiko.buildsrc.MyPlugin' //这里是包名+类名}}
}

这里需要注意
Pluginjava语言编写,那么包名的上一级为java文件夹,pluginjava-gradle-plugin

plugins {id 'java-gradle-plugin'
}

Plugingroovy语言编写,那么包名的上一级为groovy文件夹plugingroovy

plugins {id 'groovy'
}

Pluginkotlin语言编写,那么包名的上一级为kotlin文件夹,pluginorg.gradle.kotlin.kotlin-dsl

plugins {id("org.gradle.kotlin.kotlin-dsl") version "4.1.2"
}使用 kotlin-dsl 插件的时候,需要mavenCentral仓库
repositories {mavenCentral()
}

2.3 依赖插件

我们Sync下项目,Android Studio自动会将其添加到构建脚本的classpath中。
接着我们只需要在appbuild.gradle中,去应用这个插件就可以使用了。

plugins {//省略了其他插件...//应用我们自定义的com.heiko.buildsrc.plugin插件id("com.heiko.buildsrc.plugin") apply true
}

2.4 查看日志

再次Sync下项目,可以看到如下日志,就表明我们配置buildSrc插件成功了 !

//...省略了其他日志 ...
> Configure project :app
这是我的第一个Gradle插件:MyPlugin.apply!> Task :prepareKotlinBuildScriptModel UP-TO-DATE
greeting config//...省略了其他日志 ...BUILD SUCCESSFUL in 14s
4 actionable tasks: 2 executed, 2 up-to-date

3.使用build.gradle.kts来新建buildSrc插件

使用build.gradle.kts和使用build.gradle基本是一样的,只需要将build.gradle修改为build.gradle.kts,然后将里面的代码从Groovy修改为Kotlin即可

plugins {//Plugin用Java语言编写时需添加`java-gradle-plugin` //等同于 id("java-gradle-plugin") apply true//Plugin用Groovy语言编写时需添加`groovy` //等同于 id("groovy") apply true//Plugin用Kotlin语言编写时需添加`kotlin-dsl` //等同于 id("org.gradle.kotlin.kotlin-dsl") version "4.1.2"// 也可以用 id("org.jetbrains.kotlin.jvm") version "1.9.10" apply true (不建议,这个只有Kotlin的语法,而没有Kotlin DSL的语法)}//使用 kotlin-dsl / org.jetbrains.kotlin.jvm 的时候,需要mavenCentral仓库
repositories {mavenCentral()
}gradlePlugin {plugins {create("greeting") {id = "com.heiko.buildsrc.plugin"//Java插件主类//implementationClass = "com.heiko.buildsrc.MyPlugin"//Groovy插件主类//implementationClass = "com.heiko.buildsrc.MyPluginGroovy"//Kotlin插件主类implementationClass = "com.heiko.buildsrc.MyPluginKotlin"}}
}

4. 更方便的新建插件的方式 : 命令行

除了在Android Studio中手动新建插件,我们还可以通过命令行来新建插件。

4.1 新建文件夹

首先需要新建一个文件夹,在文件夹里复制好如下内容,gralde文件夹gradlewgradlew.bat,这三个直接从一个现成的Android项目中复制过来就行。
在这里插入图片描述

4.2 运行命令行

打开cmd,进入该文件夹,然后执行如下命令,下述命令选其一即可。

4.2.1 创建使用Java的插件
gradlew init --type java-gradle-plugin
4.2.2 创建使用Groovy的插件
gradlew init --type groovy-gradle-plugin
4.2.3 创建使用Kotlin的插件
gradlew init --type kotlin-gradle-plugin

4.3 完成选项

执行命令后,会有几个问题选项,我们按需进行选择,最终看到BUILD SUCCESSFUL,就表示新建插件成功了
在这里插入图片描述
生成后的文件如下

在这里插入图片描述
这样子就很快的完成了一个Gradle独立插件的新建了。

5. Android Gradle系列文章

Android Gradle 开发与应用 (一) : Gradle基础-氦客-CSDN博客
Android Gradle开发与应用 (二) : Groovy基础语法-CSDN博客
Android Gradle开发与应用 (三) : Groovy语法概念与闭包-CSDN博客
Android Gradle开发与应用 (四) : Gradle构建与生命周期-CSDN博客
Android Gradle开发与应用 (五): 基于Gradle 8.2,创建Gradle插件-CSDN博客
Android Gradle 开发与应用 (六) : 创建buildSrc插件和使用命令行创建Gradle插件-CSDN博客

6. 参考文章

Using Plugins (gradle.org)
Gradle用户手册 - Gradle8.1.1中文文档 - API参考文档 - 全栈行动派 (qzxdp.cn)
编写 Gradle 插件 | Android Studio | Android Developers (google.cn)
Android Gradle8.0版本新建Gradle插件 - 掘金 (juejin.cn)
Gradle基础到进阶 - yechaoa的专栏 - 掘金 (juejin.cn)
【Gradle-8】Gradle插件开发指南 - 掘金 (juejin.cn)
【Gradle-9】Gradle插件发布指南 - 掘金 (juejin.cn)
Gradle自定义插件实践与总结 - 掘金 (juejin.cn)
创建Gradle插件记录 - 掘金 (juejin.cn)
配置 build | Android Studio | Android Developers (google.cn)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/275077.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C#语言入门】17. 事件详解(上)

【C#语言入门】17. 事件详解(上) 一、初步了解事件 定义:单词Event,译为“事件” 通顺的解释就是**“能够发生的什么事情”**,例如,“苹果”不能发生,但是“公司上市”这件事能发生。在C#中事…

c++之旅——第六弹

大家好啊,这里是c之旅第六弹,跟随我的步伐来开始这一篇的学习吧! 如果有知识性错误,欢迎各位指正!!一起加油!! 创作不易,希望大家多多支持哦! 一,静态成员&…

LeetCode(力扣)算法题_1261_在受污染的二叉树中查找元素

今天是2024年3月12日,可能是因为今天是植树节的原因,今天的每日一题是二叉树🙏🏻 在受污染的二叉树中查找元素 题目描述 给出一个满足下述规则的二叉树: root.val 0 如果 treeNode.val x 且 treeNode.left ! n…

【PLC】现场总线和工业以太网汇总

1、 现场总线 1.1 什么是现场总线 1)非专业描述: 如下图:“人机界面”一般通过以太网连接“控制器(PLC)”,“控制器(PLC)”通过 “现场总线”和现场设备连接。 2)专业描述(维基百科) 现场总线…

如何设计一个高并发的系统--简谈

设计一个高并发系统可以从下面这些角度来考虑。 所谓设计高并发系统,就是设计一个系统,保证它整体可用的同时,能够处理很高的并发用户请求,能够承受很大的流量冲击。 我们要设计高并发的系统,那就需要处理好一些常见…

安装及管理docker

文章目录 1.Docker介绍2.Docker安装3.免sudo设置4. 使用docker命令5.Images6.运行docker容器7. 管理docker容器8.创建image9.Push Image 1.Docker介绍 Docker 是一个简化在容器中管理应用程序进程的应用程序。容器让你在资源隔离的进程中运行你的应用程序。类似于虚拟机&#…

Linux -- 线程互斥

一 线程互斥的概念 大部分情况,线程使用的数据都是局部变量,变量的地址空间在线程栈空间内,这种情况,变量归属单个线程,其他线程无法获得这种变量。但有时候,很多变量都需要在线程间共享,这样的…

淘宝基于Nginx二次开发的Tengine服务器

最近在群里看到这样一张阿里云网关报错的截图,我保存下来看了下 看到下面有 Tengine提供技术支持,这个Tengine是什么东西呢?我搜索了下似乎是淘宝在nginx的基础上自己改的Web服务器 Tengine还支持OpenResty框架,该框架是基于Ngin…

ARM中专用指令(异常向量表、异常源、异常返回等)

状态寄存器传送指令 CPSR寄存器 状态寄存器传送指令:访问(读写)CPSR寄存器 读CPSR MRS R1, CPSR R1 CPSR 写CPSR MSR CPSR, #0x10 0x10为User模式,且开启IRQ和FRQ CPSR 0x10 在USER模式下不能随意修改CPSR,因为USER模式…

BUUCTF-----[CISCN 2019 初赛]Love Math

<?php error_reporting(0); //听说你很喜欢数学&#xff0c;不知道你是否爱它胜过爱flag if(!isset($_GET[c])){show_source(__FILE__); }else{//例子 c20-1$content $_GET[c];if (strlen($content) > 80) {die("太长了不会算");}$blacklist [ , \t, \r, \n…

【Android】工厂模式中 字体大小/显示重叠/显示不完整 相关 问题分析与解决

工厂模式中 字体大小/显示重叠/显示不完整 相关 问题分析与解决 1-Factory Mode是什么&#xff1f;2-Factory Mode的显示界面3-找到factory模块中对应设置字体尺寸的代码4-分析与修改代码 Tips 1-Factory Mode是什么&#xff1f; 在Android手机中&#xff0c;Factory Mode&…

Seata 2.x 系列【8】Spring Cloud 集成客户端

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Seata 版本 2.0.0 本系列Spring Boot 版本 3.2.0 本系列Spring Cloud 版本 2023.0.0 源码地址&#xff1a;https://gitee.com/pearl-organization/study-seata-demo 文章目录 1. 前言2. 问题演…

零基础如何学习Web 安全,如何让普通人快速入门网络安全?

前言 网络安全现在是朝阳行业&#xff0c;缺口是很大。不过网络安全行业就是需要技术很多的人达不到企业要求才导致人才缺口大 初级的现在有很多的运维人员转网络安全&#xff0c;初级也会慢慢的卷起来&#xff0c;但是岗位多不用怕&#xff0c;以后各大厂也都会要网络安全人…

读西游记第一回:西游记世界格局

天地之数&#xff1a; 元&#xff1a;十二万九千六百岁&#xff08;129600年&#xff09; 1元12会&#xff1a;子、丑、寅、卯、巳、午、未、申、酉、戌、亥。每会18000年。与12地支对应。 亥会期&#xff1a;前5400年混沌期&#xff0c;后5400年&#xff0c;盘古开天辟地&am…

YOLOv9改进项目|关于本周更新计划的说明24/3/12

目前售价售价59.9&#xff0c;改进点30个 专栏地址&#xff1a; 专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;主力高效涨点&#xff01;&#xff01;&#xff01; 日期&#xff1a;24/3/12 本周更新计划说明&#xff1a; 1. 更新华为Gold YOLO中的…

【nodejs】“__dirname is not defined”错误修复

▒ 目录 ▒ &#x1f6eb; 问题描述环境 1️⃣ 原理CommonJS vs ESM错误原因 2️⃣ 禁用 ESM 模式并改用 CommonJS方案一&#xff1a;项目方案二&#xff1a;单文件 3️⃣ 在 ESM 模式下自实现__dirname&#x1f4d6; 参考资料 &#x1f6eb; 问题 描述 从网上找了一份代码&am…

链表基础知识详解(非常详细简单易懂)

概述&#xff1a; 链表作为 C 语言中一种基础的数据结构&#xff0c;在平时写程序的时候用的并不多&#xff0c;但在操作系统里面使用的非常多。不管是RTOS还是Linux等使用非常广泛&#xff0c;所以必须要搞懂链表&#xff0c;链表分为单向链表和双向链表&#xff0c;单向链表很…

【四】【算法分析与设计】贪心算法的初见

455. 分发饼干 假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。 对每个孩子 i&#xff0c;都有一个胃口值 g[i]&#xff0c;这是能让孩子们满足胃口的饼干的最小尺寸&#xff1b;并且每块饼干 j&#xff0c;都有…

提高螺栓连接强度——SunTorque智能扭矩系统

螺栓连接是工程中常见的一种连接方式&#xff0c;其强度对于设备的稳定性和安全性具有至关重要的影响。然而&#xff0c;由于各种因素的影响&#xff0c;螺栓连接在使用过程中往往会出现松动、断裂等问题&#xff0c;导致设备故障和安全隐患。因此&#xff0c;提高螺栓连接的强…

Kanebo HITECLOTH 高科技擦镜布介绍

Kanebo HITECLOTH&#xff0c;这款由日本KBSeiren公司制造的高科技擦镜布&#xff0c;以其卓越的清洁能力和超柔软的布质&#xff0c;成为了市场上备受瞩目的产品。 材质与特性 HITECLOTH采用0.1旦尼尔特级高级微纤维制造&#xff0c;质地细致、坚韧、不起颗粒。这种纤维的特…