深度探索 Gradle 自动化构建技术(四、自定义 Gradle 插件)

releaseInfo {
versionCode = “1”
versionName = “1.0.0”
versionInfo = “第一个版本~”
fileName = “releases.xml”
}

2、自定义 Task

使用自定义扩展属性 Extension 仅仅是为了让使用插件者有配置插件的能力。而插件还得借助自定义 Task 来实现相应的功能,这里我们需要创建一个更新版本信息的 Task,我们将其命名为 ReleaseInfoTask,其具体实现代码如下所示:

/**
* 更新版本信息的 Task
*/
class ReleaseInfoTask extends DefaultTask {

ReleaseInfoTask() {
// 1、在构造器中配置了该 Task 对应的 Task group,即 Task 组,并为其添加上了对应的描述信息。
group = ‘version_manager’
description = ‘release info update’
}

// 2、在 gradle 执行阶段执行
@TaskAction
void doAction() {
updateVersionInfo();
}

private void updateVersionInfo() {
// 3、从 realeaseInfo Extension 属性中获取相应的版本信息
def versionCodeMsg = project.extensions.releaseInfo.versionCode;
def versionNameMsg = project.extensions.releaseInfo.versionName;
def versionInfoMsg = project.extensions.releaseInfo.versionInfo;
def fileName = project.extensions.releaseInfo.fileName;
def file = project.file(fileName)
// 4、将实体对象写入到 xml 文件中
def sw = new StringWriter()
def xmlBuilder = new MarkupBuilder(sw)
if (file.text != null && file.text.size() <= 0) {
//没有内容
xmlBuilder.releases {
release {
versionCode(versionCodeMsg)
versionName(versionNameMsg)
versionInfo(versionInfoMsg)
}
}
//直接写入
file.withWriter { writer -> writer.append(sw.toString())
}
} else {
//已有其它版本内容
xmlBuilder.release {
versionCode(versionCodeMsg)
versionName(versionNameMsg)
versionInfo(versionInfoMsg)
}
//插入到最后一行前面
def lines = file.readLines()
def lengths = lines.size() - 1
file.withWriter { writer ->
lines.eachWithIndex { line, index ->
if (index != lengths) {
writer.append(line + ‘\r\n’)
} else if (index == lengths) {
writer.append(‘\r\r\n’ + sw.toString() + ‘\r\n’)
writer.append(lines.get(tlengths))
}
}
}
}
}
}

首先,在注释1处,我们 在构造器中配置了该 Task 对应的 Task group,即 Task 组,并为其添加上了对应的描述信息。接着,在注释2处,我们 使用了 @TaskAction 注解标注了 doAction 方法,这样它就会在 gradle 执行阶段执行。在注释3处,我们 使用了 project.extensions.releaseInfo.xxx 一系列 API 从 realeaseInfo Extension 属性中了获取相应的版本信息。最后,注释4处,就是用来 实现该 task 的核心功能,即将实体对象写入到 xml 文件中。

可以看到,一般的插件 task 都会遵循前三个步骤,最后一个步骤就是用来实现插件的核心功能。 当然,最后别忘了在我们的 CustomGradlePlugin 的 apply 方法中加入下面代码去创建 ReleaseInfoTask 实例,代码如下所示:

// 创建用于更新版本信息的 task
project.tasks.create(“releaseInfoTask”, ReleaseInfoTask.class)

四、变体(Variants)的作用

要理解 Variants 的作用,就必须先了解 flavor、dimension 与 variant 这三者之间的关系。在 android gradle plugin V3.x 之后,每个 flavor 必须对应一个 dimension,可以理解为 flavor 的分组,然后不同 dimension 里的 flavor 会组合成一个 variant。示例代码如下所示:

flavorDimensions “size”, “color”

productFlavors {
JsonChao {
dimension “size”
}
small {
dimension “size”
}
blue {
dimension “color”
}
red {
dimension “color”
}
}

在 Android 对 Gradle 插件的扩展支持之中,其中最常用的便是 利用变体(Variants)来对构建过程中的各个默认的 task 进行 hook。关于 Variants 共有 三种类型,如下所示:

  • 1)、applicationVariants:只适用于 app plugin。
  • 2)、libraryVariants:只适用于 library plugin。
  • 3)、testVariants:在 app plugin 与 libarary plugin 中都适用。

1、使用 applicationVariants

为了讲解 applicationVariants 的作用,我们需要先在 app moudle 的 build.gradle 文件中配置几个 flavor,代码如下所示:

productFlavors {
douyin {}
weixin {}
google {}
}

1)、使用 applicationVariants.all 在配置阶段之后去获取所有 variant 的 name 与 baseName

然后,我们可以 使用 applicationVariants.all 在配置阶段之后去获取所有 variant 的 name 与 baseName。代码如下所示:

this.afterEvaluate {
this.android.applicationVariants.all { variant ->
def name = variant.name
def baseName = variant.baseName
println “name:  n a m e ,   b a s e N a m e :   name, baseName:  name, 

  • 23
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值