# ProductFlavor

```
@Incubating interface ProductFlavor : Named, BaseFlavor, ExtensionAware
```

|---|
| [com.android.build.api.dsl.ProductFlavor](https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/ProductFlavor#) |

|---|
| Known Direct Subclasses [ApplicationProductFlavor](https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/ApplicationProductFlavor), [DynamicFeatureProductFlavor](https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/DynamicFeatureProductFlavor), [LibraryProductFlavor](https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/LibraryProductFlavor), [TestProductFlavor](https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/TestProductFlavor) |---|---| | [ApplicationProductFlavor](https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/ApplicationProductFlavor) | <br /> | | [DynamicFeatureProductFlavor](https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/DynamicFeatureProductFlavor) | <br /> | | [LibraryProductFlavor](https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/LibraryProductFlavor) | <br /> | | [TestProductFlavor](https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/TestProductFlavor) | <br /> | |

Encapsulates all product flavors properties for this project.

Product flavors represent different versions of your project that you expect to co-exist on a
single device, the Google Play store, or repository. For example, you can configure 'demo' and
'full' product flavors for your app, and each of those flavors can specify different features,
device requirements, resources, and application ID's--while sharing common source code and
resources. So, product flavors allow you to output different versions of your project by simply
changing only the components and settings that are different between them.

Configuring product flavors is similar to
[configuring build types](https://developer.android.com/studio/build/build-variants.html#build-types):
add them to the `productFlavors` block of your project's `build.gradle` file
and configure the settings you want.

Product flavors support the same properties as the [DefaultConfig](https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/DefaultConfig) block---this is because
`defaultConfig` defines a [ProductFlavor](https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/ProductFlavor#) object that the plugin uses as the base configuration
for all other flavors.
Each flavor you configure can then override any of the default values in `defaultConfig`, such as
the [`applicationId`](https://d.android.com/studio/build/application-id.html).

When using Android plugin 3.0.0 and higher,
*[each flavor must belong to a `dimension`](https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/ProductFlavor#dimension:kotlin.String)*.

When you configure product flavors, the Android plugin automatically combines them with your
[BuildType](https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/BuildType) configurations to
[create build variants](https://developer.android.com/studio/build/build-variants.html).
If the plugin creates certain build variants that you don't want, you can
[filter variants using `android.variantFilter`](https://developer.android.com/studio/build/build-variants.html#filter-variants).

## Summary

| ### Public methods ||
|---|---|
| abstract [Void](http://docs.oracle.com/javase/8/docs/api/java/lang/Void.html)? | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/ProductFlavor#setDimension(kotlin.String)(dimension: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html?)` <br /> |
| abstract [Unit](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-unit/index.html) | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/ProductFlavor#setMatchingFallbacks(kotlin.String)(vararg fallbacks: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html)` <br /> |
| abstract [Unit](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-unit/index.html) | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/ProductFlavor#setMatchingFallbacks(kotlin.collections.List)(fallbacks: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-list/index.html<https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html>)` <br /> |

| ### Inherited functions ||
|---|---|
| From class `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/VariantDimension` |---|---| | `https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/VariantDimension#addManifestPlaceholders(kotlin.collections.Map)(manifestPlaceholders: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-map/index.html<https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html, https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-any/index.html>)` Adds manifest placeholders. See [Inject Build Variables into the Manifest](https://developer.android.com/studio/build/manifest-build-variables.html). <br /> | | `https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/VariantDimension#buildConfigField(kotlin.String,%20kotlin.String,%20kotlin.String)(type: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html, name: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html, value: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html)` Adds a new field to the generated BuildConfig class. The field is generated as: `<type> <name> = <value>;` This means each of these must have valid Java content. If the type is a String, then the value should include quotes. <br /> | | `https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/VariantDimension#externalNativeBuild(kotlin.Function1)(action: https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/ExternalNativeBuildOptions.() -> https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-unit/index.html)` Encapsulates per-variant CMake and ndk-build configurations for your external native build. To learn more, see [Add C and C++ Code to Your Project](http://developer.android.com/studio/projects/add-native-code.html#). <br /> | | `https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/VariantDimension#javaCompileOptions(kotlin.Function1)(action: https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/JavaCompileOptions.() -> https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-unit/index.html)` Options for configuring Java compilation. <br /> | | `https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/VariantDimension#ndk(kotlin.Function1)(action: https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/Ndk.() -> https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-unit/index.html)` Encapsulates per-variant configurations for the NDK, such as ABI filters. <br /> | | `https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-any/index.html` | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/VariantDimension#proguardFile(kotlin.Any)(proguardFile: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-any/index.html)` Adds a new ProGuard configuration file. `proguardFile getDefaultProguardFile('proguard-android.txt')` There are two ProGuard rules files that ship with the Android plugin and are used by default: - proguard-android.txt - proguard-android-optimize.txt `proguard-android-optimize.txt` is identical to `proguard-android.txt`, except with optimizations enabled. You can use [getDefaultProguardFileString](https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/ProductFlavor#) to return the full path of the files. This method has a return value for legacy reasons. <br /> | | `https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-any/index.html` | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/VariantDimension#proguardFiles(kotlin.Any)(vararg files: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-any/index.html)` Adds new ProGuard configuration files. There are two ProGuard rules files that ship with the Android plugin and are used by default: - proguard-android.txt - proguard-android-optimize.txt `proguard-android-optimize.txt` is identical to `proguard-android.txt`, except with optimizations enabled. You can use [getDefaultProguardFileString](https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/ProductFlavor#) to return the full path of the files. This method has a return value for legacy reasons. <br /> | | `https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/VariantDimension#resValue(kotlin.String,%20kotlin.String,%20kotlin.String)(type: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html, name: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html, value: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html)` Adds a new generated resource. This is equivalent to specifying a resource in res/values. See [Resource Types](http://developer.android.com/guide/topics/resources/available-resources.html). <br /> | | `http://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?` | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/VariantDimension#setManifestPlaceholders(kotlin.collections.Map)(manifestPlaceholders: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-map/index.html<https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html, https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-any/index.html>)` <br /> | | `https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-any/index.html` | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/VariantDimension#setProguardFiles(kotlin.collections.Iterable)(proguardFileIterable: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-iterable/index.html<*>)` Replaces the ProGuard configuration files. This method has a return value for legacy reasons. <br /> | | `https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/VariantDimension#shaders(kotlin.Function1)(action: https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/Shaders.() -> https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-unit/index.html)` Configure the shader compiler options. <br /> | | `https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-any/index.html` | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/VariantDimension#testProguardFile(kotlin.Any)(proguardFile: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-any/index.html)` Adds a proguard rule file to be used when processing test code. Test code needs to be processed to apply the same obfuscation as was done to main code. This method has a return value for legacy reasons. <br /> | | `https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-any/index.html` | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/VariantDimension#testProguardFiles(kotlin.Any)(vararg proguardFiles: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-any/index.html)` Adds proguard rule files to be used when processing test code. Test code needs to be processed to apply the same obfuscation as was done to main code. This method has a return value for legacy reasons. <br /> | ||
| From class `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/BaseFlavor` |---|---| | `https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/BaseFlavor#minSdkVersion(kotlin.Int)(minSdkVersion: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html)` <br /> | | `https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/BaseFlavor#minSdkVersion(kotlin.String)(minSdkVersion: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html?)` <br /> | | `https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/BaseFlavor#missingDimensionStrategy(kotlin.String,%20kotlin.String)(dimension: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html, requestedValue: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html)` Specifies a flavor that the plugin should try to use from a given dimension in a dependency. Android plugin 3.0.0 and higher try to match each variant of your module with the same one from its dependencies. For example, consider if both your app and its dependencies include a "tier" [flavor dimension](https://developer.android.com/studio/build/build-variants#flavor-dimensions), with flavors "free" and "paid". When you build a "freeDebug" version of your app, the plugin tries to match it with "freeDebug" versions of the local library modules the app depends on. However, there may be situations in which **a library dependency includes a flavordimension that your app does not**. For example, consider if a library dependency includes flavors for a "minApi" dimension, but your app includes flavors for only the "tier" dimension. So, when you want to build the "freeDebug" version of your app, the plugin doesn't know whether to use the "minApi23Debug" or "minApi18Debug" version of the dependency, and you'll see an error message similar to the following: ``` Error:Failed to resolve: Could not resolve project :mylibrary. Required by: project :app ``` In this type of situation, use `missingDimensionStrategy` in the [`defaultConfig`](https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/com.android.build.gradle.internal.dsl.DefaultConfig) block to specify the default flavor the plugin should select from each missing dimension, as shown in the sample below. You can also override your selection in the [`productFlavors`](https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/com.android.build.gradle.internal.dsl.ProductFlavor) block, so each flavor can specify a different matching strategy for a missing dimension. (Tip: you can also use this property if you simply want to change the matching strategy for a dimension that exists in both the app and its dependencies.) ``` // In the app's build.gradle file. android { defaultConfig { // Specifies a flavor that the plugin should try to use from // a given dimension. The following tells the plugin that, when encountering // a dependency that includes a "minApi" dimension, it should select the // "minApi18" flavor. missingDimensionStrategy 'minApi', 'minApi18' // You should specify a missingDimensionStrategy property for each // dimension that exists in a local dependency but not in your app. missingDimensionStrategy 'abi', 'x86' } flavorDimensions 'tier' productFlavors { free { dimension 'tier' // You can override the default selection at the product flavor // level by configuring another missingDimensionStrategy property // for the "minApi" dimension. missingDimensionStrategy 'minApi', 'minApi23' } paid { } } } ``` <br /> | | `https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/BaseFlavor#missingDimensionStrategy(kotlin.String,%20kotlin.String)(dimension: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html, vararg requestedValues: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html)` Specifies a sorted list of flavors that the plugin should try to use from a given dimension in a dependency. Android plugin 3.0.0 and higher try to match each variant of your module with the same one from its dependencies. For example, consider if both your app and its dependencies include a "tier" [flavor dimension](https://developer.android.com/studio/build/build-variants#flavor-dimensions), with flavors "free" and "paid". When you build a "freeDebug" version of your app, the plugin tries to match it with "freeDebug" versions of the local library modules the app depends on. However, there may be situations in which **a library dependency includes a flavordimension that your app does not**. For example, consider if a library dependency includes flavors for a "minApi" dimension, but your app includes flavors for only the "tier" dimension. So, when you want to build the "freeDebug" version of your app, the plugin doesn't know whether to use the "minApi23Debug" or "minApi18Debug" version of the dependency, and you'll see an error message similar to the following: ``` Error:Failed to resolve: Could not resolve project :mylibrary. Required by: project :app ``` In this type of situation, use `missingDimensionStrategy` in the [`defaultConfig`](https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/com.android.build.gradle.internal.dsl.DefaultConfig) block to specify the default flavor the plugin should select from each missing dimension, as shown in the sample below. You can also override your selection in the [`productFlavors`](https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/com.android.build.gradle.internal.dsl.ProductFlavor) block, so each flavor can specify a different matching strategy for a missing dimension. (Tip: you can also use this property if you simply want to change the matching strategy for a dimension that exists in both the app and its dependencies.) ``` // In the app's build.gradle file. android { defaultConfig { // Specifies a flavor that the plugin should try to use from // a given dimension. The following tells the plugin that, when encountering // a dependency that includes a "minApi" dimension, it should select the // "minApi18" flavor. missingDimensionStrategy 'minApi', 'minApi18' // You should specify a missingDimensionStrategy property for each // dimension that exists in a local dependency but not in your app. missingDimensionStrategy 'abi', 'x86' } flavorDimensions 'tier' productFlavors { free { dimension 'tier' // You can override the default selection at the product flavor // level by configuring another missingDimensionStrategy property // for the "minApi" dimension. missingDimensionStrategy 'minApi', 'minApi23' } paid { } } } ``` <br /> | | `https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/BaseFlavor#missingDimensionStrategy(kotlin.String,%20kotlin.collections.List)(dimension: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html, requestedValues: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-list/index.html<https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html>)` Specifies a sorted list of flavors that the plugin should try to use from a given dimension in a dependency. Android plugin 3.0.0 and higher try to match each variant of your module with the same one from its dependencies. For example, consider if both your app and its dependencies include a "tier" [flavor dimension](https://developer.android.com/studio/build/build-variants#flavor-dimensions), with flavors "free" and "paid". When you build a "freeDebug" version of your app, the plugin tries to match it with "freeDebug" versions of the local library modules the app depends on. However, there may be situations in which **a library dependency includes a flavordimension that your app does not**. For example, consider if a library dependency includes flavors for a "minApi" dimension, but your app includes flavors for only the "tier" dimension. So, when you want to build the "freeDebug" version of your app, the plugin doesn't know whether to use the "minApi23Debug" or "minApi18Debug" version of the dependency, and you'll see an error message similar to the following: ``` Error:Failed to resolve: Could not resolve project :mylibrary. Required by: project :app ``` In this type of situation, use `missingDimensionStrategy` in the [`defaultConfig`](https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/com.android.build.gradle.internal.dsl.DefaultConfig) block to specify the default flavor the plugin should select from each missing dimension, as shown in the sample below. You can also override your selection in the [`productFlavors`](https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/com.android.build.gradle.internal.dsl.ProductFlavor) block, so each flavor can specify a different matching strategy for a missing dimension. (Tip: you can also use this property if you simply want to change the matching strategy for a dimension that exists in both the app and its dependencies.) ``` // In the app's build.gradle file. android { defaultConfig { // Specifies a flavor that the plugin should try to use from // a given dimension. The following tells the plugin that, when encountering // a dependency that includes a "minApi" dimension, it should select the // "minApi18" flavor. missingDimensionStrategy 'minApi', 'minApi18' // You should specify a missingDimensionStrategy property for each // dimension that exists in a local dependency but not in your app. missingDimensionStrategy 'abi', 'x86' } flavorDimensions 'tier' productFlavors { free { dimension 'tier' // You can override the default selection at the product flavor // level by configuring another missingDimensionStrategy property // for the "minApi" dimension. missingDimensionStrategy 'minApi', 'minApi23' } paid { } } } ``` <br /> | | `https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/BaseFlavor#resConfig(kotlin.String)(config: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html)` <br /> | | `https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/BaseFlavor#resConfigs(kotlin.collections.Collection)(config: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-collection/index.html<https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html>)` <br /> | | `https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/BaseFlavor#resConfigs(kotlin.String)(vararg config: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html)` <br /> | | `https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/BaseFlavor#setMinSdkVersion(kotlin.Int)(minSdkVersion: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html)` <br /> | | `https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/BaseFlavor#setMinSdkVersion(kotlin.String)(minSdkVersion: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html?)` <br /> | | `https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-any/index.html?` | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/BaseFlavor#setTestFunctionalTest(kotlin.Boolean)(testFunctionalTest: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-boolean/index.html)` <br /> | | `https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-any/index.html?` | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/BaseFlavor#setTestHandleProfiling(kotlin.Boolean)(testHandleProfiling: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-boolean/index.html)` <br /> | | `https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-any/index.html?` | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/BaseFlavor#setTestInstrumentationRunnerArguments(kotlin.collections.MutableMap)(testInstrumentationRunnerArguments: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-mutable-map/index.html<https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html, https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html>)` <br /> | | `https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/BaseFlavor#testInstrumentationRunnerArgument(kotlin.String,%20kotlin.String)(key: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html, value: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html)` <br /> | | `https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/BaseFlavor#testInstrumentationRunnerArguments(kotlin.collections.Map)(args: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-map/index.html<https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html, https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html>)` <br /> | | `https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/BaseFlavor#vectorDrawables(kotlin.Function1)(action: https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/VectorDrawables.() -> https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-unit/index.html)` Configures [VectorDrawables](https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/VectorDrawables). <br /> | ||

| ### Properties ||
|---|---|
| abstract [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html)? | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/ProductFlavor#dimension:kotlin.String` Specifies the flavor dimension that this product flavor belongs to. |
| abstract [MutableList](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-mutable-list/index.html)\<[String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html)\> | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/ProductFlavor#matchingFallbacks:kotlin.collections.MutableList` Specifies a sorted list of product flavors that the plugin should try to use when a direct variant match with a local module dependency is not possible. |

| ### Inherited properties ||
|---|---|
| From class `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/VariantDimension` |---|---| | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/ExternalNativeBuildOptions` | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/VariantDimension#externalNativeBuild:com.android.build.api.dsl.ExternalNativeBuildOptions` Encapsulates per-variant CMake and ndk-build configurations for your external native build. To learn more, see [Add C and C++ Code to Your Project](http://developer.android.com/studio/projects/add-native-code.html#). <br /> | | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/JavaCompileOptions` | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/VariantDimension#javaCompileOptions:com.android.build.api.dsl.JavaCompileOptions` Options for configuring Java compilation. <br /> | | `https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-mutable-map/index.html<https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html, https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-any/index.html>` | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/VariantDimension#manifestPlaceholders:kotlin.collections.MutableMap` The manifest placeholders. See [Inject Build Variables into the Manifest](https://developer.android.com/studio/build/manifest-build-variables.html). <br /> | | `http://docs.oracle.com/javase/8/docs/api/java/io/File.html?` | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/VariantDimension#multiDexKeepFile:java.io.File` Text file that specifies additional classes that will be compiled into the main dex file. Classes specified in the file are appended to the main dex classes computed using `aapt`. If set, the file should contain one class per line, in the following format: `com/example/MyClass.class` <br /> | | `http://docs.oracle.com/javase/8/docs/api/java/io/File.html?` | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/VariantDimension#multiDexKeepProguard:java.io.File` Text file with additional ProGuard rules to be used to determine which classes are compiled into the main dex file. If set, rules from this file are used in combination with the default rules used by the build system. <br /> | | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/Ndk` | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/VariantDimension#ndk:com.android.build.api.dsl.Ndk` Encapsulates per-variant configurations for the NDK, such as ABI filters. <br /> | | `https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-mutable-list/index.html<http://docs.oracle.com/javase/8/docs/api/java/io/File.html>` | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/VariantDimension#proguardFiles:kotlin.collections.MutableList` Specifies the ProGuard configuration files that the plugin should use. There are two ProGuard rules files that ship with the Android plugin and are used by default: - proguard-android.txt - proguard-android-optimize.txt `proguard-android-optimize.txt` is identical to `proguard-android.txt`, except with optimizations enabled. You can use [getDefaultProguardFileString](https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/ProductFlavor#) to return the full path of the files. <br /> | | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/Shaders` | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/VariantDimension#shaders:com.android.build.api.dsl.Shaders` Options for configuring the shader compiler. <br /> | | `https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-mutable-list/index.html<http://docs.oracle.com/javase/8/docs/api/java/io/File.html>` | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/VariantDimension#testProguardFiles:kotlin.collections.MutableList` The collection of proguard rule files to be used when processing test code. Test code needs to be processed to apply the same obfuscation as was done to main code. <br /> | ||
| From class `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/BaseFlavor` |---|---| | `https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html?` | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/BaseFlavor#minSdk:kotlin.Int` The minimum SDK version. Setting this it will override previous calls of [minSdk](https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/BaseFlavor#minSdk:kotlin.Int) and [minSdkPreview](https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/BaseFlavor#minSdkPreview:kotlin.String) setters. Only one of [minSdk](https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/BaseFlavor#minSdk:kotlin.Int) and [minSdkPreview](https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/BaseFlavor#minSdkPreview:kotlin.String) should be set. See [uses-sdk element documentation](http://developer.android.com/guide/topics/manifest/uses-sdk-element.html). <br /> | | `https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html?` | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/BaseFlavor#minSdkPreview:kotlin.String` The minimum SDK version. Setting this it will override previous calls of [minSdk](https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/BaseFlavor#minSdk:kotlin.Int) and [minSdkPreview](https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/BaseFlavor#minSdkPreview:kotlin.String) setters. Only one of [minSdk](https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/BaseFlavor#minSdk:kotlin.Int) and [minSdkPreview](https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/BaseFlavor#minSdkPreview:kotlin.String) should be set. See [uses-sdk element documentation](http://developer.android.com/guide/topics/manifest/uses-sdk-element.html). <br /> | | `https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-boolean/index.html?` | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/BaseFlavor#renderscriptNdkModeEnabled:kotlin.Boolean` Whether the renderscript code should be compiled to generate C/C++ bindings. True for C/C++ generation, false for Java, null if not specified. <br /> | | `https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-boolean/index.html?` | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/BaseFlavor#renderscriptSupportModeBlasEnabled:kotlin.Boolean` Whether the renderscript BLAS support lib should be used to make it compatible with older versions of Android. True if BLAS support lib is enabled, false if not, and null if not specified. <br /> | | `https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-boolean/index.html?` | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/BaseFlavor#renderscriptSupportModeEnabled:kotlin.Boolean` Whether the renderscript code should be compiled in support mode to make it compatible with older versions of Android. True if support mode is enabled, false if not, and null if not specified. <br /> | | `https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html?` | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/BaseFlavor#renderscriptTargetApi:kotlin.Int` The renderscript target api, or null if not specified. This is only the value set on this product flavor. <br /> | | `https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-mutable-set/index.html<https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html>` | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/BaseFlavor#resourceConfigurations:kotlin.collections.MutableSet` Specifies a list of [alternative resources](https://d.android.com/guide/topics/resources/providing-resources.html#AlternativeResources) to keep. For example, if you are using a library that includes language resources (such as AppCompat or Google Play Services), then your APK includes all translated language strings for the messages in those libraries whether the rest of your app is translated to the same languages or not. If you'd like to keep only the languages that your app officially supports, you can specify those languages using the `resConfigs` property, as shown in the sample below. Any resources for languages not specified are removed. ``` android { defaultConfig { ... // Keeps language resources for only the locales specified below. resConfigs "en", "fr" } } ``` You can also use this property to filter resources for screen densities. For example, specifying `hdpi` removes all other screen density resources (such as `mdpi`, `xhdpi`, etc) from the final APK. **Note:** `auto` is no longer supported because it created a number of issues with multi-module projects. Instead, you should specify a list of locales that your app supports, as shown in the sample above. Android plugin 3.1.0 and higher ignore the ` auto` argument, and Gradle packages all string resources your app and its dependencies provide. To learn more, see [Remove unused alternative resources](https://d.android.com/studio/build/shrink-code.html#unused-alt-resources). <br /> | | `https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html?` | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/BaseFlavor#testApplicationId:kotlin.String` Test application ID. See [Set the Application ID](https://developer.android.com/studio/build/application-id.html) <br /> | | `https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-boolean/index.html?` | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/BaseFlavor#testFunctionalTest:kotlin.Boolean` See [instrumentation](http://developer.android.com/guide/topics/manifest/instrumentation-element.html). <br /> | | `https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-boolean/index.html?` | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/BaseFlavor#testHandleProfiling:kotlin.Boolean` See [instrumentation](http://developer.android.com/guide/topics/manifest/instrumentation-element.html). <br /> | | `https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html?` | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/BaseFlavor#testInstrumentationRunner:kotlin.String` Test instrumentation runner class name. This is a fully qualified class name of the runner, e.g. `android.test.InstrumentationTestRunner` See [instrumentation](http://developer.android.com/guide/topics/manifest/instrumentation-element.html). <br /> | | `https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-mutable-map/index.html<https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html, https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html>` | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/BaseFlavor#testInstrumentationRunnerArguments:kotlin.collections.MutableMap` Test instrumentation runner custom arguments. e.g. `[key: "value"]` will give `adb shell am instrument -w -e key value com.example`... See [instrumentation](http://developer.android.com/guide/topics/manifest/instrumentation-element.html). Test runner arguments can also be specified from the command line: ``` ./gradlew connectedAndroidTest -Pandroid.testInstrumentationRunnerArguments.size=medium ./gradlew connectedAndroidTest -Pandroid.testInstrumentationRunnerArguments.foo=bar ``` <br /> | | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/VectorDrawables` | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/BaseFlavor#vectorDrawables:com.android.build.api.dsl.VectorDrawables` Options to configure the build-time support for `vector` drawables. <br /> | | `https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-boolean/index.html?` | `https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/BaseFlavor#wearAppUnbundled:kotlin.Boolean` Whether to enable unbundling mode for embedded wear app. If true, this enables the app to transition from an embedded wear app to one distributed by the play store directly. <br /> | ||

## Public methods

### setDimension

```
@Incubating abstract fun setDimension(dimension: String?): Void?
```

**Deprecated.**

### setMatchingFallbacks

```
@Incubating abstract fun setMatchingFallbacks(vararg fallbacks: String): Unit
```

**Deprecated.**

### setMatchingFallbacks

```
@Incubating abstract fun setMatchingFallbacks(fallbacks: List<String>): Unit
```

**Deprecated.**

## Properties

### dimension

```
abstract var dimension: String?
```

Specifies the flavor dimension that this product flavor belongs to.

When configuring product flavors with Android plugin 3.0.0 and higher, you must specify at
least one flavor dimension, using the `flavorDimensions` property, and then assign each
flavor to a dimension.
Otherwise, you will get the following build error:

```
Error:All flavors must now belong to a named flavor dimension.
The flavor 'flavor_name' is not assigned to a flavor dimension.
```

By default, when you specify only one dimension, all flavors you configure automatically
belong to that dimension. If you specify more than one dimension, you need to manually assign
each flavor to a dimension, as shown in the sample below:

```
android {
    ...
    // Specifies the flavor dimensions you want to use. The order in which you
    // list each dimension determines its priority, from highest to lowest,
    // when Gradle merges variant sources and configurations. You must assign
    // each product flavor you configure to one of the flavor dimensions.
    flavorDimensions 'api', 'version'

    productFlavors {
        demo {
            // Assigns this product flavor to the 'version' flavor dimension.
            dimension 'version'
            ...
        }

        full {
            dimension 'version'
            ...
        }

        minApi24 {
            // Assigns this flavor to the 'api' dimension.
            dimension 'api'
            minSdkVersion '24'
            versionNameSuffix "-minApi24"
            ...
        }

        minApi21 {
            dimension "api"
            minSdkVersion '21'
            versionNameSuffix "-minApi21"
            ...
        }
    }
}
```

To learn more about configuring flavor dimensions, read
[Combine multiple flavors](https://developer.android.com/studio/build/build-variants.html#flavor-dimensions).

### matchingFallbacks

```
abstract val matchingFallbacks: MutableList<String>
```

Specifies a sorted list of product flavors that the plugin should try to use when a direct
variant match with a local module dependency is not possible.

Android plugin 3.0.0 and higher try to match each variant of your module with the same one
from its dependencies. For example, when you build a "freeDebug" version of your app, the
plugin tries to match it with "freeDebug" versions of the local library modules the app
depends on.

However, there may be situations in which, for a given flavor dimension that exists in
both the app and its library dependencies, **your app includes flavors that a dependencydoes not**. For example, consider if both your app and its library dependencies include a
"tier" flavor dimension. However, the "tier" dimension in the app includes "free" and "paid"
flavors, but one of its dependencies includes only "demo" and "paid" flavors for the same
dimension. When the plugin tries to build the "free" version of your app, it won't know which
version of the dependency to use, and you'll see an error message similar to the following:

```
Error:Failed to resolve: Could not resolve project :mylibrary.
Required by:
project :app
```

In this situation, you should use `matchingFallbacks` to specify alternative
matches for the app's "free" product flavor, as shown below:

```
// In the app's build.gradle file.
android {
    flavorDimensions 'tier'
    productFlavors {
        paid {
            dimension 'tier'
            // Because the dependency already includes a "paid" flavor in its
            // "tier" dimension, you don't need to provide a list of fallbacks
            // for the "paid" flavor.
        }
        free {
            dimension 'tier'
            // Specifies a sorted list of fallback flavors that the plugin
            // should try to use when a dependency's matching dimension does
            // not include a "free" flavor. You may specify as many
            // fallbacks as you like, and the plugin selects the first flavor
            // that's available in the dependency's "tier" dimension.
            matchingFallbacks = ['demo', 'trial']
        }
    }
}
```

Note that, for a given flavor dimension that exists in both the app and its library
dependencies, there is no issue when a library includes a product flavor that your app does
not. That's because the plugin simply never requests that flavor from the dependency.

If instead you are trying to resolve an issue in which **a library dependency includes aflavor dimension that your app does not** , use [missingDimensionStrategy](https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/BaseFlavor#missingDimensionStrategy(kotlin.String,%20kotlin.String)).