Gradle始终从最后一个flavor中的buildType获取值

ext*_*mkv 13 groovy android gradle android-studio

在我工作的公司,我们在内部和外部项目中使用了很多口味.还有2或3个构建类型(dev,prod和qa),有时我们需要更改flavor中特定buildType的特定变量.

这是问题出现的地方,当我有更多的味道时,Groovy总是采用最后一个buildType的配置.

例:

首先,我定义了新的buildTypes:

android {
...
 buildTypes {
        development {
            initWith debug
        }
        production {
            initWith release
        }
    }
...
}
Run Code Online (Sandbox Code Playgroud)

然后我使用特定的buildType更改来定义flavor:

productFlavors {
     mcDonalds {
           ...
            buildTypes {
                development {
                    manifestPlaceholders = [onesignal_app_id               : "4b77f560-26f3-420d-b438-d7aeb9912d4d",
                                            onesignal_google_project_number: "REMOTE"]
                }
                production {
                    manifestPlaceholders = [onesignal_app_id               : "6b77f560-26f3-420d-b438-d7aeb9912d33",
                                            onesignal_google_project_number: "REMOTE"]
                }
            }
        }
        burgerKing {
           ...
            buildTypes {
                development {
                    manifestPlaceholders = [onesignal_app_id               : "8b77f560-26f3-420d-b438-d7aeb9912d44",
                                            onesignal_google_project_number: "REMOTE"]
                }
                production {
                    manifestPlaceholders = [onesignal_app_id               : "0b77f560-26f3-420d-b438-d7aeb9912456",
                                            onesignal_google_project_number: "REMOTE"]
                }
            }
        }
}
Run Code Online (Sandbox Code Playgroud)

无论我选择构建的风格如何,gradle将始终采用最后一种风格的值,当我向mcDonalds用户发送推送通知时,所有burgerKing用户都将收到有关大mac的广告.

Google 告诉我这是有意的,如果我使用build.gradle.ktl,它就不会发生.我不明白他们怎么说这是有意的.对我来说这是一个Groovy问题,这是一个错误,更多人在问题跟踪器上报告相同的问题.

您建议使用哪种解决方法?

请不要建议我使用另一个维度,它不会起作用,因为每个flavor/buildType中的配置都会发生变化,我认为构建变体的数量是荒谬的:

  • mcDonaldsDevelopmentDebug
  • mcDonaldsDevelopmentRelease
  • mcDonaldsProductionDebug
  • mcDonaldsProductionRelease
  • burgerKingDevelopmentDebug
  • burgerKingDevelopmentRelease
  • burgerKingProductionDebug
  • burgerKingProductionRelease

我只需要这样的东西:

  • mcDonaldsDevelopment
  • mcDonaldsProduction
  • burgerKingDevelopment
  • burgerKingProduction

Dan*_*ouf 0

您可以采取以下解决方法:在构建时定义字符串值,您可以在代码的任何部分引用这些值。这是一个可能对您或其他人有帮助的示例

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

productFlavors {
    mcDonalds {
        resValue "string", "key1", "value1"
        resValue "string", "key2", "value2"
    }
    burgerKing {
        resValue "string", "key1", "value1"
        resValue "string", "key2", "value2"
    }
Run Code Online (Sandbox Code Playgroud)

}

这将创建以下具有不同配置的构建变体

  1. 麦当劳发展
  2. 麦当劳制作公司
  3. 汉堡王发展
  4. 汉堡王制作公司

同样在您的代码中,您可以使用以下命令检查您是否正在进行开发生产

if (BuildConfig.DEBUG) {
       //select string for development (key1)
    } else {
       //select string for production (key2)
    }
Run Code Online (Sandbox Code Playgroud)