【问题标题】:is BuildConfig.DEBUG a compile-time constant?BuildConfig.DEBUG 是编译时常量吗?
【发布时间】:2020-10-28 03:57:28
【问题描述】:

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

// MyApplication.kt

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

经过进一步检查,我发现BuildConfig.DEBUGBoolean.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 函数解析?

【问题讨论】:

    标签: android kotlin compile-time-constant android-r8


    【解决方案1】:

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

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

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

    BuildConfig 类中的布尔文字在您的代码中使用它们时会产生 IDE 警告(至少在 Android Studio 中)。 你可以在this link看到更多细节。


    您可以使用BUILD_TYPE,而不是DEBUG

    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'
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-02-10
      • 1970-01-01
      • 1970-01-01
      • 2010-09-27
      • 2011-11-25
      • 2011-12-26
      • 1970-01-01
      • 1970-01-01
      • 2014-08-04
      相关资源
      最近更新 更多