一、传统方式
传统方式打包在 文件夹”app\release“下生成”app-release.apk“
1. 多应用易混淆问题
同一项目多变体场景
当项目存在多个不同的构建变体时,例如不同的渠道包(如应用宝渠道、华为应用市场渠道等)、不同的版本类型(免费版、付费版),每个变体都使用 “app-release.apk” 文件名,就会导致这些 APK 文件难以区分。比如在为不同渠道打包时,各个渠道可能有不同的配置和资源,若都以相同文件名保存,很容易搞混哪个 APK 对应哪个渠道,在后续的分发和测试过程中会带来极大的不便。
多项目开发场景
如果开发者同时负责多个 Android 项目的开发,每个项目都使用传统方式打包,那么在 “app\release” 文件夹下都会生成 “app-release.apk” 文件。当需要对这些 APK 进行管理、上传到应用市场或者分发给测试人员时,就无法直观地通过文件名来识别每个 APK 所属的项目,增加了误操作的风险。
2. 重命名麻烦
手动重命名效率低
每次打包完成后,如果需要对 “app-release.apk” 进行重命名以区分不同的版本或构建变体,就需要手动在文件系统中进行操作。这不仅耗费时间,而且容易出错,特别是在需要频繁打包的情况下,手动重命名会成为一项繁琐的重复性工作。
不利于自动化流程
在自动化构建和持续集成/持续部署(CI/CD)流程中,手动重命名无法与脚本和工具集成,会破坏整个流程的连贯性。例如,使用 Jenkins 或 GitLab CI 进行自动化打包时,无法自动对生成的 APK 进行有意义的命名,需要额外编写复杂的脚本来处理重命名逻辑,增加了开发和维护的成本。
3. 新老版本管理困难
版本号识别不直观
“app-release.apk” 文件名中没有包含版本号信息,无法从文件名直接看出该 APK 对应的是哪个版本。在进行版本迭代时,很难快速区分新老版本,尤其是在需要回滚到旧版本或者对比不同版本的功能时,会浪费大量时间去查找和确认版本信息。
版本归档和追溯不便
由于缺乏版本标识,在对 APK 进行归档和管理时,难以建立有效的版本历史记录。当出现问题需要追溯特定版本的 APK 时,无法快速定位到相应的文件。而且在保存多个版本的 APK 时,由于文件名相同,可能会导致旧版本被新版本覆盖,造成版本信息的丢失。
4. 缺乏环境和构建信息
无法区分构建环境
传统的文件名无法体现 APK 是在哪个环境下构建的,例如是开发环境、测试环境还是生产环境。不同环境下的 APK 可能会有不同的配置和依赖,无法通过文件名区分这些 APK 会给测试和部署工作带来困扰。
缺少构建时间等信息
文件名中没有包含构建时间等重要信息,无法直观地了解 APK 的生成时间。在进行问题排查和版本管理时,构建时间是一个重要的参考因素,缺乏该信息会增加问题定位的难度。
二、新打包方式
三、实现代码
buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}
修改为
buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'android.applicationVariants.all { variant ->variant.outputs.all {outputFileName = "未来之窗仙盟_${cyberwin_nowtime()}.apk"}}}}
四、日期函数
def cyberwin_nowtime() {return new Date().format("yyyy年MM月dd日HH_mm_ss", TimeZone.getTimeZone("UTC"))
}