【问题标题】:Android appbundle: rename generated outputfile (.aab)Android appbundle:重命名生成的输出文件(.aab)
【发布时间】:2019-03-08 08:03:37
【问题描述】:

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

我尝试过复制和重命名,但问题是我需要将包命名为<appname>-<variant>-<buildType>-<version>。当我创建这里提到的任务时How to change the generated filename for App Bundles with Gradle? 获取变体是使用子字符串,它同时提供variantBuildtype

【问题讨论】:

    标签: android android-app-bundle


    【解决方案1】:

    首先我想澄清一下什么是构建变体。 构建变体是构建类型和风格的组合。 例如,构建类型可以是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
    }
    

    创建一个任务来重命名应用包

    类似于accepted answer you linked in your question,我们将插入一个重命名任务。 我对应用名称进行了硬编码,但如果您想要使用不同的应用名称,可以将它们放在 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 部分:此答案假设您没有使用产品风味

    如果您不使用产品风味,则可以使用更简单的东西,例如 accepted answer you linked in your question 并进行一些修改。这将产生一个类似<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)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-09-14
      • 1970-01-01
      • 1970-01-01
      • 2022-07-03
      • 2019-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多