449

如何在我的代码中检测到我处于发布模式还是调试模式?

4

8 回答 8

875

最简单、最好的长期解决方案是使用BuildConfig.DEBUG. 这是一个用于调试构建的boolean值,否则:truefalse

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

有报道说这个值在基于 Eclipse 的构建中并不是 100% 可靠的,尽管我个人没有遇到过问题,所以我不能说它到底有多大的问题。

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

Illegal Argument 的解决方案基于android:debuggable清单中标志的值。如果这就是您希望区分“调试”构建和“发布”构建的方式,那么根据定义,这是最好的解决方案。但是,请记住,今后,该debuggable标志实际上是一个独立于 Gradle/Android Studio 所认为的“调试”构建的概念。任何构建类型都可以选择将debuggable标志设置为对该开发人员和该构建类型有意义的任何值。

于 2014-05-24T11:55:01.627 回答
73

尝试以下操作:

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

科特林:

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

它取自这里的 bundels 帖子

于 2014-05-24T11:52:40.140 回答
66

是的,您可以毫无问题地使用:

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

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

在此处输入图像描述

于 2017-02-09T15:01:20.813 回答
43

由于关于 的混合评论BuildConfig.DEBUG,我使用以下内容在调试模式下禁用崩溃分析(和分析):

更新 /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为您想要的任何内容。我喜欢这种方法,因为我可以在配置中看到标志并且我可以控制标志。

于 2016-12-11T16:53:30.253 回答
16

或者,您可以使用BuildConfig.BUILD_TYPE 进行区分;

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

于 2017-04-27T18:58:57.910 回答
12

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

if (BuildConfig.BUILD_TYPE.equals("debug")){
   //Do something
}
于 2017-12-11T13:23:06.243 回答
2

确保您正在导入正确的 BuildConfig 类 是的,您将没有问题使用:

if (BuildConfig.DEBUG) {
   //It's not a release version.
}
于 2019-02-18T17:44:56.950 回答
0

Build.IS_DEBUGGABLE 可能没问题。它来自“ro.debuggable”

于 2021-01-13T06:54:06.117 回答