gpt4 book ai didi

android - ProGuard 能否从始终返回常量的方法中删除条件代码?

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:15:34 30 4
gpt4 key购买 nike

在我的 Android 应用程序中,我一直在使用这样的条件代码:

if(BuildConfig.DEBUG) {
// do something...
}

如果 ProGurad 将 BuildConfig.DEBUG 评估为 false,则 if 中的代码块将从最终字节码中剥离。这是按预期工作的。

但是,随着 Android 新构建系统的引入,我们现在拥有了许多以前没有的能力。我通过创建一个新的 buildType 来利用它,我称之为 QA。为此,我添加了一个 BuildConfig.QA 常量,该常量根据构建类型为真或假。

现在我有一些代码 fragment 需要测试它是 DEBUG 还是 QA 构建,如下所示:

if(BuildConfig.DEBUG || BuildConfig.QA) {
// do something...
}

但是这样到处写很麻烦。相反,我决定在我的 utils 类上创建一个静态方法,如下所示:

public static boolean isDevelopmentBuild() {
return BuildConfig.DEBUG || BuildConfig.QA;
}

问题是,使用这种方法,任何条件代码都不会像以前那样被删除。以前,ProGuard 可以将这些常量计算为假并剥离代码。现在,它必须调用一个方法并检查返回值。

但由于该方法的返回值是常量,ProGuard 是否有可能以一种知道返回值始终是常量值(在运行时)的方式评估方法调用,并从 final方法中删除代码字节码?

最佳答案

为什么不向您的 BuildConfig 接口(interface)添加一个常量 DEV,例如

boolean DEBUG = ...
boolean QA = ...
boolean DEV = DEBUG | QA;

这将是一个编译时常量(假定 DEBUG 和 QA 是在编译时定义的)因此 ProGuard 将能够仅基于

if (BuildConfig.DEV) { ...

关于android - ProGuard 能否从始终返回常量的方法中删除条件代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18042782/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com