如何在Android Studio中运行时获取构建变体?

108

我想在运行时获取构建变体,是否可以在没有额外配置或代码的情况下实现?


1
仅用于检查是否为调试模式,if (BuildConfig.DEBUG) {} - Rumit Patel
6个回答

167

看一下生成的BuildConfig类。

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 = "";
}

1
那么,如果你的应用程序还没有构建,这个类就不存在了,在它被构建之前使用这个类会导致编译错误,不是吗?这不是鸡生蛋的问题吗? - Johann
14
BuildConfig 是在 Gradle 同步期间生成的,而不是在构建应用程序本身时生成的。 - ashishduh
11
友情提醒:在导入 BuildConfig 时,请使用 您的 应用程序包中的 BuildConfig,而不是外部库中的 BuildConfig...就像我一样... - levibostian
3
PACKAGE_NAME 似乎已被替换为 APPLICATION_ID - rockhammer
@ashishduh “BuildConfig是在Gradle同步期间生成的,而不是应用程序本身的构建过程。” 不对。只需清理项目,您就会注意到BuildConfig已经消失了。它被称为* BuildConfig *是有原因的。 - Farid

42

另一种选择是为每个构建变体创建单独的构建配置变量,并在代码中使用它,代码示例如下:

在你的 build.gradle 文件中:

productFlavors {

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

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

在你的代码中使用它:

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

7

这里有一个示例,用于定义和获取不同风格的BuildConfig

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


5
您可以尝试使用以下方法:
getPackageName(); 

它会返回您在 build.gradle 中定义的内容。
productFlavours{
  flavour1{
     applicationId 'com.example.package.flavour1'
  }
  flavour2{
     applicationId 'com.example.package.flavour2'
  }
}

4
如果您已经在调味,则无需在gradle中提供额外的字符串字段。只需遵循简单的步骤即可获取构建详细信息:
- 对于构建变体: BuildConfig.FLAVOR - 对于构建版本代码: BuildConfig.VERSION_CODE - 对于构建版本名称: BuildConfig.VERSION_NAME

3
应该使用BuildConfig.BUILD_TYPE来指定构建变体。如果您指定了任何风味,则应使用BuildConfig.FLAVOR - Edric

2

您可以在任何地方直接使用BuildConfig和您的配置名称进行检查,BuildConfig已经具备了BuildType的功能。

if(BuildConfig.BUILD_TYPE == "release"){// TODO}

if(BuildConfig.BUILD_TYPE == "staging"){ //TODO }

if(BuildConfig.BUILD_TYPE == "debug"){ //TODO }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接