Android gradle 自定义插件
Gradle 的插件有三种打包方式:
- 构建脚本:插件逻辑写在 build.gradle 中,适用于逻辑简单的任务,但是该方式实现的插件在该构建脚本之外是不可见的,只能用于当前脚本。
buildSrc项目:根据语言插件代码放在 rootProjectDir/buildSrc/src/main/groovy 目录中或者 rootProjectDir/buildSrc/src/main/java 或者rootProjectDir/buildSrc/src/main/kotlin,该插件对于该项目中构建使用的每个构建脚本都是可见的,适用于逻辑复杂但又不需要对外可见的插件
- 独立项目:一个独立的 Groovy/Java/Kotlin 项目,该项目生成并发布一个 jar 然后可以在多个版本中使用它并与他人共享,并且此 jar 包可能包含一些插件,或者将多个相关的任务类捆绑到单个库中
接下来我们先从基本的构建脚本中的插件开始
1、构建脚本:
创建 Gradle 插件,需要创建一个实现 Plugin 接口的类,当插件应用于项目时,Gradle 会创建插件类的实例并调用实例的 apply() 方法,如果需要的话,插件还可以用于配置项目
把插件变得可配置,添加一些简单扩展属性到 project 上,比如可以添加一个 greeting 扩展对象到 project 上,这就允许我们去配置 greeting 对象。
文件是 build.gradle:
class GreetingPluginExtension {
String message = 'Hello from GreetingPlugin'
} class GreetingPlugin implements Plugin<Project> {
void apply(Project project) {
// Add the 'greeting' extension object
def extension = project.extensions.create('greeting', GreetingPluginExtension)
// Add a task that uses configuration from the extension object
project.task('hello') {
doLast {
println extension.message
}
}
}
} apply plugin: GreetingPlugin // Configure the extension
greeting.message = 'Hi from Gradle'
2、独立项目
创建Gradle Module
AndroidStudio中是没有新建类似Gradle Plugin这样的选项的,那我们如何在AndroidStudio中编写Gradle插件,并打包出来呢?
首先,你得新建一个Android Project
然后再新建一个 Module,这个 Module用于开发 Gradle 插件,同样,Module 里面没有 gradle plugin 给你选,但是我们只是需要一个“容器”来容纳我们写的插件,因此,你可以随便选择一个 Module 类型(如 Phone & Tablet Module 或 Android Librarty ),因为接下来一步我们是将里面的大部分内容删除,所以选择哪个类型的 Module 不重要。
将 Module 里面的内容删除,只保留 build.gradle 文件和 src/main 目录。
由于 gradle 是基于 groovy,因此,我们开发的 gradle 插件相当于一个 groovy 项目。所以需要在 main 目录下新建 groovy 目录
groovy 又是基于Java,因此,接下来创建groovy的过程跟创建java很类似。在 groovy 新建包名,如:com.sjq.greetplugin,然后在该包下新建groovy文件,通过 new->file→GreetingPlugin.groovy 来新建名为 GreetingPlugin 的 groovy 文件。一定是要有.groovy 后缀文件。
为了让我们的 groovy 类申明为 gradle 的插件,新建的 groovy 需要实现 org.gradle.api.Plugin 接口。
如下所示:
package com.sjq.greetplugin // 包名一定要有,不然打包不会打进对应包里去,很可能就会出现类找不到的情况。 import org.gradle.api.Plugin
import org.gradle.api.Project class GreetingPlugin implements Plugin<Project> {
@Override
void apply(Project project) {
project.task("publishPluginTest"){ // task 名字
doLast {
println("新内容是:null")
}
}
}
}
定义好了自己的 gradle 插件类,接下来就是告诉 gradle,哪一个是我们自定义的插件类,因此,需要在 main 目录下新建 resources 目录,然后在resources 目录里面再新建 META-INF 目录,再在 META-INF 里面新建 gradle-plugins 目录。最后在 gradle-plugins 目录里面新建 properties 文件,注意这个文件的命名,你可以随意取名,但是后面使用这个插件的时候,会用到这个名字。比如,你取名为 com.sjq.gradle.properties,而在其他build.gradle 文件中使用自定义的插件时候则需写成:
apply plugin: 'com.sjq.greetplugin'
然后在com.hc.gradle.properties
文件里面指明你自定义的类
implementation-class=com.sjq.greetplugin.GreetingPlugin // 注意后面跟的是插件名字,注意大小写
此处我们还是采用包名,方便记忆。
到这里后,整个目录结果如下图所示:
因为我们要用到 groovy
以及后面打包要用到 maven
, 所以在我们自定义的 Module
下的 build.gradle
需要添加如下代码:
apply plugin: 'groovy'
apply plugin: 'maven' dependencies {
//gradle sdk
compile gradleApi()
//groovy sdk
compile localGroovy()
} repositories {
mavenCentral()
}
打包到本地Maven
前面我们已经自定义好了插件,接下来就是要打包到 Maven 库里面去了,你可以选择打包到本地,或者是远程服务器中。在我们自定义 Module
目录下的 build.gradle 添加如下代码:
//group和version在后面使用自定义插件的时候会用到
group='com.hc.plugin'
version='1.0.0' uploadArchives {
repositories {
mavenDeployer {
//提交到远程服务器:
// repository(url: "http://www.xxx.com/repos") {
// authentication(userName: "admin", password: "admin")
// }
//本地的Maven地址设置为../repos
repository(url: uri('../repos'))
}
}
}
其中,group
和 version
后面会用到,我们后面再讲。虽然我们已经定义好了打包地址以及打包相关配置,但是还需要我们让这个打包 task 执行。点击 AndroidStudio
右侧的 gradle 工具
,如下图所示:
可以看到有 uploadArchives
这个 Task,
双击 uploadArchives
就会执行打包上传啦!执行完成后,去我们的 Maven
本地仓库查看一下:
其中,com/sjq/greetplugin
这几层目录是由我们的 group
指定,myplugin
是模块的名称,1.0.0
是版本号( version
指定)。
使用自定义的插件
接下来就是使用自定义的插件了,一般就是在 app 这个模块中使用自定义插件,因此在 app 这个 Module 的 build.gradle 文件中,需要指定本地 Maven 地址、自定义插件的名称以及依赖包名。简而言之,就是在 app 这个 Module 的 build.gradle 文件中后面附加如下代码:
buildscript {
repositories {
maven {//本地Maven仓库地址
url uri('../repos')
}
}
dependencies {
//格式为-->group:module:version
classpath 'com.sjq.greetplugin:GreetingPlugin:1.0.0'
}
}
//com.sjq.greetplugin 为 resources/META-INF/gradle-plugins 下的 properties 文件名称
apply plugin: 'com.sjq.greetplugin'
在当前目录下输入命令行:
./gradlew -q publishPluginTest
运行结果:
3、开发只针对当前项目的Gradle插件
前面我们讲了如何自定义 gradle 插件并且打包出去,可能步骤比较多。有时候,你可能并不需要打包出去,只是在这一个项目中使用而已,那么你无需打包这个过程。
只是针对当前项目开发的 Gradle 插件相对较简单。步骤之前所提到的很类似,只是有几点需要注意:
新建的 Module 名称必须为 BuildSrc,无需 resources 目录
其中,build.gradle
内容为:
// 依赖groovy插件
plugins {
id 'groovy'
} dependencies {
implementation gradleApi()
implementation localGroovy()
}
CustomPluginB 内容是
package com.sjq.happy.myplugin import org.gradle.api.Plugin
import org.gradle.api.Project // 在单独的groovy文件中定义插件类
class CustomPluginB implements Plugin<Project> { @Override
void apply(Project project) {
project.task('CustomPluginTaskB') {
doFirst {
println 'This is custom plugin TaskB'
}
}
}
}
在app
这个Module
中如何使用呢?直接在app的build.gradle下加入
import com.sjq.happy.myplugin.CustomPluginB
在输入命令行:
./gradlew -q CustomPluginTaskB
结果如下图所示:
Android gradle 自定义插件的更多相关文章
- Android Gradle 自定义Task 详解
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/76408024 本文出自[赵彦军的博客] 一:Gradle 是什么 Gradle是一 ...
- Gradle 自定义插件
使用版本 5.6.2 插件被用来封装构建逻辑和一些通用配置.将可重复使用的构建逻辑和默认约定封装到插件里,以便于其他项目使用. 你可以使用你喜欢的语言开发插件,但是最终是要编译成字节码在 JVM 运行 ...
- gradle 自定义插件 下载配置文件
1.新建Gradle项目: 2.建立src/main/groovy目录,并添加如下代码: ConfigPlugin.groovy package com.wemall.config import or ...
- phonegap入门–3 Android phonegap 自定义插件DEMO
一.环境要求: 首先需要建立phonegap android 工程,请参考:http://www.cnblogs.com/zhujinguo/p/4369883.html 二.建立java类 ...
- Android Gradle使用总结
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/77678577 本文出自[赵彦军的博客] 其他 Groovy 使用完全解析 http ...
- 读书笔记--Android Gradle权威指南(下)
前言 最近看了一本书<Android Gradle 权威指南>,收获挺多,就想着来记录一些读书笔记,方便后续查阅. 本篇内容是基于上一篇:读书笔记--Android Gradle权威指南( ...
- Android Gradle defaultConfig详解及实用技巧
实际项目中,都会应用Android Gradle Plugin,根据实际中的项目模块的职责,可以具体应用如下四种插件类型. 1,apply plugin: 'com.android.applicati ...
- [Android]Gradle 插件 DiscardFilePlugin(class注入&清空类和方法)
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/6732128.html Android Gradle 插件 Di ...
- 《Gradle权威指南》--Android Gradle插件
No1: Android Gradle插件分类 App插件id:com.android.application Library插件id:com.android.library Test插件id:com ...
随机推荐
- AndroidStudio提高编译速度的建议
1.使用最新的Android gradle插件 Google tools team一直致力于提高android studio的编译速度,使用最新的gradle插件可以搞编译速度 在Android Gr ...
- css之单位
css之单位 角度<angle> 用于<gradient>s和某些transform功能中 deg表示以度为单位的角度.一整圈就是360deg. 例如:0deg,90deg,1 ...
- Spark 源码系列(六)Shuffle 的过程解析
Spark 大会上,所有的演讲嘉宾都认为 shuffle 是最影响性能的地方,但是又无可奈何.之前去百度面试 hadoop 的时候,也被问到了这个问题,直接回答了不知道. 这篇文章主要是沿着下面几个问 ...
- 企业云桌面-03-安装第1个企业 CA-013-CA01
作者:学 无 止 境 QQ交流群:454544014 注意: <企业云桌面>系列博文是<企业云桌面规划.部署与运维实践指南>的基础部分,因为书中内容涉及非常多,非常全面,所以基 ...
- SAAS 何以“免费”实现盈利
本文讲的是SAAS 何以"免费"实现盈利,[IT168 资讯]"天下没有免费的午餐",然而众多厂商却恰恰打出了免费这张王牌,且做出了不小的成绩,淘宝就凭借免费淘 ...
- Java网络编程从入门到精通(27):关闭服务端连接
在客户端和服务端的数据交互完成后,一般需要关闭网络连接.对于服务端来说,需要关闭Socket和ServerSocket. 在关闭Socket后,客户端并不会马上感知自已的Socket已经关闭,也就是说 ...
- Java 线程池(ThreadPoolExecutor)原理分析与实际运用
在我们的开发中"池"的概念并不罕见,有数据库连接池.线程池.对象池.常量池等等.下面我们主要针对线程池来一步一步揭开线程池的面纱. 有关java线程技术文章还可以推荐阅读:< ...
- 经过踩坑,搭建成功的Appium自动化测试环境
因为最近本人准备搞app自动化,所以就搭建环境过程记录下来(主要踩过好几个坑) 期间有点烦躁,后面调整了下心态还是成功弄好了. 一.Appium环境搭建准备软件 所需要到的软件如下: 1.安装JDK1 ...
- swupdate 之 readback handler
背景 使用 swupdate 作为 OTA 方案 ,有项目要求在写入数据到分区之后需要再次读出校验. 初步实现:readout-verify attribute 初步分析有两种方式 方案一 在每一笔数 ...
- 201771010113 李婷华 《面向对象程序设计(java)》第十五周总结
一.理论知识部分 JAR文件 Java程序的打包:程序编译完成后,程序员将.class文件压缩打包为.jar文件后,GUI界面程序就可以直接双击图标运行. .jar文件(Java归档)既可以包含类文件 ...