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

15
基于这个答案(https://dev59.com/jF4c5IYBdhLWcg3wdKGT#27908019),我有一个后续问题:什么因素使得应用程序在产品口味上有所不同? 我正在尝试将其与我的XCode设置进行比较,如下所示:
  • 使用测试后端的Dev App
  • 使用生产后端的Dev App
  • 使用测试后端的Test App(企业分发)
  • 使用生产后端的Test App(企业分发)
  • 使用生产后端的Live App(应用商店分发)

我对Android设置的想法:

buildTypes: debug_test debug_production //不需要企业应用程序,因为可以在任何设备上使用未签名的应用程序 release

flavors: myApp

感谢您的支持!

2个回答

19

我不建议在使用不同的后端时指定更多的构建类型,只需使用以下某些技术:

  • 更多的 flavor,
  • 自定义构建配置字段(文档在这里),
  • 组合多个产品口味(文档在这里)。

您可以使用 BuildConfig 类在应用程序代码中访问构建类型、构建 flavors 和自定义字段。

采用简单 Flavor 的方法

  • 构建类型:

    • debug
    • release
  • Flavors:

    • dev
    • test
    • live

这将产生以下构建变体 (您不必使用所有变体):

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

采用使用维度组合多个 Flavor 的方法

  • Flavor 维度:

    • backend
    • target
  • 构建类型:

    • debug
    • release
  • Flavors:

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

这将产生以下构建变体(您不必使用所有变体):

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

使用build字段

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

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

或者

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


1
非常感谢!起初我认为这种结构是错误的,因为Android文档说“构建类型”应该遵循您的开发周期(dev、test、production),但使用flavors似乎更容易... - Fahim

2

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调试编译相关联,将后端的staging环境与Android的qa相关联,将后端的生产环境与Android的release相关联。请注意,有时您需要在生产环境中进行调试或混淆开发环境,这个解决方案可以实现。以下是需要翻译的内容:
  • 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。同时也不能重命名活动构建变体。

重要提示:变量的值必须与产品风味的名称匹配。

GL

参考来源:


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