首页 > 解决方案 > Android appbundle:重命名生成的输出文件(.aab)

问题描述

我正在尝试以.aab格式重命名生成的文件<appname>-<variant>-<buildType>-<version>,有什么方法可以重命名输出包文件,类似于 apk 重命名。

我尝试过复制和重命名,但问题是我需要将包命名为<appname>-<variant>-<buildType>-<version>. 当我创建这里提到的任务时如何使用 Gradle 更改 App Bundles 的生成文件名? 获取变体是使用子字符串,它同时提供variantBuildtype.

标签: androidandroid-app-bundle

解决方案


首先,我想澄清一下构建变体是什么。构建变体是构建类型和风格的组合。例如,构建类型可能是release,风味可能是freeVersion. 所以一个变体是releaseFreeVersion.

.aab注意:您链接的答案具有创建文件的附加副本而不是仅重命名它的副作用。这个答案也解决了这个问题。

第 1 部分:此答案假设您使用的是产品风味

在这个答案中,我假设您使用的是产品风味。我还将假设您想要的格式是<appname>-<flavor>-<buildType>-<version>.

首先创建一些补充的 Gradle 方法

您可以将它们添加到build.gradle文件的底部(所有花括号之外)。

static String firstMatchingSubstring(String taskName, String[] keys) {
    def lcName = taskName.toLowerCase()

    for(String key: keys) {
        if(lcName.contains(key.toLowerCase())) return key
    }

    return null
}

/**
 *
 * @param taskName e.g., bundleMyFlavorRelease or bundleRelease
 * @return
 */
String getBuildType(String taskName) {
    return firstMatchingSubstring(taskName, getBuildTypeNames())
}

/**
 *
 * @param taskName e.g., bundleMyFlavorRelease
 * @return
 */
String getFlavor(String taskName) {
    return firstMatchingSubstring(taskName, getProductFlavorNames())
}

String[] getBuildTypeNames() {
    def types = []

    android.buildTypes.all { type ->
        types.add(type.name)
    }

    return types
}

String[] getProductFlavorNames() {
    def flavors = []

    android.productFlavors.all { flavor ->
        flavors.add(flavor.name)
    }

    return flavors
}

创建任务以重命名应用程序包

与您在问题中链接的已接受答案类似,我们将插入重命名任务。我对应用程序名称进行了硬编码,但如果您想要使用不同的应用程序名称,可以将它们放在android.defaultConfig块内,然后引用下面的名称。

tasks.whenTaskAdded { task ->
    def name = task.name

    //Skip some unnecessary tasks
    if (name.startsWith("bundle")
            && !name.contains("Classes")
            && !name.contains("Resources")
            && name != "bundle") {

        def renameTaskName = "rename${task.name.capitalize()}Aab"
        def version = "${android.defaultConfig.versionName}-${android.defaultConfig.versionCode}"
        def flavor = getFlavor(name)
        def type = getBuildType(name)
        if(flavor == null || type == null) return

        def outputName = "AppName-$flavor-$type-$version"

        tasks.create(renameTaskName) {
            def path = "${rootDir}/app/${flavor}/${type}/"
            def originalFile = "$path/app-${flavor}-${type}.aab"

            doLast {
                if (file("$originalFile").exists()) {
                    ant.move file: "$originalFile",
                            tofile: "$path/${outputName}.aab"
                }
            }
        }

        task.finalizedBy(renameTaskName)
    }
}

第 2 部分:此答案假设您没有使用产品风味

如果您不使用产品风味,那么更简单的东西就像您在问题中链接的已接受答案并进行了一些修改。这将产生一个名称,如<appname>-<buildType>-<version>.aab.

tasks.whenTaskAdded { task ->
    def name = task.name

    //Skip some unnecessary tasks
    if (name.startsWith("bundle")
            && !name.contains("Classes")
            && !name.contains("Resources")
            && name != "bundle") {

        def renameTaskName = "rename${task.name.capitalize()}Aab"
        def type = task.name.substring("bundle".length()).uncapitalize()
        def version = "${android.defaultConfig.versionName}-${android.defaultConfig.versionCode}"
        def outputName = "AppName-$type-$version"

        tasks.create(renameTaskName) {
            def path = "${rootDir}/app/${type}/"
            def originalFile = "$path/app-${type}.aab"

            doLast {
                if (file("$originalFile").exists()) {
                    ant.move file: "$originalFile",
                            tofile: "$path/${outputName}.aab"
                }
            }
        }

        task.finalizedBy(renameTaskName)
    }
}

推荐阅读