如何使用Gradle更改应用程序包的生成文件名?

Arc*_*nes 16 android gradle android-gradle-plugin android-app-bundle

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

applicationVariants.output.all {
    outputFileName = "the_file_name_that_i_want.apk"
}
Run Code Online (Sandbox Code Playgroud)

生成的App Bundle文件有类似的东西吗?如何更改生成的App Bundle文件名?

小智 29

你可以使用这样的东西:

defaultConfig {
  applicationId "com.test.app"
  versionCode 1
  versionName "1.0"
  setProperty("archivesBaseName", applicationId + "-v" + versionCode + "(" + versionName + ")")
}
Run Code Online (Sandbox Code Playgroud)

  • 是否可以将风味类型也添加到文件名中? (5认同)
  • 这是唯一可行的答案。 (3认同)
  • 如果您需要同时构建多个口味,则不太适合口味。 (3认同)
  • 这非常适合 Android Studio 3.5.2。您将在 apk 末尾看到 buildType-flavor。 (2认同)
  • archivesBaseName 不是特定于风格的,因此所有风格都将具有最后设置的值,这意味着风格文件名可以显示最后设置 archivesBaseName 的风格的 applicationId、versionCode 和 versionName。 (2认同)

Dav*_*jak 16

作为Martin Zeitlers的一种更通用的方式,回答以下内容将侦听添加的任务,然后为任何添加的任务插入重命名任务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)
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 嗨,我已经尝试过这个,但这在我的场景中不起作用,因为我有多种口味,你能帮我做什么吗? (2认同)
  • 现在无法工作,因为 Android Studio 有内置任务重命名“rename${task.name.capitalize()}Aab”。 (2认同)

pet*_*ejl 14

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

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

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

构建.gradle

apply from: "../utils.gradle"

android {
    ...
    setProperty("archivesBaseName", getArtifactName(defaultConfig))
}
Run Code Online (Sandbox Code Playgroud)

utils.gradle

ext.getArtifactName = {
    defaultConfig ->
        def date = new Date().format("yyyyMMdd")
        return defaultConfig.applicationId + "-" + project.name + "-" + defaultConfig.versionName + "-" + defaultConfig.versionCode + "-" + date
}
Run Code Online (Sandbox Code Playgroud)

结果是:

com.example-app-1.2.0-10200000-20191206-release.aab
Run Code Online (Sandbox Code Playgroud)

它适用于 APK 和 AAB。

  • 如果应用程序有不同的风格怎么办? (8认同)
  • 这不适合应用程序风格。 (2认同)

don*_*995 9

为什么没有人使用现有的 gradle 任务来实现这一点?

有一个带有该类型的 gradle 任务FinalizeBundleTask,它被称为包生成的最后一步,它正在做两件事:

  • 对生成的 AAB 包进行签名
  • 在请求的位置移动并重命名 AAB 包

您所需要做的只是将此任务的“输出”更改为您想要的任何结果。此任务包含一个属性finalBundleFile- 最终 AAB 包的完整路径。

我正在使用它类似的东西:

    applicationVariants.all {
        outputs.all {
            // AAB file name that You want. Falvor name also can be accessed here.
            val aabPackageName = "$App-v$versionName($versionCode).aab"
            // Get final bundle task name for this variant
            val bundleFinalizeTaskName = StringBuilder("sign").run {
                // Add each flavor dimension for this variant here
                productFlavors.forEach {
                    append(it.name.capitalizeAsciiOnly())
                }
                // Add build type of this variant
                append(buildType.name.capitalizeAsciiOnly())
                append("Bundle")
                toString()
            }
            tasks.named(bundleFinalizeTaskName, FinalizeBundleTask::class.java) {
                val file = finalBundleFile.asFile.get()
                val finalFile = File(file.parentFile, aabPackageName)
                finalBundleFile.set(finalFile)
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

flavors它与任何、dimensions、 和完美配合buildTypes。没有任何额外的任务,适用于为输出设置的任何路径Toolbar -> Generate signed Bundle,可以为任何flavor.

  • 以下是如何在 Gradle 中使用类似的方法:https://twitter.com/VasiliyZukanov/status/1670867076213243916(对我有用) (2认同)

Mar*_*ler 5

同时,我找到了一种更好的方法...

// it sets task.finalizedBy for :bundle
tasks.whenTaskAdded { task ->
    switch (task.name) {
        case 'bundleDebug':
        case 'bundleRelease':
            task.finalizedBy renameBundle
            break
    }
}
Run Code Online (Sandbox Code Playgroud)

使用Exec任务(仍然想知道任务的语法如何ant.move):

// it finalizes task :bundle
task renameBundle (type: Exec) {

    description "it renames an Android App Bundle"

    def bundlePath = rootProject.getProjectDir().getAbsolutePath() + "/${project.name}/build/outputs/bundle/release/"
    def baseName = getProperty('archivesBaseName')
    def srcFile = "${baseName}.aab"
    def dstFile = "${baseName}_renamed.aab"

    def stdout = new ByteArrayOutputStream()
    def stderr = new ByteArrayOutputStream()

    commandLine "mv", "-v", "${srcFile}", "${dstFile}"
    workingDir = bundlePath
    ignoreExitValue true
    standardOutput stdout
    errorOutput stderr

    doLast {
        if (execResult.getExitValue() == 0) {
            println ":${project.name}:${name} > ${stdout.toString()}"
        } else {
            println ":${project.name}:${name} > ${stderr.toString()}"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这样就不会留下任何东西-并且可以将文件移动到任何需要的地方。