How to get the build variant at runtime in Android Studio?

AndroidAndroid StudioAndroid Gradle-Plugin

Android Problem Overview


I'd like to get the build variant during runtime, is this possible without any extra config or code?

Android Solutions


Solution 1 - Android

Look at the generated BuildConfig class.

public final class BuildConfig {
  public static final boolean DEBUG = Boolean.parseBoolean("true");
  public static final String APPLICATION_ID = "com.example.app";
  public static final String BUILD_TYPE = "debug";
  public static final String FLAVOR = "";
  public static final int VERSION_CODE = 1;
  public static final String VERSION_NAME = "";
}

Solution 2 - Android

Another option would be to create a separate build config variable for each build variant and use it in your code like this:

In your build.gradle file:

productFlavors {

    production {
		buildConfigField "String", "BUILD_VARIANT", "\"prod\""
	}

    dev {
		buildConfigField "String", "BUILD_VARIANT", "\"dev\""
	}		
}

To use it in your code:

if (BuildConfig.BUILD_VARIANT.equals("prod")){ // do something cool }

Solution 3 - Android

Here is an example to define and get BuildConfig for different flavor

android {

    defaultConfig {
        ...
    buildTypes {
        ...
    }
    
    flavorDimensions "default"
    productFlavors {

        develop {
            applicationIdSuffix ".dev"
            versionNameSuffix "-dev"
        }

        staging {
            applicationIdSuffix ".stg"
            versionNameSuffix "-stg"
        }

        production {
            applicationIdSuffix ""
            versionNameSuffix ""
        }
    }

    applicationVariants.all { variant ->

        def BASE_URL = ""

        if (variant.getName().contains("develop")) {
            BASE_URL = "https://localhost:8080.com/"
        } else if (variant.getName().contains("staging")) {
            BASE_URL = "https://stagingdomain.com/"
        } else if (variant.getName().contains("production")) {
            BASE_URL = "https://productdomain.com/"
        }
        variant.buildConfigField "String", "BASE_URL", "\"${BASE_URL}\""
        
    }
}

Using

BuildConfig.BASE_URL

Solution 4 - Android

You can try with

getPackageName(); 

it will return what you've defined in build.gradle

productFlavours{
  flavour1{
     applicationId 'com.example.package.flavour1'
  }
  flavour2{
     applicationId 'com.example.package.flavour2'
  }
}

Solution 5 - Android

If you are already flavoring then no need to provide extra string field in your gradle. Just follow simple steps to get the build details:

> For build variant : BuildConfig.FLAVOR
> For build version code : BuildConfig.VERSION_CODE
> For build version name : BuildConfig.VERSION_NAME

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestiontylerView Question on Stackoverflow
Solution 1 - AndroidashishduhView Answer on Stackoverflow
Solution 2 - Androidcheckmate711View Answer on Stackoverflow
Solution 3 - AndroidLinhView Answer on Stackoverflow
Solution 4 - AndroidyeberiahView Answer on Stackoverflow
Solution 5 - AndroidAnurag SrivastavaView Answer on Stackoverflow