首页 > 解决方案 > 为什么更改默认应用程序名称在使用颤振构建的 android productFlavors 中不起作用

问题描述

现在我正在使用 android productFlavors 将应用程序打包在颤振中,这是我的命令:

~/apps/flutter/bin/flutter build apk --release --flavor prod -t lib/main_pro.dart --no-sound-null-safety

但输出名称始终是app-prod-release.apk

$ ~/apps/flutter/bin/flutter build apk --release --flavor prod -t lib/main_pro.dart --no-sound-null-safety                                                                                             ‹ruby-2.7.2›
Changing current working directory to: /Users/dolphin/source/cruise-open

Building without sound null safety
For more information see https://dart.dev/null-safety/unsound-null-safety

Running Gradle task 'assembleProdRelease'...
Running Gradle task 'assembleProdRelease'... Done                   7.1s
✓ Built build/app/outputs/flutter-apk/app-prod-release.apk (23.7MB).
(base)

这是我的android/app/build.gradlegradle 配置:

flavorDimensions 'app'

        productFlavors {

            prod {
                dimension 'app'
                resValue "string", "app_name", "Cruise"
                manifestPlaceholders = [
                        "APP_NAME"    : "cruise-production"
                ]
            }
        }

现在我想要包名之类的cruise-prouction-release.apk,而不是app-prod-release.apk. 我应该怎么做才能更改默认包名称?我尝试将输出包名称更改为releaseApkName.apk

buildTypes {
        release {
            signingConfig signingConfigs.debug

            android.applicationVariants.all { variant ->
                variant.outputs.all { output ->
                    println("releaseApkName")
                    output.outputFileName = "releaseApkName.apk"
                }
            }
        }
}

但这似乎不起作用。这是我现在的完整配置:

def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) {
    localPropertiesFile.withReader('UTF-8') { reader ->
        localProperties.load(reader)
    }
}

def flutterRoot = localProperties.getProperty('flutter.sdk')
if (flutterRoot == null) {
    throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
}

def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
    flutterVersionCode = '1'
}

def flutterVersionName = localProperties.getProperty('flutter.versionName')
if (flutterVersionName == null) {
    flutterVersionName = '1.0'
}

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"

android {
    compileSdkVersion 28

    sourceSets {
        main.java.srcDirs += 'src/main/kotlin'
    }

    lintOptions {
        disable 'InvalidPackage'
    }

    defaultConfig {
        // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
        applicationId "com.earth.dolphin"
        minSdkVersion 18
        targetSdkVersion 28
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
    }

    buildTypes {
        release {
            signingConfig signingConfigs.debug

            android.applicationVariants.all { variant ->
                variant.outputs.all { output ->
                    outputFileName = "a.apk"
                }
            }
        }
    }

    flavorDimensions 'app'

    productFlavors {
        dev {
            dimension 'app'
            resValue "string", "app_name", "Cruise-dev"
            applicationIdSuffix '.dev'
        }

        stage {
            dimension 'app'
            resValue "string", "app_name", "Cruise-stage"
            applicationIdSuffix '.stage'
        }

        prod {
            dimension 'app'
            resValue "string", "app_name", "Cruise"
        }
    }
}

flutter {
    source '../..'
}

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
}

gradle 版本是 5.6.2。这是仍然使用默认名称的输出:

在此处输入图像描述

标签: androidflutter

解决方案


最后我正在使用这个脚本,它可以工作:

buildTypes {
        release {
            signingConfig signingConfigs.debug
            android.applicationVariants.all { variant ->
                variant.outputs.all { output ->
                    def buildType = variant.buildType.name
                    println("buildType=" + buildType)
                    if (buildType != "debug") {
                        def projectRootDir = "$rootDir"
                        def outputFileDir = new File(projectRootDir + File.separator, "apk")
                        println("outputFileDir=" + outputFileDir)
                        def productFlavorsName = productFlavors.name.toString()
                        def oldApkFlavorsName = productFlavorsName.replace("[", "").trim()
                        def newApkFlavorsName = oldApkFlavorsName.replace("]", "").trim()
                        println("newApkFlavorsName=" + newApkFlavorsName)
                        def apkFlavorsNameDir = new File(outputFileDir, newApkFlavorsName)
                        println("apkFlavorsNameDir=" + apkFlavorsNameDir)
                        // variant.getPackageApplicationProvider().get().outputDirectory = apkFlavorsNameDir
                        def appName
                        if (productFlavorsName.contains("dev")) {
                            appName = "cruise-dev"
                        } else if (productFlavorsName.contains("test")) {
                            appName = "cruise-beta"
                        } else if (productFlavorsName.contains("prod")) {
                            appName = "cruise-release"
                        }else{
                            appName = "cruise-beta"
                        }
                        def releaseApkName = "" + appName + "-" + defaultConfig.versionName + ".apk"
                        output.outputFileName = releaseApkName
                    }
                }
            }
        }
    }

包输出路径为:

/Users/dolphin/source/cruise-open/build/app/outputs/apk/prod/release

看起来像这样:

在此处输入图像描述


推荐阅读