当前位置: 首页 > 知识库问答 >
问题:

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

赵智
2023-03-14

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

共有2个答案

裴浩歌
2023-03-14

对我来说,“技巧”似乎实际上非常危险,因为您无法基于BuildConfig进行条件编译。调试!

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

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

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

裴意
2023-03-14

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

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

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

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

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

 类似资料:
  • 很多人问了此问题,说bzero已经被posix-2008废弃,为何还使用bzero。选择bzero而不是memset,有2个原因: bzero有2个参数,指针和长度,很明确就是将制定size的内存初始化为0。而memset有3个参数,需要记忆参数的位置,有不少人经常把长度和初始化值搞错。 bzero比memset的可读性要好。memset可以制定初始化的值,实际上绝大多数情况都是0。 一旦新版本g

  • 对许多人来说,这可能是一个简单的问题,但让我困惑。我从凯西·塞拉那里挑选了一个例子,展示了抽象类的实用性,但我无法理解抽象类的整体重要性。 例如,我们有一个带有抽象方法的抽象类, 我的问题是——为什么我们首先需要抽象类来为每种汽车类型定制方法?为什么不在这些汽车子类型中的任何一个中使用这两种方法,比如宝马和其他两个——大众和奥迪——可以简单地覆盖这些方法?

  • 问题内容: 我不确定为什么列出项目时为什么需要使用ul-li而不是简单地使用div。我可以使两者看起来完全一样,因此与创建div相比,创建无序列表的功能优势在哪里? 问题答案: 为了语义正确。HTML具有表达事物列表的功能,它可以帮助Google机器人,屏幕阅读器以及所有不仅仅关心网站外观的用户更好地了解您的内容。

  • 问题内容: 的OpenJDK代码包括以下行: 为什么在这里使用,而不是?我很好奇。 问题答案: 要强调的是,数字是2的幂,而不是一个完全任意的选择。因此,它警告开发人员尝试不同的数字,他们应该在模式中使用其他数字(例如或,而不是),这样他们就不会破坏依赖于两个要求的幂的方法。有评论略高于: 任何一个的容量(表长度)始终是2的幂。之所以这样设计,是因为它允许使用快速的按位AND操作()将每个键的哈希

  • 我花了很多时间来解决这个问题。我是GRAILS和GROOVY中的begginer。我有一个名为“tms\u dev”的旧oracle数据库模式。此架构有一些表(例如checktypes表)。此外,我还有由GRAILS生成的域类Checktype和ChecktypesController类-controller。 此类具有列表方法: def列表(最大整数){ } 我还配置了Datasource。gr

  • 问题内容: 我想知道为什么Arrays类的sort方法要求一个Object []类型的参数。为什么参数不是Comparable []类型。如果不传递Comparable [],它将生成ClassCastException。 为什么… public static void sort(Object [] a) 而不是 public static void sort(Comparable [] a) ?