14

查看BuildConfig由 Android Studio 和 Gradle 插件生成的类时,可以看到该BuildConfig.DEBUG字段是使用调用初始化的,Boolean.parseBoolean(String)而不是使用布尔文字之一truefalse.

当我使用 Gradle 添加自定义构建属性时,我会这样做:

android {
    buildTypes.debug.buildConfigField 'boolean', 'SOME_SETTING', 'true'
}

但是查看生成的BuildConfig结果告诉我,谷歌对DEBUG标志采取了不同的方法:

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

  // more fields here

  // Fields from build type: debug
  public static final boolean SOME_SETTING = true;
}

使用Boolean.parseBoolean(String)而不是文字有什么好处?

4

2 回答 2

26

在代码中使用类中的布尔文字BuildConfig时(至少在 Android Studio 中),它们会产生 IDE 警告。例如,当在布尔表达式中使用它时,Android Studio 将(错误地)建议简化布尔表达式,因为常量值始终相同(对于当前的构建变体)。

由于缺少构建配置知识,Android Studio 产生代码警告

此警告只是因为 Android Studio 不知道内部的最终值BuildConfig.SOME_SETTING可能与其他构建变体不同。

为了保持代码干净且没有警告,您可以通过添加如下 IDE 注释来告诉 Android Studio 忽略此特定警告:

添加代码注释以忽略 IDE 警告

但这又会给代码增加一些噪音并降低可读性。通过使用该Boolean.parseBoolean(String)方法来初始化您的常量字段,您实际上欺骗了 Android Studio,它将不再能够完全分析您的布尔表达式,因此不再生成警告。

使用 parseBoolean(String) 防止 IDE 警告

这种方法非常有用,因为它使您的代码保持干净和可读,而不会关闭重要的代码分析和警告生成。

于 2015-04-27T06:56:20.457 回答
1

在我看来,这个“技巧”实际上是非常危险的,因为你不能基于 BuildConfig.DEBUG 进行条件编译!

if(!BuildConfig.DEBUG) { Log.d("Here we are verifying the signature!"); }

根据我的逆向工程,日志记录将保留在输出 .class 文件中!

这对攻击者来说是一个很好的线索......

于 2020-04-28T06:28:51.753 回答