独特的 buildConfigField,适用于所有具有维度的风格

Posted

技术标签:

【中文标题】独特的 buildConfigField,适用于所有具有维度的风格【英文标题】:Unique buildConfigField for all flavors with dimensions 【发布时间】:2019-09-26 08:20:54 【问题描述】:

我有两个风味维度:brandversion,我的风味配置如下所示:

flavorDimensions 'brand', 'version'

Brand1  
    dimension 'brand'
    ...


Brand2 
    dimension 'brand'
    ...


Version1 
    dimension 'version'
    ...


Version2 
    dimension 'version'
    ...

而且我希望每个配置都有四个唯一的buildConfigField-s(例如 HockeyAppId):

品牌1版本1 品牌1版本2 品牌2版本1 品牌2版本2

我该怎么做?

【问题讨论】:

【参考方案1】:

为此我编写了自己的插件:https://github.com/nikialeksey/porflavor,现在我可以定义这样的字段:

flavorDimensions 'brand', 'version'

productFlavors 
  Brand1  
    dimension 'brand'
    ...
  
  Brand2 
    dimension 'brand'
    ...
  

  Version1 
    dimension 'version'
    ...
  
  Version2 
    dimension 'version'
    ...
  


apply plugin: 'com.nikialeksey.porflavor'
porflavor 
  Brand1Version1 
    buildConfigField "boolean", "fooFeatureEnabled", "false"
  
  Brand2Version2 
    buildConfigField "boolean", "fooFeatureEnabled", "true"
  
  ...


【讨论】:

【参考方案2】:

所以这很简单。您可以不费吹灰之力地修改每种风味或发布类型。

如果您试图在多个维度上重用一种风味,那不是他们想要的功能。风味意味着是应用程序的构建编译打包版本。它并不是真正意义上的通用参数集。因此,您需要为每个差异提供一种风味,例如

flavor1 -> 在维度 1

flavor1Dimension2 -> 在维度 2

flavor2 -> 在维度 1

flavor2Dimension2 -> 在维度 2 等..

这里我举个使用动态的例子

资源 构建配置 清单占位符 应用程序 ID

当然,您还可以做更多事情,但这应该可以满足您的要求。

flavorDimensions 'default', 'secondary'

productFlavors 
    a35Demo 
        dimension 'default'
        applicationId "com.appstudio35.yourappstudio.demo"
        buildConfigField "int", "BUSINESS_ID", "1"
        resValue "string", "app_name", "App Studio 35"
        buildConfigField "String", "NOTIFICATION_ICON", '"ic_launcher"'
        manifestPlaceholders = [iconPath:"@mipmap/ic_launcher", roundIconPath:"@mipmap/ic_launcher_round"]
    
    smallville 
        dimension 'secondary'
        applicationId "com.appstudio35.yourappstudio.smallville"
        buildConfigField "int", "BUSINESS_ID", "22"
        resValue "string", "app_name", "Smallville"
        buildConfigField "String", "NOTIFICATION_ICON", '"ic_launcher_smallville"'
        manifestPlaceholders = [iconPath:"@mipmap/ic_launcher_smallville", roundIconPath:"@mipmap/ic_launcher_round_smallville"]
    


buildTypes 
    debug 
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        buildConfigField "String", "SERVER_URL", '"https://api.dev.myurl.com"'
        shrinkResources false //remove unused resources per flavor
        minifyEnabled false
    
    release 
        buildConfigField "String", "SERVER_URL", '"https://api.prod.myurl.com"'

        shrinkResources true //remove unused resources per flavor
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

        //production builds
        productFlavors.a35Demo.signingConfig signingConfigs.releaseA35YourAppStudio
        productFlavors.smallville.signingConfig signingConfigs.releaseA35YourAppStudio
    

编码愉快!

【讨论】:

谢谢!但是在您的示例中只有一个风味维度 - default。我想为多维度描述的风味添加一个独特的buildConfigField 对不起,我没有添加,因为我认为这部分很简单。只是改变尺寸。我更新了要显示的示例。除非我误解了你的挑战? 好的,我明白你的意思了,我更新了我的答案以澄清,但你试图以我认为不打算使用的方式使用风味。 我为此编写了自己的插件:github.com/nikialeksey/porflavor,现在我可以为具有尺寸的风味配置变体

以上是关于独特的 buildConfigField,适用于所有具有维度的风格的主要内容,如果未能解决你的问题,请参考以下文章

CSS圆角适用于所有没有图像和javascript的浏览器

Gradle buildType/productFlavor 使用意外的 buildConfigField

定义特定风味的buildconfigfield和buildType

Android反射修改buildConfigField生成的属性失效问题

将 gradle 更新到 7.0.3 后 buildConfigField 不起作用

Android Gradle 插件ProductFlavor 配置 ( ProductFlavor#buildConfigField 方法 | 单独编译生成 BuildConfig 类的任务 )