一、概念
Gradle Plugin 的作用是什么?
- 模块化构建脚本的功能
- 公共的功能可以抽取出来成为插件,可以供多个 Module (build.gradle)使用,增加复用性。
在 Android Studio 中gradle作为主要的构建工具,其核心工作任务在于执行一系列的Task。而 plugin 在 gradle 构建过程又扮演着举足轻重的角色,有时为了完成相应的构建任务必须通过引入相应的插件来辅助,这些插件中定义了构建Project需要的一系列Task,并且负责执行相应的Task,比如构建android应用 'com.android.application',构建 Library 的 'com.android.library'。 除了系统自带的插件外,有时候我们也需要开发属于我们自己的plugin,比如热修复,插件化开发中基本上都有可能会去自定义插件。
二、定义gradle plugin 的几种方式
自定义插件主要有三种方式:
1、直接在 module 的 build.gradle 中开发
2、创建当前项目使用的插件
3、创建通用的插件,发布到maven
2.1 build.gradle 中开发
我们在自己module 的 build.gradle 中编写代码
apply plugin: 'com.android.application'
apply plugin: HelloPlugin
class HelloPlugin implements Plugin{
@Override
void apply(Project project) {
project.task('testPlugin') {
println 'hello, plugin!'
}
}
}
上面我们定义了一个名为HelloPlugin的插件,然后其中定义了testPlugin 的task,下面我们测试看看效果,在Terminal 中执行 ./graadlew testPlugin 命令。
当然除了可以定义 task,还有很多其他用处,这里以 task 为例,看如何定义Gradle Plugin
2.2 创建当前项目使用的插件
1、新建一个类型为Java Library的Module,名字为buildSrc,注意这个名字只能为buildSrc,如果不是这个名称,这里是无法apply包名的,会提示找不到。buildSrc
这个module是预留的module,会从这个module下搜寻gradle plugin。(或者直接在项目下新建一个 buildSrc 的文件夹,在添加build.gradle文件 和 src/main 目录)
2、除build.gradle,src/main外,其他文件都删除掉,删除main下的文件。
3、在src/main下新建groovy文件夹。
4、在groovy文件夹下新建package,包名随便取,例如com.daddyno1.buildsrc
。
5、在package下创建.groovy的文件,例如MyPlugin.groovy。
6、在跟 groovy 平级创建目录:resources/META-INF/gradle-plugins
7、在resources/META-INF/gradle-plugins
下创建 ***.properties
。注意:***就是以后 apply plugin:'***'
的标识。本例中用:com.daddyno1.properties
8、编辑 com.daddyno1.properties
内容,标识真正的Plugin实现类,如:implementation-class=com.daddyno1.buildsrc.MyPlugin
9、修改 build.gradle
文件:
apply plugin: 'groovy'
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
//Creates a dependency on the Groovy that is distributed with the current version of Gradle.
implementation localGroovy()
//Creates a dependency on the API of the current version of Gradle.
implementation gradleApi()
}
sourceCompatibility = "8"
targetCompatibility = "8"
整体项目目录如下:
MyPlugin.groovy 如下:
package com.daddyno1.buildsrc
import org.gradle.api.Plugin
import org.gradle.api.Project
class MyPlugin implements Plugin{
@Override
void apply(Project project) {
println "========================= start ======================="
println "========================= end ======================="
}
}
在需要用到 plugin
的 module
中使用 apply plugin: 'com.daddyno1'
编译一下看效果:
2.3 创建通用的插件,发布到maven
略,具体参考:https://www.jianshu.com/p/6ec6b06cb5d6 。 其实跟第二种差别不大,就是使用了 maven plugin
把代码发布到仓库。
三、插件扩展 Extension
什么是扩展插件?
扩展插件 Extension 就是用于 Plugin 与 Project 通讯用的。
我们可以在 build.gradle 中通过配置 Extension 相关属性,然后将这个 Extension 这个对象传递给我们自定义的Plugin。 更详细的举例参考(https://www.jianshu.com/p/ffd6153ace1d)
四、通过学习 hugo (https://github.com/JakeWharton/hugo)能够获得什么
1、通过面向切面的方式(AspectJ)实现对方法的性能检测。
2、定义Android Gradle Plugin,更好的理解 Plugin的作用 (公共的功能可以抽取出来成为插件,可以供多个 Module (build.gradle)使用,增加复用性。)
3、Plugin Extension 的使用
参考:
https://www.jianshu.com/p/ffd6153ace1d
https://www.jianshu.com/p/6ec6b06cb5d6