自动重命名android 里面的versionName字段(创建一个自定的gradle插件)
为毛开发这个屌功能,你们这些辣鸡开发都知道吧。
那么,我回答问题之前我先问一个问题,你们所有的apk自动生成一样的名字?当然不,应用的名字就像2.3 13.1.0——2342等等。这个似乎对发布一个版本已经足够了,但是这个应用是处于正在开发,应用程序的名字最好能提供更多的信息。
我发现这个方法对我的团队非常的有用,每个团队成员开发不同的功能,这个工具就会自动的根据开发的功能重命名,所以不同的构建系统的模块基于不同的开发功能命名,例如:测试,产品作者,代码整合。
自定义gradle插件
作为一个开发者日常开发就用到了几个gradle的插件,比如com.android.application 是用于android app的插件。插件将让我们操作和扩展我们的构建系统非常方便或者让我们指定一些设置。实际上,这就是我们想要的功能,修改默认的构建系统并让它修改viersionname字段。
有三种不同的方法去创建一个gradle的插件。构建gradle插件文档 ,但是我们将会使用一个buildSrc文件(文件找不到?看看文档吧,在根目录下创建一个buildSrc文件夹,然后sync一下。就可以哒),主要因为它简单,而且它会添加到你的仓库中。另一方面,插件会被附到你的项目上,不会被重用。
1.首先我需要在gradle的编译文件夹中创建一个proper的文件(提示:同步之后,gradle 会检测到groovy文件夹并且会标记成图片这样。)所以,构建进程会编译每个在这个文件夹下的代码。
2.然后我们创建一个插件文件夹(CustomPlugin.groovy) 在刚才那个包下。这个插件的主要功能是会创建一个gradle的工作task,其实就是为了去修改app versionName并且把它添加到任务流程中。我们在编写拆件之前创建一个gradle 的修改app名字的task。
gradle task
正如猜测的那样,一个task在一个构建进程中只有一个实例对现实跟。下一步我们就要自定义一个修改app的名字的task,类似android构建系统里面的task一样。
就想其它的task一样,我们需要继承DefaultTask 并且必须实现默认方法run
class RenameAppVersionNameTask extends DefaultTask {
@TaskAction
def run() {
project.configure(project) {
// Check if plugin works on an Android module
if (it.hasProperty("android")) {
// Iterate over app build variants (build types + flavors)
project.android.applicationVariants.all { variant ->
// Only change debug build type variants
if (variant.buildType.name == project.android.buildTypes.debug.name) {
// Rename versionName
def customVersionName = variant.mergedFlavor.versionName
variant.mergedFlavor.versionName = customVersionName + " custom"
}
}
}
}
}
RenameAppVersionNameTask() {
group = 'customPlugin'
description = 'Renames versionName of the app depends on the current git branch name'
}
}
task 依附
我们已经设计了一个task修改VersionName,现在我们要实现gradle插件并且把这个插件加到构建系统中去。
自动Android构建给app加入了versionName信息,我们必须确定task相关的功能会在android构建系统开始之前出发。下面是prebuild 能够在构建之前完成相关的任务。
class CustomPlugin implements Plugin<Project> {
@Override
void apply(Project project) {
project.task('renameAppVersionName', type: RenameAppVersionNameTask)
project.tasks.getByName('preBuild').dependsOn('renameAppVersionName')
}
}
应用插件:
这个我们已经创建的插件我们能够应用到android application module里面(甚至是android library modlue里面)
只需要应用这个插件在build。gradle文件中,就像下面这样。
apply plugin: CustomPlugin