Gradle 本身是基于 Groovy 语法, 支持批量打包, 非常方便, 大家都知道的. 但在批量打包时, 肯定有个包名重命名的需求, 比如当前项目的 versionName 是 1.2.0, 用户在设备安装APK后所看到的版本号就是 v1.2.0. 当然, APK 应用还有个名称, 比如叫 AppName (当然, 这个名字随意啦, 一般都是英文单词组成), 然后有 3 个渠道, 比如是 appchina, tencent 和 hiapk.
然后, 一般默认打包出来的 APK 文件名都是类似这样: AppName-appchina-release.apk. 现在我们想在批量打包时, 还对这个名字完全重命名, 变成: AppName_appchina_v1.2.0, AppName_hiapk_v1.2.0 和 AppName_tencent_v1.2.0.
之前很流行一句话是吧, Talk is cheap, show me your code. 来吧, 直接上代码, 在项目的 build.gradle 文件中加入仅仅是以下少量的代码:
productFlavors {
tencent {
manifestPlaceholders = [CHANNEL_VALUE: "tencent"]
}
hiapk {
manifestPlaceholders = [CHANNEL_VALUE: "hiapk"]
}
appchina {
manifestPlaceholders = [CHANNEL_VALUE: "appchina"]
}
mumayi {
manifestPlaceholders = [CHANNEL_VALUE: "mumayi"]
}
}
applicationVariants.all { variant ->
variant.outputs.each { output ->
output.outputFile = new File(
output.outputFile.parent,
output.outputFile.name.replace(output.outputFile.name, "AppName_"+variant.productFlavors[0].name+"_v${variant.versionName}.apk"))
}
}
versionName 的值随意, 这里是 1.2.0
有了前面的条件前提, 看上面的代码应该很容易理解. 用自定义的文件名直接替换整个文件名, 自定义的文件名前缀是 "AppName_", 后面加上当前的渠道号名称字符串, 再拼接上下划线 "_" 和当前 build.gradle 文件中 versionName 的值. 也就是, 最终文件名为, AppName_当前渠道号名称_v1.2.0.apk. 整个命名关键的两个变量是, 当前渠道号名称 和 版本号, 有了这两个值你就能按自己的需求重命名APK了对吧, 当然 Gradle 所支持 Groovy 的丰富语法不仅仅这点地方体现, 自己还可以在文件中编写获取新的命名的方法, 获取当前打包的日期, 或者获取versionCode, 等等. 这个, 以此抛砖引玉自行体会了哈.
最后打包结果是这样:
大功告成~