使用不同的应用程序 ID 构建不同风格的 Flutter 应用程序

Posted

技术标签:

【中文标题】使用不同的应用程序 ID 构建不同风格的 Flutter 应用程序【英文标题】:Building Different flavors of a Flutter app with different Application IDs 【发布时间】:2020-09-06 20:00:16 【问题描述】:

我有一些关于如何正确执行此操作的问题 - Flutter 团队关于使用 Flavors 的文档有些缺乏,到目前为止,教程和文章似乎都来自那些在了解它时发布的人。我很欣赏这里的努力,但也认识到知识是不完整的。

可以在很多地方设置应用程序 ID,特别是在 androidManifest 和 build.gradle 文件中。

例子:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.domain.app">
    <!-- io.flutter.app.FlutterApplication is an android.app.Application that
         calls FlutterMain.startInitialization(this); in its onCreate method.
         In most cases you can leave this as-is, but you if you want to provide
         additional functionality it is fine to subclass or reimplement
         FlutterApplication and put your custom class here. -->
    <uses-permission android:name="android.permission.INTERNET"/>

例子:

    defaultConfig 
        // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
        applicationId "com.domain.appname"
        minSdkVersion 23
        targetSdkVersion 29
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
    

    flavorDimensions "appFlavor"
    productFlavors 
        qa 
            dimension "appFlavor"
            applicationId "com.domain.appflavor1"
        
        prod 
            dimension "appFlavor"
            applicationId "com.domain.appflavor2"
        
        dev 
            dimension "appFlavor"
            applicationId "com.domain.appflavor3"
        
    

应用程序 ID 也出现在 Kotlin MainActivity.kt 文件中,以及 src 目录下该文件的路径中。据我所知,此处指定的值对应用程序功能没有任何影响。但它肯定在某处有一定的相关性。

在各个配置集中为 build.gradle 中的各个风味设置的值按预期工作。

但是当您有多个 AndroidManifest.xml 文件时——例如,每种风格一个,这些都必须指定与主 AndroidManifest.xml 文件中的完全相同的包。尝试忽略该值会导致错误。主 AndroidManifest 中的值似乎无关紧要,只要它与特定风格 AndroidManifest 中的名称匹配即可

但这没有任何意义——包名和applicationID怎么会不同,app build.gradle和AndroidManifest之间怎么会冲突呢?

究竟哪个会被用来做什么?

我在 S.E 上还有一个未解决的问题,我正在与 MissingPlugin 异常相关的问题作斗争,我认为这可能与这里有关:Flutter issues with release-mode only APK builds

【问题讨论】:

您确定必须为每种口味添加一个 Android Manifest 吗?在我从事的一个具有风味的项目中,每个调试、配置文件和发布都只有 android 清单。.. @MathisFouques 是的,我使用它们为每种风味提供唯一的名称和图标。如果消除 AndroidManifestfiles 将是有益的,我可能可以在没有图标和名称的情况下生活,直到我找到另一个解决方案。 【参考方案1】:

对于 productFlavors 块中的每个风味,您可以重新定义 applicationId 属性,或者您可以改为使用 applicationIdSuffix 将一个段附加到默认应用程序 ID

https://developer.android.com/studio/build/application-id

【讨论】:

但 build.gradle 仅适用于 android。

以上是关于使用不同的应用程序 ID 构建不同风格的 Flutter 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

Gradle:如何构建不同构建类型的不同风格?

使用多种模板/风格构建单个 Apk

如何在 Xcode 中更改 $(PRODUCT_BUNDLE_IDENTIFIER)?

我们可以按风格组织存储库并构建变体吗

如何为不同的风格和构建类型设置 applicationid?

Crashlytics (Fabric) 为应用程序变体(构建类型、产品风格)分离组织