如何使用Gradle更改App Bundle的生成文件名?

时间:2018-09-26 01:32:09

标签: android gradle android-gradle android-app-bundle

因此要在gradle android中更改生成的APK文件名,我可以执行以下操作:

applicationVariants.output.all {
    outputFileName = "the_file_name_that_i_want.apk"
}

生成的App Bundle文件是否有类似内容?如何更改生成的App Bundle文件名?

6 个答案:

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

    ...
}

贷记到this网站和this帖子中

答案 4 :(得分:0)

@SaXXuM的解决方案效果很好!重命名工件不需要任务。您可以直接在android {}块中调用setProperty()。我更喜欢输入文件名:

  • 应用程序ID
  • 模块名称
  • 版本名称
  • 版本代码
  • 日期
  • 构建类型

这是我在项目中使用它的方式:

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等之类的任何内容均无效。