首页 > 解决方案 > BuildConfig.DEBUG 是编译时常量吗?

问题描述

我正在尝试创建一个ProductionRelease编译时常量,以便 R8 可以在最终生产 apk 中省略我们的调试代码。我遇到了一个障碍,即BuildConfig.DEBUG不能分配给const val.

// MyApplication.kt

companion object {
        const val isDebug = BuildConfig.DEBUG
        const val isProductionRelease = BuildConfig.FLAVOR == "production" && !BuildConfig.DEBUG
}

const val 初始值设定项应该是一个常量值

经过进一步检查,我发现BuildConfig.DEBUG是用Boolean.parseBoolean()包装纸包裹的。

// BuildConfig.java

/**
 * Automatically generated file. DO NOT MODIFY
 */

public final class BuildConfig {
  public static final boolean DEBUG = Boolean.parseBoolean("true");
  public static final String APPLICATION_ID = "com...";
  ...
}

这里的问题是:

  1. 为什么我不能将静态最终布尔值分配给 const val?
  2. 为什么 BuildConfig.DEBUG 不能直接使用 true|false 生成,而必须通过parseBoolean函数解析?

标签: androidkotlincompile-time-constantandroid-r8

解决方案


为什么我不能将静态最终布尔值分配给 const val?

static final变量在编译时未初始化。所以我们不能将未初始化的值赋给const val.

  1. 为什么 BuildConfig.DEBUG 不能直接使用 true|false 生成,而必须通过 parseBoolean 函数解析?

在代码中使用类中的布尔文字BuildConfig时(至少在 Android Studio 中),它们会产生 IDE 警告。您可以在此链接中查看更多详细信息。


而不是DEBUG,您可以使用BUILD_TYPE.

const val isDebug = BuildConfig.BUILD_TYPE == "debug"
const val isProductionRelease = BuildConfig.FLAVOR == "production" && !isDebug

或者,您也可以在 BuildConfig 中添加新常量作为布尔文字。

buildTypes {
    debug {
        buildConfigField 'boolean', 'DEBUG_CONST', 'true'
    }
    release {
        buildConfigField 'boolean', 'DEBUG_CONST', 'false'
    }
}

推荐阅读