¿Cómo obtener la variante de compilación en tiempo de ejecución en Android Studio?

Respuestas:

130

Mira la BuildConfigclase generada .

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 = "";
}
Ashishduh
fuente
Entonces, si su aplicación aún no se ha creado, esta clase no existiría y el uso de la clase antes de que se compile causaría un error de compilación, ¿no es así? ¿No es este el escenario de la gallina contra el huevo?
AndroidDev
13
BuildConfig se genera durante Gradle Sync, no durante la construcción de la aplicación en sí.
Ashishduh,
7
Recordatorio amistoso para importar BulidConfig para el paquete de su aplicación en lugar de desde una biblioteca externa BuildConfig ... como hice yo ...
levibostian
3
PACKAGE_NAMEparece haber sido reemplazado porAPPLICATION_ID
rockhammer
@ashishduh "BuildConfig se genera durante una sincronización de Gradle, no durante la construcción de la aplicación en sí". No, eso no está bien. Simplemente limpie el proyecto y notará que BuildConfigse ha ido. Se llama BuildConfig por una razón
Farid
29

Otra opción sería crear una variable de configuración de compilación separada para cada variante de compilación y usarla en su código de esta manera:

En su archivo build.gradle:

productFlavors {

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

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

Para usarlo en su código:

if (BuildConfig.BUILD_VARIANT.equals("prod")){ // do something cool }
jaque mate711
fuente
3

Puedes probar con

getPackageName(); 

devolverá lo que ha definido en build.gradle

productFlavours{
  flavour1{
     applicationId 'com.example.package.flavour1'
  }
  flavour2{
     applicationId 'com.example.package.flavour2'
  }
}
yeberiah
fuente
3

Aquí hay un ejemplo para definir y obtener BuildConfigun sabor diferente.

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}\""

    }
}

Utilizando

BuildConfig.BASE_URL

Phan Van Linh
fuente
2

Si ya está aromatizando, no es necesario que proporcione un campo de cadena adicional en su gradle. Simplemente siga unos sencillos pasos para obtener los detalles de la compilación:

Para la variante de compilación: BuildConfig.FLAVOR
Para el código de la versión de compilación: BuildConfig.VERSION_CODE
Para el nombre de la versión de compilación: BuildConfig.VERSION_NAME

Anurag Srivastava
fuente
3
BuildConfig.BUILD_TYPEdebe usarse para la variante de compilación. BuildConfig.FLAVORdebe usarse para cualquier sabor que haya especificado.
Edric