我正在尝试在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"))
}
}
我试过上面的代码没有运气。有什么建议? (使用gradle 1.6)
答案 0 :(得分:199)
我只需要在一个地方更改版本名称。代码也很简单。
以下示例将创建名为 MyCompany-MyAppName-1.4.8-debug.apk 或 MyCompany-MyAppName-1.4.8-release.apk 的apk文件,具体取决于在选择的构建变体上。
请注意,此解决方案适用于APK和App Bundles (.aab files) 。
另请参阅:How to change the proguard mapping file name in gradle for Android project
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插件版本进行测试:
我会在新版本发布时更新这篇文章。
以下解决方案已使用以下Android Gradle插件版本进行测试:
app 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"
}
}
答案 1 :(得分:171)
这解决了我的问题:使用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插件。
这就是诀窍(参考此question ):
android {
applicationVariants.all { variant ->
variant.outputs.each { output ->
output.outputFile = new File(
output.outputFile.parent,
output.outputFile.name.replace(".apk", "-${variant.versionName}.apk"))
}
}
}
答案 2 :(得分:37)
(已编辑以使用Android Studio 3.0和Gradle 4)
我正在寻找一个更复杂的apk文件名重命名选项,我写了这个,希望它对其他人有帮助。它使用以下数据重命名apk:
我花了一些时间研究gradle类和其他答案的一些复制/粘贴。我正在使用 gradle 3.1.3 。
在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.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)
}
}
}
如果你今天(16-10-2016)在10:47编译,你会得到以下文件名,具体取决于你选择的风味和构建类型:
注意:未对齐版本的apk名称仍然是默认名称。
答案 3 :(得分:18)
总结一下,对于那些不知道如何在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"))
}
}
}
=====编辑=====
如果您在versionCode
文件中设置versionName
和build.gradle
,请执行以下操作:
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"))
}
}
}
}
答案 4 :(得分:17)
如果您未在defaultConfig块中指定versionName,则defaultConfig.versionName
将导致null
从manifest中获取versionName,您可以在build.gradle中编写以下代码:
import com.android.builder.DefaultManifestParser
def manifestParser = new DefaultManifestParser()
println manifestParser.getVersionName(android.sourceSets.main.manifest.srcFile)
答案 5 :(得分:7)
就我而言,我只想找到一种方法来自动生成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
答案 6 :(得分:6)
语法在Gradle 4(Android Studio 3+)中有所改变(从output.outputFile
到outputFileName
,来自this answer的想法现在是:
android {
applicationVariants.all { variant ->
variant.outputs.each { output ->
def newName = outputFileName
newName.replace(".apk", "-${variant.versionName}.apk")
outputFileName = new File(newName)
}
}
}
答案 7 :(得分:5)
另一种选择是使用以下内容:
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”。
答案 8 :(得分:4)
<NavItem>
<NavLink to="/">Home</NavLink>
</NavItem>
或者通过
可以达到相同结果的另一种方法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')}"
}
答案 9 :(得分:3)
有许多答案在完整或经过一些修改后都是正确的。但是我要添加我的,因为我遇到了所有问题,因为我使用脚本通过挂钩pod spec lint
任务来动态生成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"))
}
}
}
的第一个操作中覆盖了版本代码和名称,我必须将文件重命名添加到此任务的末尾。那么gradle在这种情况下会做的是:
注入版本代码/名称 - &gt;做preBuild行动 - &gt;替换apk的名称
答案 10 :(得分:2)
applicationVariants.all { variant ->
variant.outputs.all { output ->
output.outputFileName = output.outputFileName.replace(".apk", "-${variant.versionName}.apk")
}
}
答案 11 :(得分:1)
就我而言,我这样解决了这个错误
在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"
}
}
}
答案 12 :(得分:0)
对于最新的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"))
}
}
调整每种构建类型是否有不同的清单。但是因为我有一个 - 对我而言非常适合。
答案 13 :(得分:0)
从Android Studio 1.1.0开始,我发现这个组合在build.gradle
文件的 android 主体中运行。这是因为您无法弄清楚如何导入清单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"))
}
}
}
}
答案 14 :(得分:0)
我的回答here如要在输出文件中附加版本名称和版本代码,请执行以下操作:
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'
}
}
答案 15 :(得分:0)
您还可以将格式化的构建时间添加到 apk 名称中,如下所示:
setProperty("archivesBaseName", "data-$versionName " + (new Date().format("HH-mm-ss")))