“一行代码”重命名Android项目构建的apk文件

cover

对apk文件进行重命名是几乎每个项目都会做的配置。虽然这个配置通常很简单,而且有固定的写法,但如果能一行代码就完成这个配置,那是不是更香呢?

在看Gradle插件相关的文章的时候,我受到了启发,如果把这个配置逻辑写成插件,只需要暴露命名的模板就可以了。

所以Android Apk Naming Plugin (AANP)就诞生了。AANP的使用非常简单,下面是一个例子,添加依赖后,使用如下代码配置命名规则:

1
2
3
4
apkNaming {
// ".apk"后缀可选
template 'apk_naming_demo-$versionName($versionCode)-$flavor["pay"]-$flavor["vendor"]-$buildType-$date-${git.branch}.apk'
}

配置之后,会得到如下命名的apk文件:apk_naming_demo-1.0.0(1)-free-google-debug-2021-02-24-main.apk

插件的依赖方式,在项目根目录下的 build.gradle 文件中添加以下配置:

1
2
3
4
5
6
7
8
buildscript {
repositories {
jcenter()
}
dependencies {
classpath "com.kyleduo.android-apk-naming:plugin:$latest_version"
}
}

在Application module中应用插件:

1
2
3
plugins {
id 'com.kyleduo.android-apk-naming'
}

AANP的内部逻辑同样很简单,基本上就是把原本需要在build.gradle进行的配置搬到了插件中。为了保持一定的灵活性,AANP使用Velocity作为模板引擎,并且注入了一系列的变量和工具类可供调用,应该能满足大部分场景的需求。下面是目前支持的变量和关键字列表。

  • projectName: 项目名称,同 project.name
  • versionCode: 版本号
  • versionName: 版本名称
  • buildType: 构建类型,Android项目默认包含 build 和 release 两个构建类型
  • flavor: 获取这次构建的 flavor 名称。这个变量是 dimension 到 name 的映射,所以需要指定 dimension 来获取 flavor 名称。比如 paid 这个 dimension 的 flavor 名称是 free,vendor 对应的是 google,那么 $flavor["paid"] 将得到 free, $flavor["vendor"] 将得到 google。
  • git: Git 相关的信息
    • git.user: git 用户名
    • git.commitId: 当前的commit id
    • git.commitIdShort: 当前的commit id 的简化版
    • git.branch: 当前分支名
  • date: 日期工具,基于构建的时间
    • date.format(String): 例如: $date.format("yyyy-MM-dd")
    • date: 直接使用 $date 会使用默认的格式化模板,同: $date.format("yyyy-MM-dd").
    • date.timestamp / date.timestamp(): 毫秒时间戳
    • date.timestampInSeconds / date.timestampInSeconds(): 秒时间戳
  • properties: 获取 Gradle project 的全部属性。非常方便从命令行注入参数并体现在命名中。 例如使用类似的命令构建 ./gradlew :app:assembleDebug -Penv=debug 你可以通过下面的方式获取 env 属性的值 $properties["env"].

目前这个插件已经在Github开源,可以访问仓库查看实现细节。虽然实现逻辑并不复杂,但是编写插件的过程对我对Gradle的结构、执行过程的理解仍然有很大的帮助。后面再总结一下Gradle相关的概念,敬请期待。

最后,希望这个插件能帮你节省一些时间,让你项目的build.gradle文件更简洁一点。

Github地址:https://github.com/kyleduo/android-apk-naming-plugin