如何配置构建类型与产品风格?

How to configure build types vs. product flavors?

基于这个答案我有一个跟进问题:是什么让一个应用程序与众不同,说明产品口味?我正在尝试将其与我的 XCode 设置进行比较,如下所示:

我对 android 设置的看法:

构建类型: debug_test debug_production // 不需要企业应用程序,因为在任何设备上都可以使用未签名的应用程序 发布

口味: 我的应用

感谢您的支持!

好吧,为了使用不同的后端,我不会指定比 debugrelease 更多的构建类型。 相反,我会使用其中的一些技巧:

  • 更多口味,
  • 自定义构建配置字段(文档 here),
  • 组合多种产品口味(文档 here)。

您可以使用 BuildConfig class.

在应用程序代码中访问构建类型、构建风格和自定义字段

采用简单风格的方法

  • 构建类型:

    • debug
    • release
  • 口味:

    • dev
    • test
    • live

这会导致这些构建变体(您不必使用所有变体):

  • devDebug
  • devRelease
  • testDebug
  • testRelease
  • liveDebug
  • liveRelease

使用维度组合多种口味的方法

  • 风味维度:

    • backend
    • target
  • 构建类型:

    • debug
    • release
  • 口味:

    • target维度:
      • dev
      • test
      • live
    • backend维度:
      • production
      • test

这会导致这些构建变体(同样,您不必使用所有变体):

  • productionDevDebug
  • productionDevRelease
  • productionTestDebug
  • productionTestRelease
  • productionLiveDebug
  • productionLiveRelease
  • testDevDebug
  • testDevRelease
  • testTestDebug
  • testTestRelease
  • testLiveDebug
  • testLiveRelease

使用构建字段

在构建类型和构建风格声明中使用附加值,例如:

buildConfigField "boolean", "production_backend", "false"

buildConfigField "String", "backend", "\"production\""

build.gradle

class Globals {
    static String devDebug = "_devDebug"
    static String devRelease = "_devRelease"
    static String stagingQA = "_stagingQa"
    static String prodRelease = "_prodRelease"
    static String prodDebug = "_prodDebug"

    def firstproduct = "firstproductFP"
    def secondproduct = "secondproductFP"

//     Product key
    static String FP = "FP"
    static String SP = "SP"
}

android {

    buildTypes {
        debug {}
        qa {}
        release {}
    }

    flavorDimensions "client", "backend"
    productFlavors { 

//          First Product (FP)
        FP_dev {    
            dimension 'backend'
            buildConfigField("String", "TEST", "\"FP_dev\"")
        }
        FP_staging {
            dimension 'backend'
            buildConfigField("String", "TEST", "\"FP_staging\"")
        }
        FP_prod {
            dimension 'backend'
            buildConfigField("String", "TEST", "\"FP_prod\"")
        }
        firstproduct {
            dimension 'client'
            ...
        }


//          Second Product (SP)
        SP_dev {    
            dimension 'backend'
            buildConfigField("String", "TEST", "\"SP_dev\"")
        }
        SP_staging {
            dimension 'backend'
            buildConfigField("String", "TEST", "\"SP_staging\"")
        }
        SP_prod {
            dimension 'backend'
            buildConfigField("String", "TEST", "\"SP_prod\"")
        }
        secondproduct {
            dimension 'client'
            ...
        }
}

    variantFilter {
        variant ->
           def needed = variant.name in [
                    Globals.firstproduct + Globals.FP + Globals.devDebug,
                    Globals.firstproduct + Globals.FP + Globals.stagingQA,
                    Globals.firstproduct + Globals.FP + Globals.prodRelease,

                    Globals.secondproduct + Globals.FP + Globals.devDebug,
                    Globals.secondproduct + Globals.FP + Globals.stagingQA,
                    Globals.secondproduct + Globals.FP + Globals.prodRelease
            ]
            variant.setIgnore(!needed)
    }

}

此解决方案的方法允许为多种产品风格提供多个客户端编译和后端环境。

我所做的是将后端的开发环境与调试 android 的编译相关联,将后端的暂存与 qa android 以及后端的生产与发布 android。请记住,在某些情况下您需要调试生产环境或混淆开发环境,此解决方案允许。

  • firstproductFP_devDebug
  • firstproductFP_stagingQa
  • firstproductFP_prodRelease
  • secondproductSP_devDebug
  • secondproductSP_stagingQa
  • secondproductSP_prodRelease

编译时的一个例子firstproductFP_devDebug:

BuildConfig.java

public static final String FLAVOR = "firstproductFP_dev";
public static final String FLAVOR_client = "firstproduct";
public static final String FLAVOR_backend = "FP_dev";
public static final String BUILD_TYPE = "debug";

需要注意的是,在 variantFilter{} 范围内,您不能使用 buildConfigField() 根据构建类型和产品风格编译值。这迫使我们使用 flavorDimensions 和更大数量的 productsFlavors。也不能重命名活动构建变体。

IMPORTANT: The values of the variables must match the names of the products flavors

GL

来源: