Android-如何自定义gradle插件

自定义gradle插件可以实现定制自己的构建流程,以达到复用目的;

##1. 自定义插件方式
自定义插件有三种方式

  1. 添加脚步

    在你的app项目的build.gradle中直接使用groovy脚步语言编写插件
    这样方式好处是插件能自动变异且被包含到构建脚步中,你无需做任何处理;缺点是插件到逻辑都放到都build.gradle中去了,增加了脚步的复杂度且无法复用

  2. 添加buildSrc工程

    在根目录添加buildSrc子Module,这种方式比前一种好些,将插件的代码统一放到buildSrc工程中去了,但还是做不到别的工程能够使用它

  3. 单独新建一个工程

    这种方式最优,将插件集中在一个单独的工程中,且发布到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 目录结构如下

  1. 新建自己插件类

    图片中的二个类都是groovy类(路径必须是在src/main/groovy下),其实就是对应第一种在gradle脚步中写的HelloPlugin和HelloConfigExtension类;

  2. 新建配置文件

    在groovy同一层级新建resouces/META-INF/gradle-plugins目录
    新建一个名为youPluginId.properties 在里面添加

    注意:这里面的文件的名称就是你自定义插件的id,当你在主工程引用是需要使用此插件id号进行引用

    #这里面要替换成你自己的全路径插件名
    implementation-class=com.fzm.plugin.PostBuildPlugin
    
  3. 新建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 第三种------单独工程

  1. 插件的编写

    新建一个Android工程,再新建一个专门编写插件的module

    复制第二种方法中buildSrc中的src和build.gradle文件到plugin moudle中
    因为第三种可以将自己插件发布到gradle上去,所以这里的build.gradle需要修改
    格式如下,参考示例Demo

    plugins {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"
    
  2. 插件的发布

    先去gradle官网注册账号,有的话直接登录

    展开AS中右侧工具栏,找到你插件的module->plugin portal 右击 login 执行即可

    顺利的话登录会成功,点击控制台链接即可,接下来准备发布操作,右击publishPlugins执行run即可,顺利话,发布成功的话你会看到这样

    注意:每次发布的版本都不能是之前存在过的,否则会发布失败

    如果想直接通过控制台操作,可以使用如下命令

    ./gradlew yourPluginModuleName:publishPlugins
    
  3. 引用
    当你发布插件成功后,你可以去官网搜索你发布的插件(通过插件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 差异(也许对你灰常有用哦)

  1. 插件引用方式

    不知道大家又没注意这三种引用插件的方式其实是有差别的
    第一种

    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相关动作

  2. 插件的构成:打包后的插件其实就是一个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插件相关推荐

  1. 创建第一个适用于Android的自定义Gradle插件-第2部分:在构建时生成资源

    A hands on tutorial to get started with adding custom functionality to your Android builds using Kot ...

  2. Android组件化开发实践(九):自定义Gradle插件

    本文紧接着前一章Android组件化开发实践(八):组件生命周期如何实现自动注册管理,主要讲解怎么通过自定义插件来实现组件生命周期的自动注册管理. 1. 采用groovy创建插件 新建一个Java L ...

  3. 【Android Gradle 插件】自定义 Gradle 插件优化图片 ① ( Android 中的 WebP 图片格式使用 | WebP 格式转换 | WebP 参考文档 )

    文章目录 一.Android 中的 WebP 图片格式使用 二.WebP 格式转换 三.WebP 参考文档 Android Plugin DSL Reference 参考文档 : Android St ...

  4. Android 自定义gradle插件

    android自定义gradle插件的步骤 1.首先我们新建一个android项目 2.然后新建一个android module a.删除一些不需要的文件目录,然后新建groovy,resources ...

  5. 使用AndroidStudio创建自定义gradle插件并被引用实战例子

    项目中引入自定义Gradle plugin一般有三种方法: 直接写在 build.gradle中. plugin源码放到rootProjectDir/buildSrc/src/main/groovy目 ...

  6. 通过自定义Gradle插件修改编译后的class文件

    我的简书同步发布:通过自定义Gradle插件修改编译后的class文件 转载请注明出处:[huachao1001的专栏:http://blog.csdn.net/huachao1001] 或许你会觉得 ...

  7. 自定义Gradle插件之Hello World

    自定义Gradle插件之"Hello World" 0.新建一个用于开发这个插件的文件夹 1.确定Plugin id Plugin id一般定义为java 包名. 由字母和数字及& ...

  8. Gradle学习第一篇——自定义Gradle插件

    纸上得来终觉浅,绝知此事要躬行. 自定义Gradle插件有三种方法,各有优劣处,同类博客文章很多但是有的语法已经过时了,笔者运行环境 Android Studio Dolphin && ...

  9. 【错误记录】自定义 Gradle 插件报错 ( Could not find implementation class x for plugin x specified in jar:file )

    文章目录 一.报错信息 二.解决方案 一.报错信息 参考 [Android Gradle 插件]自定义 Gradle 插件模块 ④ ( META-INF 中声明自定义插件的核心类 | 在应用中依赖本地 ...

最新文章

  1. linux gdb 运行的程序,GDB(十)--调试正在运行的进程
  2. 2018.8.14笔记
  3. 数据链路层介质访问控制——信道划分、随机访问和轮询访问
  4. 气象ts评分_给大家分享一个格点插值到站点然后TS评分的程序
  5. 全国计算机等级考试题库二级C操作题100套(第60套)
  6. linux下被遗忘的gpio_keys按键驱动
  7. java xml 读取库_Java开发中读取XML与properties配置文件的方法
  8. 【Web】JavaWeb开发技术笔记整理
  9. android开源2016_2016年十大开源项目
  10. SpringBoot中使用Mybatis-plus整合PageHelper分页插件踩坑
  11. 字符串用法大全(源码解析,建议收藏!)
  12. NLP—1.自然语言处理的基础任务与应用
  13. Linux中grep命令使用方法
  14. matlab求解多元函数的偏导数diff
  15. 悲伤的时候总会想起什么
  16. regopenkeyexfailed什么意思_外置网卡驱动安装出现RegOpenKeyEx Failed,怎么回事?
  17. Kafak入门第三课:kafka数据格式及各版本占用的空间大小对比
  18. 金泰克/tigo S300 240G SM2256K H27QFG8PEM5R 完整开盘教程
  19. Docker的安装与基本使用(一)---使用Docker的前提条件和三要素
  20. tcp协议一定要有服务器吗,复习TCP协议——看这篇就够了

热门文章

  1. java和android 语法区别_PET和PTE的区别在哪里?出国留学到底选哪个
  2. java 封装优化工具_利用Java注解的简单封装的一次优化
  3. scws sphinx mysql_Sphinx+Scws 搭建千万级准实时搜索应用场景详解
  4. 三、ResNet50预置算法提高美食分类识别精确度
  5. 三十四、R语言数据分析实战
  6. 十三、开多线程,咱们一起来斗图
  7. 下一代对话系统中的关键技术(下篇)
  8. 成为大厂AI算法工程师,“NLP/CV”都是你必须过的坎!
  9. 直播|百度AI开发者大会深度学习直播课程表
  10. 好看的论文千篇一律,有趣的Github项目万里挑一!