查看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)
而不是文字有什么好处?
2条答案
按热度按时间6jjcrrmo1#
当在代码中使用
BuildConfig
类中的布尔型文字时(至少在Android Studio中),它们会产生IDE警告。例如,当在布尔表达式中使用它时,Android Studio会(错误地)建议简化布尔表达式,因为常量值总是相同的(对于当前的构建变体而言)。出现此警告只是因为Android Studio不知道
BuildConfig.SOME_SETTING
内部的最终值可能与其他构建变体不同。要保持代码整洁且无警告,您可以通过添加如下IDE注解来指示Android Studio忽略此特定警告:
但这同样会给代码增加一些噪音,降低可读性。通过使用
Boolean.parseBoolean(String)
方法初始化常量字段,您实际上欺骗了Android Studio,它将无法再完全分析您的布尔表达式,因此不再生成警告。这种方法非常有用,因为它可以保持代码清晰可读,而不会关闭重要的代码分析和警告生成。
安全性和性能注意事项
正如Jiří Křivánek所提到的,使用解析的布尔值不仅“欺骗”IDE执行的静态分析,编译器、代码小型化器和混淆器也会“欺骗”静态分析--这使得它们更难从应用程序中删除死代码。这可能会在应用程序二进制文件中留下代码部分,否则这些代码部分会被剥离。
8fsztsew2#
在我看来,这个“技巧”实际上是非常危险的,因为您不能基于BuildConfig.DEBUG进行条件编译!
根据我的逆向工程,日志将保留在OUTPUT .class文件中!
这对袭击者来说是个很好的线索...