Android如何自定义Gradle插件
Android-如何自定义gradle插件
自定义gradle插件可以实现定制自己的构建流程,以达到复用目的;
##1. 自定义插件方式
自定义插件有三种方式
添加脚步
在你的app项目的build.gradle中直接使用groovy脚步语言编写插件
这样方式好处是插件能自动变异且被包含到构建脚步中,你无需做任何处理;缺点是插件到逻辑都放到都build.gradle中去了,增加了脚步的复杂度且无法复用添加buildSrc工程
在根目录添加buildSrc子Module,这种方式比前一种好些,将插件的代码统一放到buildSrc工程中去了,但还是做不到别的工程能够使用它
单独新建一个工程
这种方式最优,将插件集中在一个单独的工程中,且发布到gradle后,别的工程能够轻松复用它
##2. 自定义插件实现
###2.1 第一种------添加脚步
在你的主工程app module的build.gradle中直接添加脚步
Example:
class HelloConfigExtension {String msg = 'Hello gradle plugin'
}class HelloPlugin implements Plugin<Project> {void apply(Project project) {// Add the 'hello' extension objectdef extension = project.extensions.create('hello', HelloConfigExtension)project.task('hello') {doLast {println extension.msg}}}
}// Apply the plugin
apply plugin: HelloPlugin//Config the extension
hello{msg = 'hello from gradle'
}
在控制台输入 ./gradlew -q hello
> gradle -q hello
hello from gradle
上述命令表明需要执行一个hello任务 -q表示除去打印日志(错误日志除外);因为我们在插件中定义了一个hello任务,这个任务就是打印从gradle传入的msg参数;
这样一个简单的插件就实现了,当然完全可以根据自己的业务需求实现自己的插件
##2.2 第二种------添加buildSrc Module
在根工程中添加手工添加一个buildSrc 目录结构如下
新建自己插件类
图片中的二个类都是groovy类(路径必须是在src/main/groovy下),其实就是对应第一种在gradle脚步中写的HelloPlugin和HelloConfigExtension类;
新建配置文件
在groovy同一层级新建resouces/META-INF/gradle-plugins目录
新建一个名为youPluginId.properties 在里面添加注意:这里面的文件的名称就是你自定义插件的id,当你在主工程引用是需要使用此插件id号进行引用
#这里面要替换成你自己的全路径插件名 implementation-class=com.fzm.plugin.PostBuildPlugin
新建build.gradle
在buildSrc目录下新建,并添加如下脚步即可
apply plugin: 'groovy'dependencies {compile gradleApi()compile localGroovy() }repositories {mavenCentral() }
这样第二中自定义插件写法步骤就介绍完毕类,如何引用呢?很简单
,你可以在你的主工程app moudle的build.gradle 添加如下脚步
```
apply plugin: 'you plugin id'//example
//apply plugin: 'com.fzm.post.build.plugin'
```
2.3 第三种------单独工程
插件的编写
新建一个Android工程,再新建一个专门编写插件的module
复制第二种方法中buildSrc中的src和build.gradle文件到plugin moudle中
因为第三种可以将自己插件发布到gradle上去,所以这里的build.gradle需要修改
格式如下,参考示例Demoplugins {id "com.gradle.plugin-publish" version "0.9.10" }// Apply other plugins here, e.g. java plugin for a plugin written in java or // the groovy plugin for a plugin written in groovyapply plugin:'groovy'repositories {jcenter() }dependencies {compile gradleApi()compile localGroovy() //not needed for Java plugins// other dependencies that your plugin requires }// Unless overridden in the pluginBundle config DSL, the project version will // be used as your plugin version when publishing version = "plugin version" group = "plugin group name"// The configuration example below shows the minimum required properties // configured to publish your plugin to the plugin portal pluginBundle {website = 'project website'vcsUrl = 'project repository address'description = 'plugin description'tags = ['xxx', 'xxx','xxx']plugins {postBuildPlugin {id = 'your plugin id'displayName = 'your plugin name'}} }sourceCompatibility = "1.8" targetCompatibility = "1.8"
插件的发布
先去gradle官网注册账号,有的话直接登录
展开AS中右侧工具栏,找到你插件的module->plugin portal 右击 login 执行即可
顺利的话登录会成功,点击控制台链接即可,接下来准备发布操作,右击publishPlugins执行run即可,顺利话,发布成功的话你会看到这样
注意:每次发布的版本都不能是之前存在过的,否则会发布失败
如果想直接通过控制台操作,可以使用如下命令
./gradlew yourPluginModuleName:publishPlugins
引用
当你发布插件成功后,你可以去官网搜索你发布的插件(通过插件id),已了解你发布插件的信息,里面有如何使用自自定义插件的说明别的工程只要在根工程build.gradle添加类似如下代码即可
//较高gradle版本写法:Build script snippet for plugins DSL for Gradle 2.1 and later: plugins {id "com.fzm.post.build.plugin" version "1.0.21" }//低版本写法或者动态配置时需要 //Build script snippet for use in older Gradle versions or where dynamic configuration is required: buildscript {repositories {maven {url "https://plugins.gradle.org/m2/"}}dependencies {classpath "gradle.plugin.com.fzm.post.build:post-build-plugin:1.0.21"} }apply plugin: "com.fzm.post.build.plugin"
本人发现高版本写法也可以放到主工程的build.gradle前提要放在apply plugin:xxxxx前面;而第二中写法比较灵活,因为apply plugin:"your plugin id"可以放到 别的插件之后,这样你可以做很多的事情;
2.4 差异(也许对你灰常有用哦)
插件引用方式
不知道大家又没注意这三种引用插件的方式其实是有差别的
第一种apply plugin: yourPluginName
第二种:
app plugin: yourPluginId
第三种:
//way 1 //add in app project's build.gradleplugins {id 'pluginId' version "plugiVersion" }//way 2 //add in root project's build.gradle buildscript {repositories {maven {url "https://plugins.gradle.org/m2/"}}dependencies {classpath "gradle.plugin.com.fzm.post.build:post-build-plugin:1.0.21"} }//add in app project's build.gradle apply plugin: "com.fzm.post.build.plugin"
前二中都是直接在主工程build.gradle 直接使用且可以放到apply plugin: ‘com.android.application’ 后面哦,
第三种第一种引用方式只能放到apply plugin: xxx前面这种差异意味着第三种第一个方式不能拦截assemleDebug/Release之类的任务,而前二种则是可以的,如果要hook的话就使用灵活的第三种第二个方式,就能实现hook相关动作
插件的构成:打包后的插件其实就是一个jar它包含java,groovy这些类编译成的字节码,像python脚本文件会自动丢弃,所以你如果想在插件中调用python之类需要指定路径,python文件不可以放到插件中去
2.5 插件的调试
1. 调试
方法一:开发插件时建议先使用第二种方式,这样便于调试错误;等插件功能开发完毕后,再使用第三种方式发布集成引用;
方法二:使用本地仓库调试
在你的插件模块的build.gradle文件加入如下代码
repositories {mavenLocal() //addmavenCentral()
}// 指定本地上传的路径
def localMavenRepo = 'file://' + new File(System.getProperty('user.home'), '.m2/repository').absolutePath //adduploadArchives {repositories {mavenDeployer {repository(url: localMavenRepo) //addsnapshotRepository(url: localMavenRepo) //add}}
}
./gradlew clean install
再执行上传操作即可(uploadArchives)
2. 其他工程引用
buildscript {repositories {mavenLocal() //addmavenCentral()...}dependencies {classpath 'yougroup:name:1.0.0' //add}
}allprojects {repositories {mavenLocal() //addmavenCentral()...}
}
Android如何自定义Gradle插件相关推荐
- 创建第一个适用于Android的自定义Gradle插件-第2部分:在构建时生成资源
A hands on tutorial to get started with adding custom functionality to your Android builds using Kot ...
- Android组件化开发实践(九):自定义Gradle插件
本文紧接着前一章Android组件化开发实践(八):组件生命周期如何实现自动注册管理,主要讲解怎么通过自定义插件来实现组件生命周期的自动注册管理. 1. 采用groovy创建插件 新建一个Java L ...
- 【Android Gradle 插件】自定义 Gradle 插件优化图片 ① ( Android 中的 WebP 图片格式使用 | WebP 格式转换 | WebP 参考文档 )
文章目录 一.Android 中的 WebP 图片格式使用 二.WebP 格式转换 三.WebP 参考文档 Android Plugin DSL Reference 参考文档 : Android St ...
- Android 自定义gradle插件
android自定义gradle插件的步骤 1.首先我们新建一个android项目 2.然后新建一个android module a.删除一些不需要的文件目录,然后新建groovy,resources ...
- 使用AndroidStudio创建自定义gradle插件并被引用实战例子
项目中引入自定义Gradle plugin一般有三种方法: 直接写在 build.gradle中. plugin源码放到rootProjectDir/buildSrc/src/main/groovy目 ...
- 通过自定义Gradle插件修改编译后的class文件
我的简书同步发布:通过自定义Gradle插件修改编译后的class文件 转载请注明出处:[huachao1001的专栏:http://blog.csdn.net/huachao1001] 或许你会觉得 ...
- 自定义Gradle插件之Hello World
自定义Gradle插件之"Hello World" 0.新建一个用于开发这个插件的文件夹 1.确定Plugin id Plugin id一般定义为java 包名. 由字母和数字及& ...
- Gradle学习第一篇——自定义Gradle插件
纸上得来终觉浅,绝知此事要躬行. 自定义Gradle插件有三种方法,各有优劣处,同类博客文章很多但是有的语法已经过时了,笔者运行环境 Android Studio Dolphin && ...
- 【错误记录】自定义 Gradle 插件报错 ( Could not find implementation class x for plugin x specified in jar:file )
文章目录 一.报错信息 二.解决方案 一.报错信息 参考 [Android Gradle 插件]自定义 Gradle 插件模块 ④ ( META-INF 中声明自定义插件的核心类 | 在应用中依赖本地 ...
最新文章
- linux gdb 运行的程序,GDB(十)--调试正在运行的进程
- 2018.8.14笔记
- 数据链路层介质访问控制——信道划分、随机访问和轮询访问
- 气象ts评分_给大家分享一个格点插值到站点然后TS评分的程序
- 全国计算机等级考试题库二级C操作题100套(第60套)
- linux下被遗忘的gpio_keys按键驱动
- java xml 读取库_Java开发中读取XML与properties配置文件的方法
- 【Web】JavaWeb开发技术笔记整理
- android开源2016_2016年十大开源项目
- SpringBoot中使用Mybatis-plus整合PageHelper分页插件踩坑
- 字符串用法大全(源码解析,建议收藏!)
- NLP—1.自然语言处理的基础任务与应用
- Linux中grep命令使用方法
- matlab求解多元函数的偏导数diff
- 悲伤的时候总会想起什么
- regopenkeyexfailed什么意思_外置网卡驱动安装出现RegOpenKeyEx Failed,怎么回事?
- Kafak入门第三课:kafka数据格式及各版本占用的空间大小对比
- 金泰克/tigo S300 240G SM2256K H27QFG8PEM5R 完整开盘教程
- Docker的安装与基本使用(一)---使用Docker的前提条件和三要素
- tcp协议一定要有服务器吗,复习TCP协议——看这篇就够了
热门文章
- java和android 语法区别_PET和PTE的区别在哪里?出国留学到底选哪个
- java 封装优化工具_利用Java注解的简单封装的一次优化
- scws sphinx mysql_Sphinx+Scws 搭建千万级准实时搜索应用场景详解
- 三、ResNet50预置算法提高美食分类识别精确度
- 三十四、R语言数据分析实战
- 十三、开多线程,咱们一起来斗图
- 下一代对话系统中的关键技术(下篇)
- 成为大厂AI算法工程师,“NLP/CV”都是你必须过的坎!
- 直播|百度AI开发者大会深度学习直播课程表
- 好看的论文千篇一律,有趣的Github项目万里挑一!