如何自定义产品口味的APK文件名?

JJD*_*JJD 38 android gradle build.gradle android-gradle-plugin android-productflavors

我在脚本中自定义Android应用程序的APK文件的名称,build.gradle如下所示:

android {
    defaultConfig {
        project.ext.set("archivesBaseName", "MyApplication");
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我正在使用产品口味:

android {
    productFlavors {
        green {
            applicationId "com.example.myapplication.green"
        }

        blue {
            applicationId "com.example.myapplication.blue"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法自定义每个APK的名称?我尝试了archiveBaseNamebaseName没有成功.最后,我想提出以下文件:

build/outputs/apk/Blue-debug-1.2.1.apk
build/outputs/apk/Blue-debug-unaligned.apk
build/outputs/apk/Blue-release-1.2.1.apk
build/outputs/apk/Blue-release-unaligned.apk
build/outputs/apk/Green-debug-1.2.1.apk
build/outputs/apk/Green-debug-unaligned.apk
build/outputs/apk/Green-release-1.2.1.apk
build/outputs/apk/Green-release-unaligned.apk
Run Code Online (Sandbox Code Playgroud)

Lak*_*uri 27

尝试将它放在build.gradle的android闭包中

buildTypes {
    debug {
        // debug buildType specific stuff
    }
    release {
        // release buildType specific stuff
    }
    applicationVariants.all { variant ->
        if (variant.buildType.name.equals("release") &&
            variant.productFlavors[0].name.equals("green") &&
            variant.zipAlign) {
                def apk = variant.outputFile;
                variant.outputFile = new File(apk.parentFile, "green.apk");
        } else if(variant.buildType.name.equals("release") &&
            variant.productFlavors[0].name.equals("blue") &&
            variant.zipAlign) {
                def apk = variant.outputFile;
                variant.outputFile = new File(apk.parentFile, "blue.apk");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在输出应该green.apkblue.apk.


Hap*_*ngh 14

这将在 2021 年为您提供帮助。

android {
    
//........
flavorDimensions "version"
productFlavors {
    Free {
        dimension "version"
        applicationId "com.exampleFree.app"
    }
    Paid {
        dimension "version"
        applicationId "com.examplePaid.app"
    }
}

applicationVariants.all { variant ->
    variant.outputs.all { output ->
        def appId = variant.applicationId// com.exampleFree.app OR com.examplePaid.app
        def versionName = variant.versionName
        def versionCode = variant.versionCode // e.g 1.0
        def flavorName = variant.flavorName // e. g. Free
        def buildType = variant.buildType.name // e. g. debug
        def variantName = variant.name // e. g. FreeDebug

        //customize your app name by using variables
        outputFileName = "${variantName}.apk"
    }
}}
Run Code Online (Sandbox Code Playgroud)

Apk 名称FreeDebug.apk

证明 在此处输入图片说明

在此处输入图片说明

  • 当您在 2021 年使用捆绑包时不起作用。 (2认同)

not*_*otz 9

对于Android Gradle Plugin 0.13.+你应该使用这样的东西:

android{
    buildTypes {
        applicationVariants.all { variant ->
            variant.outputs.each { output ->
                def apk = output.outputFile;
                def newName = "mysms-" + variant.baseName.replace("-release", "") + "-" + defaultConfig.versionName + ".apk";
                output.outputFile = new File(apk.parentFile, newName);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这已停止在Android Gradle 3.0.0-alpha1中工作.您似乎无法再访问outputFile. (3认同)

J.S*_*nge 9

对于Android Studio 3.0,您必须更改:

applicationVariants.all { variant ->
    variant.outputs.each { output ->
        output.outputFile = new File(output.outputFile.parent, "whatever" + ".apk")
    }
}
Run Code Online (Sandbox Code Playgroud)

至:

android.applicationVariants.all { variant ->
        variant.outputs.all { 
            outputFileName = "whatever" + ".apk")
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 6

我是这样做的:

productFlavors {
        production {
            applicationId "com.example.production"
        }

        staging {
            applicationId "com.example.production.staging"

        }

        applicationVariants.all { variant ->
            variant.outputs.each { output ->
                if(variant.productFlavors[0].name.equals("staging")){
                    output.outputFile = new File(output.outputFile.parent,
                            output.outputFile.name.replace("app-staging-release",  "test"));

                }else{
                    output.outputFile = new File(output.outputFile.parent,
                            output.outputFile.name.replace("app-production-release",  "production"));
                }

            }
        }
    }
Run Code Online (Sandbox Code Playgroud)