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

Dav*_*vid 336 android android-build-type

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

Com*_*are 710

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

if (BuildConfig.DEBUG) {
  // do something for a debug build
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • `BuildConfig`位于你的应用程序包中,例如`import com.mycompany.myapp.BuildConfig;` (29认同)
  • 由于AndroiStudio中的一个错误,它不再起作用,即使在DEBUG模式下也总是错误的 (9认同)
  • 事实证明,使用库时这不起作用(总是返回true):http://stackoverflow.com/q/20176284/878126.不知道什么是最好的选择 (3认同)
  • 这个答案不适用于图书馆项目(.aar) (3认同)
  • 我正在使用v1.2.2,并且BuildConfig.DEBUG始终为false,因此我尝试了以下对我有用的建议-我也将尝试您的建议-非常感谢! (2认同)

Ill*_*ent 55

请尝试以下方法:

boolean isDebuggable =  ( 0 != ( getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE ) );
Run Code Online (Sandbox Code Playgroud)

科特林:

val isDebuggable = 0 != applicationInfo.flags and ApplicationInfo.FLAG_DEBUGGABLE
Run Code Online (Sandbox Code Playgroud)

它来自这里的 bundells帖子

  • 无论库项目还是应用程序项目,此答案在任何情况下均适用。 (2认同)
  • 好吧,它只是在静态上下文中不起作用,请参阅 /sf/ask/744880111/ (2认同)

Van*_*Jr. 49

是的,您使用时没有问题:

if (BuildConfig.DEBUG) {
   //It's not a release version.
}
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

  • “除非您导入了错误的 BuildConfig 类”...是的,非常好:D (2认同)

Som*_*ere 33

由于混合评论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'
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,在您的代码中,您将检测到ENABLE_CRASHLYTICS标志,如下所示:

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

在您的应用中使用相同的概念,并重命名ENABLE_CRASHLYTICS为您想要的任何内容.我喜欢这种方法,因为我可以看到配置中的标志,我可以控制标志.


Pru*_*hvi 11

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

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

  • 这是正确的答案。返回“release”,而 BuildConfig.DEBUG 始终返回“true”。 (2认同)

Gie*_*kas 8

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

if (BuildConfig.BUILD_TYPE.equals("debug")){
   //Do something
}
Run Code Online (Sandbox Code Playgroud)


Jay*_*ara 8

if (BuildConfig.DEBUG) { 



}
Run Code Online (Sandbox Code Playgroud)

这对我有用


and*_*per 8

您需要在 gradle/kts 文件中使用它,以便为您生成 BuildConfig 文件:

buildFeatures {
   buildConfig = true
}
Run Code Online (Sandbox Code Playgroud)

BuildConfig.DEBUG然后,到达属于您的应用程序包名称的字段。

与此类似但不太推荐的方法(因为它在创建发布版本时不会删除代码)是检查应用程序是否可调试:

val isDebuggable = context.applicationInfo.flags and ApplicationInfo.FLAG_DEBUGGABLE != 0
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

111469 次

最近记录:

6 年,2 月 前