对apk文件进行重命名是几乎每个项目都会做的配置。虽然这个配置通常很简单,而且有固定的写法,但如果能一行代码就完成这个配置,那是不是更香呢?
在看Gradle插件相关的文章的时候,我受到了启发,如果把这个配置逻辑写成插件,只需要暴露命名的模板就可以了。
所以Android Apk Naming Plugin (AANP)就诞生了。AANP的使用非常简单,下面是一个例子,添加依赖后,使用如下代码配置命名规则:
1 | apkNaming { |
配置之后,会得到如下命名的apk文件:apk_naming_demo-1.0.0(1)-free-google-debug-2021-02-24-main.apk
。
插件的依赖方式,在项目根目录下的 build.gradle 文件中添加以下配置:
1 | buildscript { |
在Application module中应用插件:
1 | plugins { |
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(): 秒时间戳
- date.format(String): 例如:
- 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