Szhangbiao's blog

记录一些让自己可以回忆的东西

0%

在Bitrise打包Android如何格式化apk name

Bitrise 是一个移动应用程序开发平台,使数以万计的开发人员能够自动化集成、测试和部署。通过与开发人员熟悉和喜爱的服务的 200 多个集成,Bitrise 使开发人员可以自由地迭代并改进了他们的工作流程,以获得更快、更好的结果。它提供了 300 个多个步骤和集成,以便轻松连接您在移动开发工作流程中使用的流程和服务。

背景

这个项目是我司跟澳洲公司合作的一个足球体育类项目,他们为了解决每次发布应用时都要手动打包的痛点,决定引入 Bitrise 平台来自动化部署应用发布给 QA 或者生产环境。由于我之前有使用过 Bitrise 的经验,相关的一些任务也就交给我了,在完成一些配置正常使用过一段时间后,QA 提出了每次给到的 Apk 都是一样的 Name,在多个版本或平台的 apk 一起给到的情况下无法做区分,于是就有了这个任务给到我。

解决过程

在拿到任务的第一时间,我首先想到的是在build.gradle中添加一个 rename 方法类似下面这种代码:

1
2
3
4
5
6
7
8
def renameAPK(variant, defaultConfig, buildType) {
variant.outputs.each { output ->
def formattedDate = new Date().format('yyMMdd')
def file = output.packageApplication.outputFile
def fileName = applicationName + "_V" + defaultConfig.versionCode + "_" + formattedDate + "_" + buildType + ".apk"
output.packageApplication.outputFile = new File(file.parent, fileName)
}
}

但是这个方案被 Leader 否决了,他觉得用 Bitrise 实现更好些,于是这个方案就放弃了。
在经过 Google 的一系列搜索,虽然没有直接找到解决方案,但是相应的找到了 iOS 在 Bitrise 上的一个实现:

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
set -ex

# config
new_ipa_path="${BITRISE_DEPLOY_DIR}/MyNewAppName-${BITRISE_BUILD_NUMBER}.ipa"

# rename the ipa
mv "$BITRISE_IPA_PATH" "$new_ipa_path"
# expose the new path/value as an env var, for the same key
# overwriting the previous value
envman add --key BITRISE_IPA_PATH --value "$new_ipa_path"

这是在 Bitrise 的 Workflow 中产生 ipa 文件的 Step 后面加的一个 rename 脚本。
但是在 Android 的 Deploy 的 Workflow 中 Generate Apk的 step 并没有把 Apk 的 VersionName 和 VersionCode 保存到环境变量中,所以这里需要添加一个Apk Info的 step 来把这两个信息保存到环境变量中。

最终方案

所以相应的 Android 端的解决方案就是:

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
set -ex
# ANDROID_APP_VERSION_NAME 和 ANDROID_APP_VERSION_CODE 是 Apk Info 的Step获取并set到环境变量中
# OUTPUT_APK_SUFFIX 是自定义在Env Vars中,对应不同的平台
new_apk_path="${BITRISE_DEPLOY_DIR}/V${ANDROID_APP_VERSION_NAME}_${ANDROID_APP_VERSION_CODE}_${OUTPUT_APK_SUFFIX}.apk"
# 由 Generate Apk 的 Gradle Runner 的Step运行后set到环境变量中
# rename the apk
mv "$BITRISE_APK_PATH" "$new_apk_path"
# expose the new path/value as an env var, for the same key
# overwriting the previous value
envman add --key BITRISE_APK_PATH --value "$new_apk_path"

至此,我便完成了这个任务。