BuildConfig.DEBUG仍然有漏洞吗?

10

根据这篇博客,BuildConfig.DEBUG是不可靠的。 由于我的同事广泛使用BuildConfig.DEBUG(似乎在生产代码中使用测试代码),我想知道这个标志是否仍然像几年前那样有缺陷。


1
如果您正在使用Android Studio和Gradle for Android,则BuildConfigR一样可靠,因为它们是使用相同的机制创建的。我以前从未遇到过在Eclipse / ADT中报告的BuildConfig问题,因此我不知道它们是否已经解决。 - CommonsWare
我们正在使用Android Studio和Gradle - 很高兴听到可以使用。 - Someone Somewhere
如果正确使用BuildConfig.DEBUG,您的测试代码实际上不会出现在生产中。对于此代码:if(BuildConfig.DEBUG){foo();},如果常量为false,则整个代码段将被消除。如果为true,则只有foo()会出现在编译结果中。 - JohnnyLambada
即使在AS 2.2.3 r25上进行了“Clean Project”,对我来说仍然无法正常工作。运行应用程序或调试应用程序时,会报告“BuildConfig.DEBUG=true”。也许构建签名APK可以解决问题,但我不确定。 - fralbo
3个回答

11

我可以确认这个 bug 仍然存在,已经使用 Android Studio 1.2 Build AI-140.1782451 和 Gradle 1.1 进行测试并编译针对 Android API Level 21。

该问题在 Android 5.0.2 上的 Nexus 10 或类似设备中可见。

如果您在源编辑器中打开 BuildConfig.DEBUG ,它会显示:

public static final boolean DEBUG = Boolean.parseBoolean("true");

但如果您调试所涉及的应用程序,DEBUG保持为false。这会阻碍我的Retrofit调试,因为我希望根据构建类型有条件地启用它。


Boolean.parseBoolean("true") return true, But in past with ADT Build (i.e: before Gradle Build) was public final static boolean DEBUG = Boolean.parseBoolean(null); - ahmed hamdy
你已经向谷歌报告了这个问题吗? - Sufian
不行,因为由于几个调试构建类型,我现在使用BuildConfig.BUILD_TYPE并检查是否等于某个调试或暂存类型。 - arne.jans
问题仍然存在于AS 2.2.3 r25。 - fralbo
1
AS 3.0.1只能在DEBUG模式下构建已签名的apk :( - djdance

7

看起来你所提到的问题是特定于ADT+Eclipse的。因此,我认为如果你使用Gradle和Android Studio,这应该不是一个问题。

重要的是:这仅在你使用自动构建选项并且没有清理项目时才会出现。因此,我很难认为这是一个错误。毕竟,谁说你每次进行代码更改并启用构建自动化时都应该重新构建呢?

作为良好实践,你应该在实际发布之前始终清理和重建你的项目,在这种情况下,这将不是一个问题。

因此,如果你仍在使用此设置,并且在发布之前没有重新构建你的项目,并且仍在使用ADT和Eclipse(似乎注定要被弃用),那么这仍然是一个问题。

这里是关于该bug的讨论:https://code.google.com/p/android/issues/detail?id=27940


2
感谢这个有用的信息。顺便说一下,与第一段相反,使用Gradle在Android Studio(至少在2.1.1版本中)确实会出现问题,有时候会发生。 - LarsH

3

我一直对预定义变量有些困惑,因此我创建了自己的变量:

  buildTypes {
        // If we use the same keystore for debug and release, we don't have to wipe all preferences
        debug {
            //noinspection GroovyAssignabilityCheck
            signingConfig signingConfigs.releaseConfig
            zipAlignEnabled true

            resValue "bool", "DEBUG", "true"
        }
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            //noinspection GroovyAssignabilityCheck
            signingConfig signingConfigs.releaseConfig
            zipAlignEnabled true

            resValue "bool", "DEBUG", "false"
        }
    }

在你的代码中,你可以读取这个变量:

    if (!MyApplication.get().getResources().getBoolean(R.bool.DEBUG)) {
        // Firebase Crash reporting
        FirebaseCrash.report(e);
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接