如何检测我是否处于发布或调试模式?


Answers:


770

最简单,最好的长期解决方案是使用BuildConfig.DEBUG。这是一个boolean,这将是价值true的调试版本,false否则:

if (BuildConfig.DEBUG) {
  // do something for a debug build
}

有报道说,虽然我个人没有遇到问题,但是这个值在基于Eclipse的构建中并不是100%可靠的,因此我无法说出它到底有多少问题。

如果您使用的是Android Studio,或者从命令行使用Gradle,则可以将自己的内容添加到BuildConfig或以其他方式调整debugrelease构建类型,以帮助在运行时区分这些情况。

非法参数的解决方案基于android:debuggable清单中标志的值。如果那是您希望将“调试”构建与“发布”构建区分开的方式,那么按照定义,那是最好的解决方案。但是,请记住,该debuggable标志实际上是Gradle / Android Studio认为是“调试”版本的独立概念。任何构建类型都可以选择将debuggable标志设置为对该开发人员和该构建类型有意义的任何值。


34
BuildConfig位于应用程序的软件包中,例如import com.mycompany.myapp.BuildConfig;
Chris Cirefice

10
由于AndroiStudio中的错误,该错误不再起作用,即使在调试模式下也始终为假
user387184

1
@ user387184:在Android Studio 1.2.2中,我获得public static final boolean DEBUG = Boolean.parseBoolean("true");了调试版本。虽然这是一种奇怪的设置DEBUG方法true,但它应该可以工作。如果您在1.3.0测试版本之一中看到了这一点,或者如果您拥有1.2.2的可复制测试用例,请提出问题。我看不到任何未解决的问题报告此问题。
CommonsWare

2
我正在使用v1.2.2,并且BuildConfig.DEBUG始终为false,因此我尝试了下面的建议,该建议对我有用-我也会尝试您的建议-非常感谢!
2015年

3
事实证明,使用库时此方法将不起作用(总是返回true):stackoverflow.com/q/20176284/878126。想知道什么是最好的选择
Android开发者

59

请尝试以下操作:

boolean isDebuggable =  ( 0 != ( getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE ) );

科特林:

val isDebuggable = 0 != applicationInfo.flags and ApplicationInfo.FLAG_DEBUGGABLE

这里的 bundells邮筒取


3
无论库项目还是应用程序项目,此答案在任何情况下均适用。
Lavekush Agrawal

需要输入什么getApplicationInfo().flags才能工作?
A1m

1
好吧,它只是在静态上下文中不起作用,请参见stackoverflow.com/questions/10641144/…–
A1m

54

是的,您将不会有任何问题:

if (BuildConfig.DEBUG) {
   //It's not a release version.
}

除非您导入错误的BuildConfig类。确保您引用的是项目的BuildConfig类,而不是任何依赖库中的引用。

在此处输入图片说明


1
“除非您导入了错误的BuildConfig类” ...是的,非常重要的一点:D
Benjamin Piette

谢谢!这就是我项目中的问题,不知何故,它正在获取库项目的BuildConfig(在Android Studio 3推出之前,它始终是发布模式)
Amit Garg

36

由于对的评论不一BuildConfig.DEBUG,我使用以下命令在调试模式下禁用了crashlytics(和分析):

更新/app/build.gradle

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.1"

    defaultConfig {
        applicationId "your.awesome.app"
        minSdkVersion 16
        targetSdkVersion 25
        versionCode 100
        versionName "1.0.0"
        buildConfigField 'boolean', 'ENABLE_CRASHLYTICS', 'true'
    }
    buildTypes {
        debug {
            debuggable true
            minifyEnabled false
            buildConfigField 'boolean', 'ENABLE_CRASHLYTICS', 'false'
        }
        release {
            debuggable false
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

然后,在代码中ENABLE_CRASHLYTICS按如下所示检测标志:

    if (BuildConfig.ENABLE_CRASHLYTICS)
    {
        // enable crashlytics and answers (Crashlytics by default includes Answers)
        Fabric.with(this, new Crashlytics());
    }

在您的应用中使用相同的概念,然后重命名ENABLE_CRASHLYTICS为您想要的任何名称。我喜欢这种方法,因为我可以在配置中看到该标记并且可以控制该标记。


您不应分别呼叫Crashlytics和Answers。只需使用:Fabric.with(this,new Crashlytics()); 包括Crashlytics和Answers。
Mike Bonnell

1
谢谢,@ MikeBonnell,我将代码更改为示例代码
Someone Somewhere

我看不出这与使用BuildConfig.DEBUG有什么不同-如果仅为调试版本设置BuildConfig.ENABLE_CRASHLYTICS,则BuildConfig.DEBUG和BuildConfig.ENABLE_CRASHLYTICS始终具有相同的值吧?
k2col '17

我认为开发人员在库项目上的工作在使用BuildConfig.DEBUG检测调试/发布版本时遇到了问题。可能还涉及早期的Android Studio错误...
某处某人

13

另外,您可以使用BuildConfig.BUILD_TYPE进行区分

如果您正在运行调试版本,则 BuildConfig.BUILD_TYPE.equals("debug");返回true。对于发布版本,BuildConfig.BUILD_TYPE.equals("release");返回true。


1
这是正确的答案。返回“版本”,而BuildConfig.DEBUG始终返回true
米纳斯米纳

6

我正在使用此解决方案,以防发现我的应用程序正在调试版本上运行。

if (BuildConfig.BUILD_TYPE.equals("Debug")){
   //Do something
}

1
请在您的答案中添加描述。这将不仅仅是一段代码。
马修斯阳光明媚

我正在使用if (BuildConfig.DEBUG) {} 一个依赖的gradle模块,该模块(当然)与应用程序的build.gradle文件没有关系-这导致调试模式被错误地识别。if (BuildConfig.BUILD_TYPE.equals("Debug")){ }解决了该问题。谢谢
kosiara-Bartosz Kosarzycki

这是真正的答案,只需将“调试”更改为“调试”
Jetwiz

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.