Android 为什么BuildConfig类使用Boolean.parseBoolean()而不是文字值?

Android 为什么BuildConfig类使用Boolean.parseBoolean()而不是文字值?,android,android-gradle-plugin,buildconfig,Android,Android Gradle Plugin,Buildconfig,当查看Android Studio和Gradle插件生成的BuildConfig类时,可以看到BuildConfig.DEBUG字段是使用Boolean.parseBoolean(String)调用初始化的,而不是使用一个布尔文本true或false 当我使用Gradle添加自定义构建属性时,我只需这样做: android { buildTypes.debug.buildConfigField 'boolean', 'SOME_SETTING', 'true' } 但是查看生成的Bui

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

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

android {
    buildTypes.debug.buildConfigField 'boolean', 'SOME_SETTING', 'true'
}
但是查看生成的
BuildConfig
告诉我,Google使用
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)
而不是文字有什么好处?

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

此警告只是因为Android Studio不知道
BuildConfig中的最终值。对于其他构建变体,某些设置可能不同

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

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

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


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

在我看来,“技巧”实际上非常危险,因为您无法基于BuildConfig.DEBUG进行条件编译

if(!BuildConfig.DEBUG) { Log.d("Here we are verifying the signature!"); }
根据我的逆向工程,日志记录将保留在OUTPUT.class文件中


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

你问了这个问题,并在同一秒钟回答了它?成就解锁。认领你的超人徽章。当问问题时,有一个复选框。我只是想与社区分享我的经验;-)谢谢你提供的信息,我以前没看过那篇博文。但我猜你的问题本身并不是问题,这更适合作为博客文章。也许我遗漏了一些东西,但是,使用parseBoolean声明BuildConfig值的build.gradle中究竟添加了什么内容?@Tunga尝试以下
buildConfigField'boolean',SOME_标志',boolean.parseBoolean(“false”)“
在您的
defaultConfig
或任何风格或构建类型的配置中。啊,我可能遗漏了外部引号,谢谢。我最终用清单替换解决了我的问题。但它不关闭编译时优化吗?