如何使用产品风味和APK分割从Gradle重命名和生成所有APK和Bundle

14

我尝试了这两种方法(单独使用其中一种)来重命名APK

选项 -

// To Change the APK and Bundle Name
archivesBaseName = "${name}-v${versionCode}_${versionName}-${new Date().format('ddMMMyyyy_HH-mm')}"

选项 -

(为此还尝试将 - variant.outputs.all 更改为 variant.outputs.each

android.applicationVariants.all { variant ->
    variant.outputs.all { output ->
        output.outputFileName = "${variant.buildType.name}-v${versionCode}_${versionName}-${new Date().format('ddMMMyyyy_HH-mm')}.apk"
    }
}

当我使用选项One时,

问题 - 它会生成所有拆分文件,但会用Gradle中最后一个写入的flavor覆盖flavor配置。

此外,尝试仅在defaultConfig中放置选项One,但如果在其后编写productFlavours,则会返回null值的versionCodeversionName

productFlavors {
    aFlavor {
        applicationId "com.a"
        
        versionCode 5
        versionName "1.0.5"

        signingConfig signingConfigs.signingA

        // To Change the APK and Bundle Name
        archivesBaseName = "${name}-v${versionCode}_${versionName}-${new Date().format('ddMMMyyyy_HH-mm')}"
    }
    bFlavor {
        applicationId "com.b"

        versionCode 5
        versionName "1.0.5"

        signingConfig signingConfigs.signingB

        // To Change the APK and Bundle Name
        archivesBaseName = "${name}-v${versionCode}_${versionName}-${new Date().format('ddMMMyyyy_HH-mm')}"
    }
    cFlavor {
        applicationId "com.c"

        versionCode 3
        versionName "1.0.3"

        signingConfig signingConfigs.signingC

        // To Change the APK and Bundle Name
        archivesBaseName = "${name}-v${versionCode}_${versionName}-${new Date().format('ddMMMyyyy_HH-mm')}"
    }
}

当我使用 选项二 时,

问题 - 它生成了正确的名称但只生成了一个APK文件。

splits {
    abi {
        enable true
        reset()
        include 'arm64-v8a', 'x86', 'x86_64'
        universalApk false
    }
}

android.applicationVariants.all { variant ->
    variant.outputs.all { output ->
        output.outputFileName = "${variant.buildType.name}-v${versionCode}_${versionName}-${new Date().format('ddMMMyyyy_HH-mm')}.apk"
    }
}

捆绑问题 - 无法使用第二个选项重命名捆绑。


1
为什么不使用一些标准属性,例如versionNameSuffixapplicationIdSuffix?http://google.github.io/android-gradle-dsl/current/com.android.build.gradle.internal.dsl.ProductFlavor.html - daggett
@daggett 同意,但如果应用程序ID和版本名称完全不同怎么办? - Mihir Trivedi
6个回答

5
根据这个答案,你可以选择选项 - 二,只需进行以下小的更改即可适用于APK文件,而不适用于Bundle / AAB 文件(有关bundle,请参考这个答案)。
splits {
    abi {
        enable true
        reset()
        include 'arm64-v8a', 'x86', 'x86_64'
        universalApk false
    }
}

android.applicationVariants.all { variant ->
    variant.outputs.all { output ->
        // New one or Updated one
        output.outputFileName = "${variant.getFlavorName()}-${variant.buildType.name}-v${versionCode}_${versionName}-${new Date().format('ddMMMyyyy_HH-mm')}-${output.getFilter(com.android.build.OutputFile.ABI)}.apk"
        // Old one
        // output.outputFileName = "${variant.buildType.name}-v${versionCode}_${versionName}-${new Date().format('ddMMMyyyy_HH-mm')}.apk"
    }
}

此外,从每个口味的区块中删除该行。
// To Change the APK and Bundle Name
archivesBaseName = "${name}-v${versionCode}_${versionName}-${new Date().format('ddMMMyyyy_HH-mm')}"

通过这样,你可以得到像这样的输出文件名
对于aFlvour - 发布

aFlavor-release-v5_1.0.5-16Jan2020_21-26-arm64-v8a.apk

aFlavor-release-v5_1.0.5-16Jan2020_21-26-x86_64.apk

aFlavor-release-v5_1.0.5-16Jan2020_21-26-x86.apk

  • 调试

aFlavor-debug-v5_1.0.5-16Jan2020_21-26-arm64-v8a.apk

aFlavor-debug-v5_1.0.5-16Jan2020_21-26-x86_64.apk

aFlavor-debug-v5_1.0.5-16Jan2020_21-26-x86.apk

对于bFlavor

与上述相似的名称,只需将前缀aFlavor更改为bFlavor,如下:

bFlavor-release-v5_1.0.5-16Jan2020_21-26-arm64-v8a.apk

对于cFlavor

与上述相同的名称,只需将前缀aFlavor更改为cFlavor, 并且,versionCodeversionName分别作为所需。

cFlavor-release-v3_1.0.3-16Jan2020_21-26-arm64-v8a.apk


2

这些解决方案不适用于aab(捆绑包)。仅适用于APK。


是的,正如在这里提到的 https://dev59.com/b1IH5IYBdhLWcg3wb93W#59774018,并且对于Bundle,我也提出了问题,但它被标记为重复 https://stackoverflow.com/q/63533131/1684864。 - Mihir Trivedi
看看我的解决方案,它适用于捆绑包(bundle)和 APK。 - 3c71
请看我的解决方案,适用于bundle/apk。 - undefined

2

因为你使用了universalApk false,Gradle会为每个ABI生成不同的输出apk。因此,你需要将ABI名称添加到输出文件名中。表达式output.getFilter(com.android.build.OutputFile.ABI)返回当前ABI名称。 请查看以下示例:

android.applicationVariants.all { variant ->
    variant.outputs.all { output ->
        output.outputFileName = "${variant.buildType.name}-${output.getFilter(com.android.build.OutputFile.ABI)}-v${versionCode}_${versionName}-${new Date().format('ddMMMyyyy_HH-mm')}.apk"
    }
}

如果我还想在输出文件中添加口味名称怎么办?那么捆绑包的输出文件名呢? - Mihir Trivedi
已经找到了获取口味名称的解决方案:variant.getFlavorName() 参考链接:https://dev59.com/N10a5IYBdhLWcg3wLWGx#52536094 - Mihir Trivedi

1

string.xml 文件中移除 app_name

apply plugin: 'com.android.application'
android {
    signingConfigs {
        release {
            keyAlias 'your key alias'
            keyPassword 'your password'
            storeFile file('path of your keystore')
            storePassword 'your password'
        }
    }
    compileSdkVersion 28
    flavorDimensions "default"
    project.archivesBaseName = "ProjectName";
    defaultConfig {
        applicationId "Your package name"
        minSdkVersion 16
        targetSdkVersion 28
        multiDexEnabled true
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        vectorDrawables.useSupportLibrary = true
        signingConfig signingConfigs.release
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            applicationVariants.all { variant ->
                variant.outputs.all { //output ->

                    outputFileName = "YourAppName-${variant.baseName}-${variant.versionName}.apk"
                }
            }
        }
        debug {

        }
    }
    productFlavors {
        dev {
            versionCode 778899 // your versioncode
            versionName "v.1.1.BUILD_NUM"  // your version name
            applicationIdPrefix ".dev" // your application package name like as com.a
            resValue "string", "app_name", "Your App Name"

        }
        live {
            versionCode 778899 // your versioncode
            versionName "v.1.1.BUILD_NUM"  // your version name
            applicationIdPrefix ".dev" // your application package name like as com.a
            resValue "string", "app_name", "Your App Name"

        }
    }
    compileOptions {
        targetCompatibility 1.8
        sourceCompatibility 1.8
    }
}

dependencies {
   // Here your application gradle
}

0
这适用于bundle或APK。但是如果不注释掉必要的行,我无法使其同时适用于两者。如果有人对此有什么想法吗?
        applicationVariants.all { variant ->
            variant.outputs.all {
                if (variant.buildType.name == "release") {
        //              outputFileName = createCopyTaskAPK("prefix", variant.productFlavors[0].name, variant.name.capitalize())
                        outputFileName = createCopyTaskBundle("prefix", variant.productFlavors[0].name, variant.name.capitalize())
                }
            }
        }

任务捆绑:

ext.createCopyTaskBundle = { productName, variantName, taskSuffix ->
    def moveBundleTask = tasks.create(name: "move${taskSuffix}", type: Exec) {
        def input = new File("$projectDir\\$variantName\\release\\" + productName + "-" + variantName + "-release.aab")
        def folder = new File("$projectDir/$variantName")
        commandLine "copy.bat", input.path, "$projectDir\\apks\\${variantName}.aab", folder.path
        workingDir = rootProject.getProjectDir().getAbsolutePath()
        ignoreExitValue true
        dependsOn "bundle$taskSuffix"
    }
    tasks["bundle$taskSuffix"].finalizedBy = [moveBundleTask]

    return productName + "-" + variantName + "-release.aab"
}

APK的任务:

ext.createCopyTaskAPK = { productName, variantName, taskSuffix ->
    def moveAPKTask = tasks.create(name: "apk${taskSuffix}", type: Exec) {
        def input = new File("$projectDir\\$variantName\\release\\" + productName + "-" + variantName + "-release.apk")
        def folder = new File("$projectDir/$variantName")
        commandLine "copy.bat", input.path, "$projectDir\\bundles\\${variantName}.apk", folder.path
        workingDir = rootProject.getProjectDir().getAbsolutePath()
        ignoreExitValue true
        dependsOn "assemble$taskSuffix"
    }
    tasks["assemble$taskSuffix"].finalizedBy = [moveAPKTask]

    return productName + "-" + variantName + "-release.apk"
}

Windows 的 copy.bat 文件内容:

ECHO COPYING %1 to %2
COPY %1 %2

-3

如果您想要不同的输出 APK,您必须设置不同的版本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接