因此要在gradle android中更改生成的APK文件名,我可以执行以下操作:
applicationVariants.output.all {
outputFileName = "the_file_name_that_i_want.apk"
}
生成的App Bundle文件是否有类似内容?如何更改生成的App Bundle文件名?
答案 0 :(得分:16)
您可以使用类似这样的内容:
defaultConfig {
applicationId "com.test.app"
versionCode 1
versionName "1.0"
setProperty("archivesBaseName", applicationId + "-v" + versionCode + "(" + versionName + ")")
}
答案 1 :(得分:8)
作为一种更通用的Martin Zeitlers answer方式,以下内容将侦听添加的任务,然后为所有添加的bundle*
任务插入重命名任务。
只需将其添加到build.gradle
文件的底部即可。
注意:它将添加不必要的更多任务,但是由于这些任务与任何文件夹都不匹配,因此将跳过这些任务。例如
> Task :app:renameBundleDevelopmentDebugResourcesAab NO-SOURCE
tasks.whenTaskAdded { task ->
if (task.name.startsWith("bundle")) {
def renameTaskName = "rename${task.name.capitalize()}Aab"
def flavor = task.name.substring("bundle".length()).uncapitalize()
tasks.create(renameTaskName, Copy) {
def path = "${buildDir}/outputs/bundle/${flavor}/"
from(path)
include "app.aab"
destinationDir file("${buildDir}/outputs/renamedBundle/")
rename "app.aab", "${flavor}.aab"
}
task.finalizedBy(renameTaskName)
}
}
答案 2 :(得分:4)
到目前为止,我还没有找到直接将另一个输出文件名分配给app.aab
的方法...
但是一个人可以重命名app.aab
(将其添加到应用模块的build.gradle
中):
// it finalizes :bundleDebug
task finalizeBundleDebug (type: Copy) {
def path = "${buildDir}/outputs/bundle/debug/"
from (path)
include "app.aab"
destinationDir file(path)
rename "app.aab", "renamed.aab"
}
// it finalizes :bundleRelease
task finalizeBundleRelease (type: Copy) {
def path = "${buildDir}/outputs/bundle/release/"
from (path)
include "app.aab"
destinationDir file(path)
rename "app.aab", "renamed.aab"
}
// this adds the above two tasks
tasks.whenTaskAdded { task ->
if (task.name == "bundleDebug") {
task.finalizedBy finalizeBundleDebug
} else if (task.name == "bundleRelease") {
task.finalizedBy finalizeBundleRelease
}
}
它创建了app.aab
的重命名副本(留下了两个文件),但是它可以工作-一个人也可以使用另一个destinationDir
-或使用链接的{删除app.aab
{1}}任务。钩住定义文件名(可能为Delete
)的bundle-task可能是另一种选择。
另请参阅Gradle documentation(只有Ant会执行Move任务)。
答案 3 :(得分:0)
我发现了一个更好的选择,可以在生成apk / aab时自动增加应用的版本控制和自动重命名。如下所示的解决方案(请记住在根文件夹上创建“ version.properties”文件:
android {
...
...
Properties versionProps = new Properties()
def versionPropsFile = file("${project.rootDir}/version.properties")
versionProps.load(new FileInputStream(versionPropsFile))
def value = 0
def runTasks = gradle.startParameter.taskNames
if ('assemble' in runTasks || 'assembleRelease' in runTasks) {
value = 1
}
def versionMajor = 1
def versionPatch = versionProps['VERSION_PATCH'].toInteger() + value
def versionBuild = versionProps['VERSION_BUILD'].toInteger() + 1
def versionNumber = versionProps['VERSION_NUMBER'].toInteger() + value
versionProps['VERSION_PATCH'] = versionPatch.toString()
versionProps['VERSION_BUILD'] = versionBuild.toString()
versionProps['VERSION_NUMBER'] = versionNumber.toString()
versionProps.store(versionPropsFile.newWriter(), null)
defaultConfig {
applicationId "com.your.applicationname"
versionCode versionNumber
versionName "${versionMajor}.${versionPatch}.${versionBuild}(${versionNumber})"
archivesBaseName = versionName
minSdkVersion 26
targetSdkVersion 29
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
signingConfig signingConfigs.release
setProperty("archivesBaseName","${applicationId}-v${versionName}")
...
}
答案 4 :(得分:0)
@SaXXuM的解决方案效果很好!重命名工件不需要任务。您可以直接在android {}块中调用setProperty()。我更喜欢输入文件名:
这是我在项目中使用它的方式:
build.gradle :
apply from: "../utils.gradle"
android {
...
setProperty("archivesBaseName", getArtifactName(defaultConfig))
}
utils.gradle :
ext.getArtifactName = {
defaultConfig ->
def date = new Date().format("yyyyMMdd")
return defaultConfig.applicationId + "-" + project.name + "-" + defaultConfig.versionName + "-" + defaultConfig.versionCode + "-" + date
}
结果是: com.example-app-1.2.0-10200000-20191206-release.aab
它同时适用于APK和AAB。
答案 5 :(得分:0)
基于Martin Zeitler的回答,我在Windows上执行了此操作:
请注意,在我的设置中,.aab文件是在release文件夹中创建的,并且会按照此bug report删除该文件夹中的所有其他内容。
在我的应用的模块gradle中:
apply from: "../utils.gradle"
...
tasks.whenTaskAdded { task ->
switch (task.name) {
case 'bundleRelease':
task.finalizedBy renameBundle
break
}
}
在utils.gradle中:
task renameBundle (type: Exec) {
def baseName = getProperty('archivesBaseName')
def stdout = new ByteArrayOutputStream()
def stderr = new ByteArrayOutputStream()
commandLine "copy.bat", rootProject.getProjectDir().getAbsolutePath() + "\\release\\${baseName}-release.aab", "<MY_AAB_PATH>\\${baseName}.aab", "D:\\Android\\studio\\release"
workingDir = rootProject.getProjectDir().getAbsolutePath()
ignoreExitValue true
standardOutput stdout
errorOutput stderr
doLast {
if (execResult.getExitValue() == 0) {
println ":${project.name}:${name} > ${stdout.toString()}"
} else {
println ":${project.name}:${name} > ${stderr.toString()}"
}
}
}
在项目文件夹中创建了copy.bat并包含以下内容:
COPY %1 %2
RMDIR /Q/S %3
请谨慎使用第3个参数,以确保不要使用对您来说很重要的文件夹。
编辑:为什么要问2条命令的.BAT。如果尝试在Windows上使用命令行“ copy”,则...会导致“系统无法识别命令副本”。输入诸如COPY,REN,RENAME等之类的任何内容均无效。