赞
踩
releaseInfo {
versionCode = “1”
versionName = “1.0.0”
versionInfo = “第一个版本~”
fileName = “releases.xml”
}
使用自定义扩展属性 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 的作用,就必须先了解 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 共有 三种类型,如下所示:
为了讲解 applicationVariants 的作用,我们需要先在 app moudle 的 build.gradle 文件中配置几个 flavor,代码如下所示:
productFlavors {
douyin {}
weixin {}
google {}
}
然后,我们可以 使用 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,
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。