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

roqulrg3  于 2022-12-02  发布在  Android
关注(0)|答案(2)|浏览(133)

查看Android Studio和Gradle插件生成的BuildConfig类时,可以看到BuildConfig.DEBUG字段是使用Boolean.parseBoolean(String)调用而不是使用布尔文字truefalse之一来初始化的。
当我使用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)而不是文字有什么好处?

6jjcrrmo

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执行的静态分析,编译器、代码小型化器和混淆器也会“欺骗”静态分析--这使得它们更难从应用程序中删除死代码。这可能会在应用程序二进制文件中留下代码部分,否则这些代码部分会被剥离。

8fsztsew

8fsztsew2#

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

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

根据我的逆向工程,日志将保留在OUTPUT .class文件中!
这对袭击者来说是个很好的线索...

相关问题