自定义Gradle Plugin

Gradle 自定义Plugin插件之上传APK到蒲公英 在之前的文章:Gradle 自定义Plugin插件介绍 中,介绍了通过Gradle自定义插件的几种方式。 作为一个的Coder,我们当然不希望我们自定义插件只是简单的打印log啦。比如,之前我们版本开发完成的时候,每次测试的流程都需要手动的打包,加固,上传,钉钉通知等等 。 现在,我们就通过自定义插件来实现一个打包完成后,自动上传到蒲公英的插件。 首先,在自定义这个插件的时候,我们需要弄明白几个问... 阅读详情

转载注明出处:http://blog.youkuaiyun.com/xiaohanluo/article/details/73848633

1. 前言

自定义Gradle Plugin使用的是Groovy语言,和Java很像,很容易理解,不做过多的语言介绍。

2. Gradle Plugin的位置

  • 直接在构建文件build.gradle中编写Plugin,这种方法写的Plugin无法被其他构建文件引用
  • 单独写Gradle Plugin文件,放在rootProjectDir/buildSrc/src/main/groovy/目录下,同一个工程中所有的构建文件够可以引用这个插件,但是不能被其他工程引用
  • 单独的工程中自定义Gradle Plugin,上传到远端maven库等,其他工程通过添加依赖,引用这个插件

3. 简单的Gradle Plugin示例

自定义插件,需要实现Plugin接口。在其他工程的构建文件中通过Plugin.apply(T)方法引用插件,这个工程会被当作参数传入。上面讲了Gradle Plugin可能存在的三种位置,下面是一个简单插件的示例,是直接写在build.gradle的。

apply plugin: DemoPlugin

// 其他一些工程的配置信息
...

class DemoPlugin implements Plugin<Project> {
    void apply(Project project) {
        project.task('hello') {
            doLast {
                println "Hello World from the DemoPlugin"
            }
        }
    }
}

使用gradle -q hello指令输出如下:

> gradle -q hello
Hello World from the DemoPlugin

因为这个Gradle Plugin是直接写在构建文件build.gradle里的,所以它不能被其他构建文件引用,下面介绍可被其他工程引用的自定义插件。

4. 自定义插件

想要可以被其他工程引用我们自定义的Gradle Plugin,需要将Gradle Plugin上传到maven等远端库,因为是demo,就将插件发布到本地。一般来说有下面几步。

  • 在rootProjectDir/buildSrc/src/main/groovy/目录下创建插件,并实现具体内容
  • 在rootProjectDir/buildSrc/src/main/resources/META-INF/gradle-plugins目录下创建属性文件声明插件的具体实现类,属性文件的名称和Gradle Plugin Id相匹配,内容是implementation-class=具体实现类全称
  • 上传mavan等库,这篇文章就不上传到maven库,将插件发布到本地
  • 其他工程引用插件

4.1 插件具体实现类

目录结构如下:


图-1 插件目录结构图

插件类具体内容如下:

package com.spi.demo.gradle

import org.gradle.api.Plugin
import org.gradle.api.Project

public class DemoPlugin implements Plugin<Project> {
    void apply(Project project) {
        project.task('hello') {
            doLast {
                println "Hello World from the DemoPlugin"
            }
        }
    }
}

可以看出其实和Java文件差别不大,这个插件主要申明了一个名为hello的任务,这个任务只输出一句话。

实现了Gradle Plugin的具体实现类后,在/buildSrc/src/main/resources/目录下创建属性文件声明Gradle Plugin的具体实现类的位置。属性文件的名称是.propertires,内容是具体实现类的位置,这个demo中属性文件的内容如下:

implementation-class=com.spi.demo.gradle.DemoPlugin

4.2 插件Id

插件Id是自定义的,声明插件Id后,其他工程在构建文件build.gradle中通过apply plugin: 'Plugin Id'来引用具体的Gradle Plugin。

插件id类似于java中的包名,可以避免与其他插件发生冲突。

插件id最好是组件命名空间和插件名称的结合,例如,如果有一个名为“foo”的Github账户,他插件被命名为“bar”,插件id可以是com.github.foo.bar。同样,如果一个叫做baz的插件开发组织,插件id可以是org.baz.bar插件。

插件id遵从一下规则:

  • 可以包含任何字母和数字,以及“.”和“-”字符
  • 必须包含至少一个“.”字符
  • 只能使用小写字母
  • org.gradle和com.gradleware不能被使用
  • 不能以“.”字符开始或者结束
  • 不能连续使用“.”字符

尽管插件id和Java包名有些相似,但实际上包名比插件id要详细得多。

4.3 发布插件

在gradle文件或者pom文件引入一个库,需要有groupId、artifactId、version三个属性,根据这三个属性来区分找到唯一的库。

例如:

compile 'com.android.support:appcompat-v7:25.3.1'

这个引用中

  • com.android.support是groupId
  • appcompat-v7是artifactId
  • 25.3.1是version。

同样,在发布插件时候,也需要这三个属性,用于和其他插件做出区分。

在build.gradle文件内容如下,添加上传任务:

apply plugin: 'java'
apply plugin: 'groovy'
apply plugin: 'maven'

dependencies {
    compile gradleApi()
    compile localGroovy()
}

group = 'com.spi.demo'
version = '1.0-SNAPSHOT'

uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: uri('../repo'))
        }
    }
}

在这里,定义了group和version,但是没有定义artifact,这是因为artifact默认是这个工程目录名称,这个demo中artifact就是plugin。

在uploadArchives任务中,我们将插件发布到本工程的上一层目录的repo文件夹中。执行这个任务后,插件会被发布,发布后目录结构如下图。


图-2 本地插件目录结构图

可以直接在终端使用指令执行uploadArchives任务,可以将plugin目录工程设置成module,使用Android Studio执行任务。


图-3 上传插件任务图

4.4 引用插件

在工程的构建文件build.gradle中添加依赖,引用插件。

apply plugin: 'com.spi.demo'

buildscript {
    repositories {
        maven {
            url uri('../repo')
        }
    }
    dependencies {
        classpath 'com.spi.demo:plugin:1.0-SNAPSHOT'
    }
}

添加了构建的依赖库路径,配置了依赖的具体插件名称。然后在任务列表中就可以看见名为hello的任务。


图-4 引入插件任务图

使用gradle -q hello指令输出如下:

> gradle -q hello
Hello World from the DemoPlugin

5. 总结

本文没有讲解将插件发布到远端,插件可以发布到lvy仓库、maven仓库、Gradle plugin portal三个地方。

Android Gradle 自定义Plugin实现_android plugin 而 Gradle 改良了过去 Maven、Ant 带给开发者的问题,至今也成为 Android Studio 内置的封装布署工具。 阅读详情

相关推荐

Robust MPC 4 (鲁棒&随机 MPC)

Robust MPC

weixin_44299806的博客 2735

build 之前执行task_Android Studio中如何让Gradle自动执行Task

1、gradle的简单介绍 Gradle是可以用于Android开发的新一代的Build System,也是Android Studio默认的build工具。其实Gradle脚本是基于一种JVM语言— Groovy,再加上DSL组成的。由于Groovy是JVM语言,所以可以使用大部分的Java语言库。所谓DSL就是专门针对And我在app中的build.gradle中定义了如下一个task:tas...

weixin_39867509的博客 2339

unity 休闲游戏 动效规范说明

在特效制作中,有时为了完成更丰富、更绚丽的效果,可能会添加一些高级Shader(着色器),例如扭曲、溶解,这些Shader(着色器)往往需要用到显卡的部分功能,会造成较大的性能损耗。如果对纹理细节要求较高,那么建议使用贴图比例为1∶1的正方形(不强制),使用不等边贴图制作特效时会对纹理清晰度造成一定的损失(引擎算法决定)。首先选择模型体,然后在Inspector(检测视图)中查看该物体的属性,找到MeshRenderer(网格渲染)组件中的阴影设置项,如图。制作特效时,尽量不要使用灯光系统。

丛小胖 1610

Gradle Plugin的开发及发布

经过前面部署Jenkins自动化打包任务,以及桌面端APK工具的开发,基本已经把国内项目组所面临的问题解决了。但是呢,Jenkins这一套着实是繁琐,而且对海外项目组支持也不友好。所以我又决定开发一个gradle插件来作为一个轻量级的打包发布方案,该方案可以同时兼顾公司海内外的所有项目。整体目标大概就是如下:1、依赖assembleXxxRelease等Task构建新任务;2、将打包生成的APK文件上传到FTP服务器;3、根据服务器上APK文件的地址生成二维码;4、发送通知消息到钉钉群组;

乐翁龙 2921

Comsol固体力学仿真﹣﹣受均匀内压的厚壁球壳弹塑性分析(加载卸载全流程)

COMSOL固体力学及结构力学仿真较少,故而查询了有关资料,才建立了如下模型。图4 加载卸载全历程中的冯米塞斯应力变化。该有限元模型是通过扫掠而得的结构化网格。图2 加载卸载全历程中的塑型区域变化。图3 加载卸载全历程中的位移应力变化。图6 关键节点第一,第三主应力分布。图5 关键节点应力场与塑性区分布。《弹塑性力学》大作业,记录一下。图1 球体的有限元网格模型。

weixin_62236383的博客 1484

VL53L1X vs VL53L0X:激光测距传感器选型指南与性能对比

本文深入对比了VL53L1X与VL53L0X两款激光测距传感器的核心差异。VL53L1X采用区域ToF原理,在抗环境光干扰、最大测距及多目标识别方面优势显著,尤其适合复杂光线与动态场景。文章结合机器人避障、无人机定高等实战场景,提供了清晰的选型决策树,帮助工程师根据测距需求、环境复杂度与系统成本做出最优选择。

weixin_29197699的博客 394

Android开发Gradle高级技巧、自定义Gradle-Task、打包完成自动签名、执行Shell脚本

文章所有资料全部已经打包整理好,另外小编手头上整理了大量Android架构师全套学习资料,Android核心高级技术PDF文档+全套高级学习资料+视频+2021 BAT 大厂面试真题解析资料展示:《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

2301_79055239的博客 788

实战指南:CentOS 7下VOS3000 8.0从零部署到授权激活全流程

本文提供了一份详尽的CentOS 7系统下部署VOS3000 8.0的实战指南。从环境准备、使用FileZilla上传安装包、执行自动化安装脚本,到获取软件码、利用注册机生成授权文件并激活,手把手带领用户完成从零部署到投入商用的全流程,确保系统稳定运行。

zero1的博客 895

彻底解决gradle与gradle plugin匹配关系以及gradle下载缓慢的问题

我们刚接触安卓开发,在环境搭建阶段,安装Android studio的时候或者新建一个项目的时候,往往会卡到一个地方一直等待,一直等待。。。直到最后报红线,怎么搞都不行。最后崩溃,放弃了,毁灭吧,搞不了了。 其实,就是一个gradle下载缓慢的小问题把好多新人挡在了Android开发的大门之外。 唉唉,朋友,别放弃,看这里,都是小问题。 这里给大家分享一下个人的解决方案。 先说原因:之所以下载缓慢,是因为gradle服务器在国外,国内网络访问自然慢啊,Android Studio已经尽力了。 再说方法: 我

fxjzzyo的博客 4万+

KT148A语音芯片SOP外挂功放芯片8002D的说明_V1

KT148A语音芯片内置8欧姆0.5W的功放,所以一般的应用场景,播放一些提示音音量是足够的。但是有的需求还需要驱动更大的扬声器,实现更大的播放音量,这里我们给出解决方案。KT148A+HAA8002D的组合

qyvhome的博客 2148

【系统架构设计师】论文模板样例:论软件系统架构风格

本人于年月参与项目,该系统为*,在该项目组中我担任系统架构师岗位,主要负责系统整体架构设计。本文以该车联网项目为例,主要讨论了软件架构风格在该项目中的具体应用。底层架构风格我们采用了虚拟机风格中的解释器,因该公交共有几十种不同的数据协议,使用解释器风格可以满足整车数据协议兼容性需求;中间层关于应用层的数据流转采用了独立构件风格中的隐式调用,以减低系统间耦合度、简化软件架构,提高可修改性方面的架构属性;应用系统层采用了B/S的架构风格,统一解决公交行业性难题“实施推广难、维护难”问题。

数据知道的博客 9927

Gradle插件开发实战指南 - 基于jjohannes的gradle-plugins-howto项目

Gradle插件开发实战指南 - 基于jjohannes的gradle-plugins-howto项目 本教程旨在深入浅出地引导您了解并实践如何基于jjohannes提供的gradle-plugins-howto项目来开发Gradle插件。通过此教程,我们将一起探索项目的结构、关键文件以及如何进行基本配置。 1. 项目目录结构及介绍 jjohannes的gradle-plugins-howto项目...

gitblog_01074的博客 570

学Simulink——线控转向(Steer‑By‑Wire, SBW)路感模拟与回正控制仿真

本文详细介绍了线控转向(SBW)系统的Simulink建模方法,重点讲解了路感模拟与回正控制的实现原理。文章首先分析了SBW系统结构,建立了方向盘和前轮的动力学方程;随后分步骤演示了Simulink建模过程,包括方向盘二阶动力学、前轮位置闭环控制、路感反馈计算等核心模块;最后通过仿真验证了转向跟随性能、路感反馈效果和自动回正功能。文中还提供了工程实现的关键参数和注意事项,为开发真实的SBW系统提供了实用指导。该模型可扩展应用于主动转向、故障注入等高级功能开发。

xiaoheshang_123的博客 39

gradle 自定义plugin

gradle 自定义plugin

qq_21159963的博客 1108

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Gradle 自定义 plugin

学习完毕 Gradle 的基础知识,不来点实战,感觉就像没有学习过啊。那我们就搞一搞实战,一共两个简单的操作。第一,写一个自定义 Plugin。第二,写一个自定义 Transform。 自定义 Plugin 网上一般都会说三种方法是去创建,咱们就不来那么多虚的,来个一劳永逸的吧,我们直接新建一个工程来写,这个会了,新建 Library 工程 和在 build.gradle 中的这两种方式相信你也就...

weixin_33778778的博客 741

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Gradle学习系列之十——自定义Plugin

Gradle学习系列之之十——自定义Plugin 在Plugin中,我们可以向Project中加入新的Task,定义configurations和property等。我们3种方法可以自定义Plugin,这些方法和自定义Task类型的3种方法相似。 在接下来的例子中,我们将分别通过这3种方法来创建一个DateAndTimePlugin,该Plugin定义了2个Task,分别用于输出系统当前的日期和时间,另外,我们可以配置日期和时间的输出格式。 (一)在build.gradle文件中直接定义Plugin 和在b

Ryze 534

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Gradle进阶计划(三)自定义Gradle Plugin

上一篇文章Gradle进阶计划(二)Gradle Plugin原理分析,我们介绍了 Gradle Plugin 的原理,并且对于主要的 Task 进行了详细的分析。这篇文章我们研究一下如何自己写一个Gradle Plugin。 一、自定义Task 在学习自定义 Gradle Plugin 之前,我们先学习一下如何自定义 Task。 相较于自定义 Gradle Plugin,自定义Task实现更加的简单。同时,它又是自定义 Gradle Plugin...

Fighting_初心的博客 1203

不得不学之「 Gradle」 ⑥ 自定义 plugin

学习完毕 Gradle 的基础知识,不来点实战,感觉就像没有学习过啊。那我们就搞一搞实战,一共两个简单的操作。第一,写一个自定义 Plugin。第二,写一个自定义 Transform。 自定义 Plugin 网上一般都会说三种方法是去创建,咱们就不来那么多虚的,来个一劳永逸的吧,我们直接新建一个工程来写,这个会了,新建 Library 工程 和在 buil...

Mr.SSY的博客 409

Gradle-自定义plugin

为什么要学习Gradle Gradle目前已经应用于多个Android开发的技术体系中,比如构建系统、插件化、热修复和组件化,如果不了解Gradle,那么对于上述技术体系的了解会大打折扣 上述一段文字是比较传统的解释,我开始系统的学习gradle是因为,项目由于引入了组件化的开发模式,模块之间的通信就需要引入一种新的方式,之前一直使用的是SPI,但是在service比较多的时候会影响到冷起的时...

K-night的专栏 3219

Gradle学习系列之十——自定义Plugin(本系列完)

在Plugin中,我们可以向Project中加入新的Task,定义configurations和property等。我们3种方法可以自定义Plugin,这些方法和自定义Task类型的3种方法相似。在接下来的例子中,我们将分别通过这3种方法来创建一个DateAndTimePlugin,该Plugin定义了2个Task,分别用于输出系统当前的日期和时间,另外,我们可以配置日期和时间的输出格式。

Capricornlg的专栏 1041

gradle 7.x 如何开发一个自定义 Plugin

这里我还是使用 buildscript 的方式引入(因为对 gradle 不熟悉),起码能 work 起来,有什么好的建议可以提给我,感激不尽。执行成功后,我们会看到,在我们的项目目录下,会创建 repo 目录,里面有我们的包名的路径和里面的 jar 文件。在 settings.gradle 中,添加本地仓库,注意,是往 PluginManagement 中添加仓库。再 sync 一下,我们会看到控制台输出了我们的那句话,说明我们的插件引入成功了。商业转载请联系作者获得授权,非商业转载请注明出处。

chuyouyinghe的专栏 183

Gradle自定义Plugin插件和ASM修改字节码

前言 先介绍一下 AOP 和 ASM 的概念,AOP 是一种面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。和面向对象编程 的 OOP 相同。ASM 是一个框架可以看作 AOP 的工具,当然 AOP 也有其他工具,比如用的比较多的 AspectJ 、Javassist 、Xposed 和 Dexposed 等。 这里我们主要介绍一下在自定义Plugin 使用的 ASM...

stven_king的专栏 1756

写Gradle自定义插件Plugin

Gradle插件支持groovy、java、kotlin语言,根据使用的语言,我们需要把插件代码分别放到下面几个对应的目录: rootProjectDir/buildSrc/src/main/groovy rootProjectDir/buildSrc/src/main/java rootProjectDir/buildSrc/src/main/kotlin 这里以java语言为例,写个自定义插件 1、新建项目,然后创建名称为buildSrc的module(注意,module的名称必须是buildSrc)

sqf251877543的博客 2574

Android 源码系列之<十七>自定义Gradle Plugin,优雅的解决第三方Jar包中的bug<上>

我们在开发中经常用到一些优秀的第三方库,比如okhttp,glide,butterknife等。这些库不仅提高了开发效率而且避免踩坑,假如在应用中这些开源库出现了bug,我们随时可以从GitHub下载源码进行bug修改。但是项目中使用的库不是开源的并且该库又存在bug,由于没有源码也就无法进行bug的修复,一般做法就是给非开源库的作者或组织反馈bug等他们进行修复,如果他们修复的及时还好说,一旦他们更新不及时就会给我们APP造成不好影响(比如用户流失)……这篇文章我就给小伙伴们讲解一下如何自定义Gradle

快乐de灰太狼的专栏 5920
上一篇: Gradle用户使用指南
下一篇: Android性能优化总结
王三的猫阿德
王三的猫阿德 领域专家: 操作系统技术领域 领域专家: 操作系统技术领域
博客等级 码龄15年 179粉丝 29原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值