如何使用Gradle在APK文件名中设置versionName?

我试图在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")) } } 

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

这解决了我的问题:使用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")) } } } 

更新:

所以看来这不适用于Android Studio Gradle插件的0.14以上的版本。

这是诀窍(参考这个问题 ):

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

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

以下示例将创build名为MyCompany-MyAppName-1.4.8-debug.apkMyCompany-MyAppName-1.4.8-release.apk的 apk文件,具体取决于所选的构build变体。

另请参见: 如何在Android项目中更改gradle中的proguard映射文件名

最近的Gradle插件的解决scheme

 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") } } 

上述解决scheme已经通过以下Android Gradle插件版本进行了testing:

  • 2.3.2(2017年5月)
  • 2.3.1(2017年4月)
  • 2.3.0(2017年2月)
  • 2.2.3(2016年12月)
  • 2.2.2
  • 2.2.0(2016年9月)
  • 2.1.3(2016年8月)
  • 2.1.2
  • 2.0.0(2016年4月)
  • 1.5.0(2015/11/12)
  • 1.4.0-beta6(2015/10/05)
  • 1.3.1(2015/08/11)

我会更新这个post,因为新版本出来。

仅在版本1.1.3-1.3.0上testing过的解决scheme

以下解决scheme已通过以下Android Gradle插件版本进行testing:

  • 1.3.0(2015/07/30) – 不工作, 计划在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-beta1(2015/03/25)
  • 1.1.3(2015/03/06)

应用程序gradle文件:

 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" } } 

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

  • 味道
  • build立types
  • date

我花了一些关于gradle类的研究,并从其他答案中复制/粘贴了一些内容。 我正在使用Gradle 2.1.3 (未在其他版本中testing过)。

在build.gradle中:

 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.each { 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" output.outputFile = new File(output.outputFile.parent, newApkName) } } } 

如果您今天(13-10-2016)在10:47进行编译,则会根据您select的风格和构buildtypes获得以下文件名称:

  • dev debug :myProject_ dev_debug_1.3.6 _131016_1047.apk
  • dev发布 :myProject_ dev_release_1.3.6 _131016_1047.apk
  • prod debug :myProject_ prod_debug_1.2.0 _131016_1047.apk
  • prod发布 :myProject_ prod_release_1.2.0 _131016_1047.apk

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

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

从清单中获取版本名称,您可以在build.gradle中编写以下代码:

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

总结一下,对于那些不知道如何在build.gradle导入包的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")) } } } 

=====编辑=====

如果你在你的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")) } } } 

======编辑与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")) } } } } 

另一种select是使用以下内容:

 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 } 

这将设置“appname-1.0.0”到你所有的apk输出。

有很多答案都是正确的或完整的或经过一些修改。 但是我会添加我的,因为我遇到了所有这些问题,因为我正在使用脚本来dynamic生成VersionName和VersionCode,并挂接到preBuild任务中。

如果你正在使用一些类似的方法,这是可以工作的代码:

 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的第一个操作中重写版本代码和名称, preBuild我必须将文件重命名添加到此任务的末尾。 那么在这种情况下,gradle会做什么:

注入版本代码/名称 – >执行preBuild操作 – >replaceapk的名称

在我的情况下,我这样解决这个错误

在Debug版本中添加SUFFIX,在这种情况下,我将“-DEBUG”文本添加到我的Debug部署中

  buildTypes { release { signingConfig signingConfigs.release minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } debug { defaultConfig { debuggable true versionNameSuffix "-DEBUG" } } } 

在我的情况下,我只是想find一种方法来自动生成不同的apk名称,用于releasedebug变体。 我设法做到这一点很容易把这个片段作为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

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

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

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

之后在build.gradle

 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")) } } 

如果每种构buildtypes有不同的清单,请调整。 但因为我有一个单一的 – 完美的作品。

从Android Studio 1.1.0开始,我发现这个组合在build.gradle文件的android主体中工作。 这是如果你不知道如何导入清单XML文件数据。 我希望Android Studio支持更多的function,但是直到获得所需的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")) } } } }