Flutter - 支持构建多个BuildTypes

3

我在我的安卓项目中创建了3个构建类型:

buildTypes {
        release {
            signingConfig signingConfigs.release
            resValue "string", "app_name", "AppName"
        }
        debug {
            applicationIdSuffix ".debug"
            resValue "string", "app_name", "AppName - DEV"
        }
        staging {
            initWith release
            matchingFallbacks = ['release']
            applicationIdSuffix ".debug"
        }
    }

我想组装我的临时构建类型,所以我运行了"flutter build apk --staging",但是Flutter找不到这个选项。
Could not find an option named "staging".

似乎Flutter的构建apk命令“flutter build apk”仅支持3种类型:debug、profile和release;而如果使用自定义buildType,则不支持该功能。
是否有可能构建一个自定义BuildType的apk?

我相信你只能使用--flavor并指定口味 :/(有关更多信息,请参阅flutter help build apk的输出)。 - Martin Marconcini
@MartinMarconcini 谢谢,这意味着Flutter不支持多个buildTypes吗? - Juvi
不要完全相信我的话,我对Flutter的经验相对有限,但在看到你的问题后,我花了一点时间进行了一些研究,并没有找到解决方法,也许有更有经验的Flutter开发者可以提供帮助 :) (更新:你读过https://flutter.dev/docs/deployment/android#reviewing-the-build-configuration吗?它提到你可以在AS项目中更改“构建变体”...也许那样可以解决问题?) - Martin Marconcini
这是我注意到的:https://flutter.dev/docs/deployment/android#reviewing-the-build-configuration -> 是的,它在谈论“release”,但截图显示了各种构建变体。 - Martin Marconcini
是的,我也找不到足够的关于那个的信息。截图显示他们使用了3个构建类型,即debug、release和profile,还有一个名为"dynamic"的flavour。我猜现在唯一的解决方案就是将"staging"重命名为"profile"。话虽如此,目前仍然不支持超过3个构建类型。 - Juvi
请记住,“profile”是一个特殊的(类似于开发/发布)优化了性能分析的选项...所以我不确定是否这样做是个好主意,但除非有人找到其他方法,否则我看不到其他解决办法(除了在所有情况下都使用Flavors,这也很麻烦)。 - Martin Marconcini
5个回答

4

我最终使用了productFlavors:

flavorDimensions 'app'


productFlavors {
        dev {
            dimension "app"
            resValue "string", "app_name", "AppName - DEV"
            applicationIdSuffix ".debug"
        }
        staging {
            dimension "app"
            resValue "string", "app_name", "AppName - DEV"
            applicationIdSuffix ".debug"
        }
        prod {
            dimension "app"
            resValue "string", "app_name", "AppName"
        }
    }

1
一种解决方案是使用Android自带的Gradle构建任务而不是使用Flutter命令。
  1. cd android/
  2. ./gradlew app:build
然后,在构建成功后,您应该能够在build/app/outputs/apk/中找到每个构建类型的apk文件。

0
我的问题是启动自定义版本的构建。
以下代码(请参见“preprod”)适用于我(Flutter 3.0.4): 命令行:flutter run --flavor preprod --release
signingConfigs {
    debug {
        storeFile file('../keystores/debug.keystore')
        storePassword 'android'
        keyAlias 'androiddebugkey'
        keyPassword 'android'
    }
    releasetest {
        storeFile file('../keystores/releaseTest-keystore.jks')
        storePassword 'releaseTest'
        keyAlias 'releaseTest'
        keyPassword 'releaseTest'
    }
    release {
        keyAlias keystoreProperties['keyAlias']
        keyPassword keystoreProperties['keyPassword']
        storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
        storePassword keystoreProperties['storePassword']
    }
}

buildTypes {
    debug {
        signingConfig signingConfigs.debug
    }
    release {
        signingConfig signingConfigs.release
        minifyEnabled true
        shrinkResources true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

flavorDimensions "flavor-type"

productFlavors {
    dev {
        dimension "flavor-type"
        applicationIdSuffix ".dev"
    }
    preprod {
        dimension "flavor-type"
        buildTypes.release.signingConfig signingConfigs.releasetest
    }
    prod {
        dimension "flavor-type"
    }
}

0

我有一个解决这个问题的方法,请打开$flutterRoot/packages/flutter_tools/gradle/flutter.gradle,找到project.android.buildTypes

将你的构建类型添加到这个代码块中,然后返回你的 Android 项目,清除缓存/重新启动。


0

如果您实际上不需要它成为构建类型,您可以使用Flutter在Gradle中定义属性的支持,如下所示:

flutter run --release --android-project-arg staging=1

然后在 Gradle 中,您可以检测此属性并根据其更改事物:

buildTypes {
    release {
        signingConfig signingConfigs.release
        resValue "string", "app_name", "AppName"

        if (project.hasProperty("staging")) {
            matchingFallbacks = ["release"]
            applicationIdSuffix ".debug"
        }
    }
    debug {
        applicationIdSuffix ".debug"
        resValue "string", "app_name", "AppName - DEV"
    }
}

将此参数添加到启动配置中也很容易,在 VS Code 中,只需将以下内容添加到.vscode/launch.json中:

"args": ["--android-project-arg", "staging=1"]

我曾经遇到过类似的问题,试图通过构建类型或风格来解决,但是目前Flutter在这方面的支持非常有限。最终我使用了类似于以下的属性。


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