如何使用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.apk或MyCompany-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
文件中设置你的versionCode
和versionName
,像这样:
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
名称,用于release
和debug
变体。 我设法做到这一点很容易把这个片段作为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")) } } } }