#Android 如何让打包出来的apk或者aab文件名更有规律?

问题背景

Android Studio中,打包项目时,不论是debug还是release,不管是apk还是未来的aab,文件名一般都是很没有辨识度的,例如

  • app-debug.apk
  • app-release.apk
  • app.aab

有什么办法让文件名更有规律一点呢?比如带上版本号之类的。

解决方法

一般使用gradle工具进行打包,通过修改build.gradle可以修改输出包的名字。
有两种做法:

方法1. 设置outputFileName

示例

applicationVariants.all {
        outputs.forEach { output ->
            if (output is com.android.build.gradle.internal.api.BaseVariantOutputImpl) {
                output.outputFileName =
                    "${applicationId}-v${versionName}(${this.versionCode})-${name}.${output.outputFile.extension}"
            }
        }
    }

输出结果

com.example.sampleproject-v1.0.0(101)_release.apk

需要注意的是
这个设置只对apk有效,对于app bundle,也就是谷歌马上要强制推行的aab文件是无效的。

需要使用下一个方案。

方法2. 设置archivesBaseName

archivesBaseName的话,只是最终输出文件的基本名,不含文件后缀,所以,可以对任何输出结果都有效。

示例

android {
  ...
  defaultConfig {
    ...
    setProperty("archivesBaseName", "${applicationId}-v${versionName}(${versionCode})")
  }
}

输出结果

com.example.sampleproject-v1.0.0(101)-release.apk
或者
com.example.sampleproject-v1.0.0(101).aab

如果想要把git提交的commit号也添加到输出文件里,可以用以下设置

def gitCommit = "git rev-parse --short HEAD".execute().text.trim()

archivesBaseName = "${defaultConfig.applicationId}-${defaultConfig.versionName}v${defaultConfig.versionCode}-${gitCommit}"

println 'outputFileName: after = ' + archivesBaseName

完美。

参考

示例