如何在 APK 文件名中使用 gradle 设置 version 名称?

我试图在 gradle 自动生成的 APK 文件名中设置一个特定的版本号。

现在 gradle 生成 myapp-release.apk,但是我想让它看起来像 myapp-release-1.0.apk

我已经尝试过重命名那些看起来很混乱的选项。有没有一种简单的方法可以做到这一点?

buildTypes {
release {
signingConfig signingConfigs.release
applicationVariants.each { variant ->
def file = variant.outputFile
variant.outputFile = new File(file.parent, file.name.replace(".apk", "-" +    defaultConfig.versionName + ".apk"))
}
}

我已经尝试了上面的代码,但没有运气。有什么建议吗? (使用1.6级)

96807 次浏览

这解决了我的问题: 使用 applicationVariants.all而不是 applicationVariants.each

buildTypes {
release {
signingConfig signingConfigs.release
applicationVariants.all { variant ->
def file = variant.outputFile
variant.outputFile = new File(file.parent, file.name.replace(".apk", "-" + defaultConfig.versionName + ".apk"))
}
}
}

更新:

所以看起来这个插件并不适用于0.14 + 版本的 android Studio gradle 插件。

这样就可以解决问题了(参考文献: http://stackoverflow. com/questions/27068505/how-do-i-add-a-version-number-to-my-apk-files-using-0-14-version-of-the-androi? lq = 1”) ) :

android {
applicationVariants.all { variant ->
variant.outputs.each { output ->
output.outputFile = new File(
output.outputFile.parent,
output.outputFile.name.replace(".apk", "-${variant.versionName}.apk"))
}
}
}

如果没有在 defaultConfig 块中指定 versionName,那么 defaultConfig.versionName将导致 null

要从清单中获取 version Name,可以在 build.gradle 中编写以下代码:

import com.android.builder.DefaultManifestParser


def manifestParser = new DefaultManifestParser()
println manifestParser.getVersionName(android.sourceSets.main.manifest.srcFile)

总而言之,对于那些不知道如何在 build.gradle中导入软件包的人(像我一样) ,使用以下 buildTypes,

buildTypes {
release {
signingConfig signingConfigs.release
applicationVariants.all { variant ->
def file = variant.outputFile
def manifestParser = new com.android.builder.core.DefaultManifestParser()
variant.outputFile = new File(file.parent, file.name.replace(".apk", "-" + manifestParser.getVersionName(android.sourceSets.main.manifest.srcFile) + ".apk"))
}
}
}

= = = = = = EDIT = = = = =

如果在 build.gradle文件中设置 versionCodeversionName,如下所示:

defaultConfig {
minSdkVersion 15
targetSdkVersion 19
versionCode 1
versionName "1.0.0"
}

你应该这样设置:

buildTypes {
release {
signingConfig signingConfigs.releaseConfig
applicationVariants.all { variant ->
def file = variant.outputFile
variant.outputFile = new File(file.parent, file.name.replace(".apk", "-" + defaultConfig.versionName + ".apk"))
}
}
}


= = = = = = EDIT with Android Studio 1.0 = = = = = =

如果你使用的是 Android Studio 1.0,你会得到如下错误:

Error:(78, 0) Could not find property 'outputFile' on com.android.build.gradle.internal.api.ApplicationVariantImpl_Decorated@67e7625f.

您应该将 build.Types部分更改为:

buildTypes {
release {
signingConfig signingConfigs.releaseConfig
applicationVariants.all { variant ->
variant.outputs.each { output ->
output.outputFile = new File(output.outputFile.parent, output.outputFile.name.replace(".apk", "-" + defaultConfig.versionName + ".apk"))
}
}
}
}

另一种选择是使用以下方法:

String APK_NAME = "appname"
int VERSION_CODE = 1
String VERSION_NAME = "1.0.0"


project.archivesBaseName = APK_NAME + "-" + VERSION_NAME;


android {
compileSdkVersion 21
buildToolsVersion "21.1.1"


defaultConfig {
applicationId "com.myapp"
minSdkVersion 15
targetSdkVersion 21
versionCode VERSION_CODE
versionName VERSION_NAME
}


.... // Rest of your config
}

这将为所有 apk 输出设置“ appname-1.0.0”。

对于最新的等级版本,您可以使用以下代码片段:

首先设置应用程序清单位置

 sourceSets {
main {
manifest.srcFile 'src/main/AndroidManifest.xml'
{
}

接下来是构建,分级

import com.android.builder.core.DefaultManifestParser


def getVersionName(manifestFile) {
def manifestParser = new DefaultManifestParser();
return manifestParser.getVersionName(manifestFile);
}


def manifestFile = file(android.sourceSets.main.manifest.srcFile);
def version = getVersionName(manifestFile)


buildTypes {
release {
signingConfig signingConfigs.release
applicationVariants.each { variant ->
def file = variant.outputFile
variant.outputFile = new File(file.parent, file.name.replace(".apk", "-" +    versionName + ".apk"))
}
}

如果每种生成类型有不同的清单,则进行调整。但既然我有一个单一的-完全适合我。

我只需要在一个地方更改版本名称。代码也很简单。

下面的示例将根据所选的生成变量创建名为 MyCompany-MyAppName-1.4.8-debug. apkMyCompany-MyAppName-1.4.8-release. apk的 apk 文件。

请注意,此解决方案 工作在 APK 和 < a href = “ https://d.android.com/r/Studio-wna/aab-viewrer”rel = “ noReferrer”> App bundle (. aab files)

参见: 如何改变前卫映射文件名在分级为 Android 项目

# 最新的分级插件解决方案

android {
compileSdkVersion 22
buildToolsVersion "22.0.1"
defaultConfig {
applicationId "com.company.app"
minSdkVersion 13
targetSdkVersion 21
versionCode 14       // increment with every release
versionName '1.4.8'   // change with every release
setProperty("archivesBaseName", "MyCompany-MyAppName-$versionName")
}
}

上面的解决方案已经在下面的 Android Gradle 插件版本中进行了测试:

  • 3.6.4(二零二零年八月)
  • 3.5.2(二零一九年十一月)
  • 3.3.0(2019年1月)
  • 3.1.0(二零一八年三月)
  • 3.0.1(二零一七年十一月)
  • 3.0.0(二零一七年十月)
  • 2.3.2(二零一七年五月)
  • 2.3.1(二零一七年四月)
  • 2.3.0(二零一七年二月)
  • 2.2.3(二零一六年十二月)
  • 2.2
  • 2.2.0(二零一六年九月)
  • 2.1.3(二零一六年八月)
  • 2.1.2
  • 2.0.0(2016年4月)
  • 1.5.0(2015/11/12)
  • 1.4.0-beta 6(2015/10/05)
  • 1.3.1(2015/08/11)

我会在新版本出来时更新这篇文章。

# 解决方案仅在1.1.3-1.3.0版本中测试 下面的解决方案已经在下面的 Android Gradle 插件版本中进行了测试:

  • 1.3.0(2015/07/30)-没有工作,< a href = “ https://code.google.com/p/android/questions/Details? id = 182016”rel = “ noReferrer”> bug 计划在1.3.1 中修复
  • 1.2.3(2015/07/21)
  • 1.2.2(2015/04/28)
  • 1.2.1(2015/04/27)
  • 1.2.0(2015/04/26)
  • 1.2.0-beta 1(2015/03/25)
  • 1.1.3(2015/03/06)

应用程序级别文件:

apply plugin: 'com.android.application'


android {
compileSdkVersion 21
buildToolsVersion "21.1.2"
defaultConfig {
applicationId "com.company.app"
minSdkVersion 13
targetSdkVersion 21
versionCode 14       // increment with every release
versionName '1.4.8'   // change with every release
archivesBaseName = "MyCompany-MyAppName-$versionName"
}
}

从 Android Studio 1.1.0开始,我发现这种组合在 build.gradle文件的 机器人主体中起作用。如果您不知道如何导入清单 xml 文件数据,就需要这样做。我希望 Android Studio 能够更好地支持它,但是只需要使用这些值,直到得到所需的 apk 名称输出:

defaultConfig {
applicationId "com.package.name"
minSdkVersion 14
targetSdkVersion 21
versionCode 6
versionName "2"
}
signingConfigs {
release {
keyAlias = "your key name"
}
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'


signingConfig signingConfigs.release
applicationVariants.all { variant ->
variant.outputs.each { output ->
output.outputFile = new File(output.outputFile.parent, output.outputFile.name.replace("app-release.apk", "appName_" + versionName + ".apk"))
}
}
}
}

有许多答案是正确的,无论是全部或经过一些修改。但是我还是要添加我的代码,因为我遇到了所有这些代码的问题,因为我使用脚本通过挂接到 preBuild任务来动态地生成 VersionName 和 VersionCode。

如果你正在使用一些类似的方法,下面的代码将会起作用:

project.android.applicationVariants.all { variant ->
variant.preBuild.doLast {
variant.outputs.each { output ->
output.outputFile = new File(
output.outputFile.parent,
output.outputFile.name.replace(".apk", "-${variant.versionName}@${variant.versionCode}.apk"))
}
}
}

解释: 因为我在 preBuild的第一个操作中覆盖了版本代码和名称,所以我必须在这个任务的末尾添加文件重命名。那么,在这种情况下,gradle 的作用是:

注入版本代码/名称-> 做预生成操作-> 替换 apk 的名称

在我的例子中,我这样解决这个错误

将 SUFFIX 添加到 DEBUG 版本,在本例中,我将“-DEBUG”文本添加到 DEBUG 部署中

 buildTypes {
release {


signingConfig signingConfigs.release
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'




}
debug {


defaultConfig {
debuggable true


versionNameSuffix "-DEBUG"
}
}
}

(编辑使用 Android Studio 3.0和 Gradle 4)

我正在寻找一个更复杂的 apk 文件名重命名选项,我写了这一个,希望它对其他人有帮助。它使用以下数据重命名 apk:

  • 味道
  • 建造型式
  • 版本
  • 约会

我花了点时间在分级课上做了些研究,并从其他答案中复制粘贴了一些内容。我正在使用 级别3.1.3

在这个建筑里. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . :

android {


...


buildTypes {
release {
minifyEnabled true
...
}
debug {
minifyEnabled false
}
}


productFlavors {
prod {
applicationId "com.feraguiba.myproject"
versionCode 3
versionName "1.2.0"
}
dev {
applicationId "com.feraguiba.myproject.dev"
versionCode 15
versionName "1.3.6"
}
}


applicationVariants.all { variant ->
variant.outputs.all { output ->
def project = "myProject"
def SEP = "_"
def flavor = variant.productFlavors[0].name
def buildType = variant.variantData.variantConfiguration.buildType.name
def version = variant.versionName
def date = new Date();
def formattedDate = date.format('ddMMyy_HHmm')


def newApkName = project + SEP + flavor + SEP + buildType + SEP + version + SEP + formattedDate + ".apk"


outputFileName = new File(newApkName)
}
}
}

如果您今天(13-10-2016)在10:47编译,您将根据您选择的风格和构建类型获得以下文件名:

  • Dev debug : myProject _ Dev _ debug _ 1.3.6 _ 131016 _ 1047. apk
  • Dev release : myProject _ Dev _ release _ 1.3.6 _ 131016 _ 1047. apk
  • Prod debug : myProject _ Prod _ debug _ 1.2.0 _ 131016 _ 1047. apk
  • Prod release : myProject _ Prod _ release _ 1.2.0 _ 131016 _ 1047. apk

注意: 未对齐版本的 apk 名称仍然是默认名称。

在我的例子中,我只是想找到一种方法来自动生成 releasedebug变体的不同 apk名称。作为 android的孩子,我很容易就做到了这一点:

applicationVariants.all { variant ->
variant.outputs.each { output ->
def appName = "My_nice_name_"
def buildType = variant.variantData.variantConfiguration.buildType.name
def newName
if (buildType == 'debug'){
newName = "${appName}${defaultConfig.versionName}_dbg.apk"
} else {
newName = "${appName}${defaultConfig.versionName}_prd.apk"
}
output.outputFile = new File(output.outputFile.parent, newName)
}
}

对于新的 Android gradle 插件3.0.0,你可以这样做:

 applicationVariants.all { variant ->
variant.outputs.all {
def appName = "My_nice_name_"
def buildType = variant.variantData.variantConfiguration.buildType.name
def newName
if (buildType == 'debug'){
newName = "${appName}${defaultConfig.versionName}_dbg.apk"
} else {
newName = "${appName}${defaultConfig.versionName}_prd.apk"
}
outputFileName = newName
}
}

这样产生的结果类似于: My_nice_name_3.2.31_dbg.apk

六年级以上

我现在在 Android Studio 4.0和 Gradle 6.4中使用以下内容:

android {
defaultConfig {
applicationId "com.mycompany.myapplication"
minSdkVersion 21
targetSdkVersion 29
versionCode 15
versionName "2.1.1"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
applicationVariants.all { variant ->
variant.outputs.all {
outputFileName = "ApplicationName-${variant.name}-${variant.versionName}.apk"
}
}
}
}
}

四年级

在第四级(Android Studio 3 +)中,语法发生了一些变化(从 output.outputFileoutputFileName,从 这个答案到现在的想法是:

android {
applicationVariants.all { variant ->
variant.outputs.each { output ->
def newName = outputFileName
newName.replace(".apk", "-${variant.versionName}.apk")
outputFileName = new File(newName)
}
}
}
    applicationVariants.all { variant ->
variant.outputs.all { output ->
output.outputFileName = output.outputFileName.replace(".apk", "-${variant.versionName}.apk")
}
}

根据 @ Jon 回答重命名 apk 的正确方法

defaultConfig {
applicationId "com.irisvision.patientapp"
minSdkVersion 24
targetSdkVersion 22
versionCode 2  // increment with every release
versionName "0.2" // change with every release
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
//add this line
archivesBaseName = "AppName-${versionName}-${new Date().format('yyMMdd')}"
}

或者其他你可以达到同样效果的方法

android {
...


compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}


applicationVariants.all { variant ->
variant.outputs.all { output ->
def formattedDate = new Date().format('yyMMdd')
outputFileName = "${outputFileName.replace(".apk","")}-v${defaultConfig.versionCode}-${formattedDate}.apk"
}
}
}

正如我回答 给你如果你想把版本名和版本代码附加到输出文件中,可以这样做:

applicationVariants.all { variant ->
variant.outputs.all {
def versionName = variant.versionName
def versionCode = variant.versionCode
def variantName = variant.name
outputFileName = "${rootProject.name}" + '_' + variantName + '_' + versionName + '_' + versionCode + '.apk'
}
}

您也可以将格式化的 创造时间添加到 apk 名称如下:

setProperty("archivesBaseName", "data-$versionName " + (new Date().format("HH-mm-ss")))

以下是你在 Kotlin 数字用户线上的做法:

applicationVariants.all {
outputs.all {
this as com.android.build.gradle.internal.api.ApkVariantOutputImpl


val apkName = outputFileName.replace(".apk", "-" + defaultConfig.versionName + ".apk")


outputFileName = apkName
}
}