2014-05-24 60 views

回答

483

最简单的发布,以及最佳的长期解决办法,就是用BuildConfig.DEBUG。这是一个boolean值,这将是true的调试版本,false否则:

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

有报道称,这个值是不是100%可靠的基于Eclipse的版本,虽然我个人没有遇到问题,所以我不能说它真的有多少问题。

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

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

+15

'BuildConfig'位于您的应用程序包中,例如'import com.mycompany.myapp.BuildConfig;' –

+8

由于AndroiStudio中的一个错误,它不再工作,即使在DEBUG模式下它也总是为false – user387184

+1

@ user387184:在Android Studio 1.2.2中,我得到了'public static final boolean DEBUG = Boolean.parseBoolean(“true”);'用于调试版本。虽然这是一个奇怪的方式来设置'DEBUG'为'true',它应该工作。如果您在1.3.0版本的测试版本中看到了这一点,或者您有1.2.2的可重复测试用例,请[提出问题](http://b.android.com)。我没有看到任何报告此问题的未解决问题。 – CommonsWare

37

尝试以下操作:

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

它是由bundells取自here

+0

无论图书馆项目或应用程序项目如何,这个答案都适用于所有情况。 –

25

由于混合评论约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重命名为任何你想要的。我喜欢这种方法,因为我可以看到配置中的标志,并且我可以控制标志。

+0

你不应该单独调用Crashlytics和Answers。只需使用: Fabric.with(this,new Crashlytics()); 包括Crashlytics和答案。 –

+1

谢谢,@MikeBonnell,我所做的代码更改为示例代码 –

+0

我不明白这是怎么使用BuildConfig.DEBUG任何不同 - 如果你只为那么你的调试版本BuildConfig.DEBUG和BuildConfig设置BuildConfig.ENABLE_CRASHLYTICS。 ENABLE_CRASHLYTICS将始终具有相同的值,对吗? – k2col

32

是的,你会使用没有问题:

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

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

enter image description here

+0

“除非你导入了错误的BuildConfig类”...是的,非常好的一点:D –

+0

谢谢!这是我的项目中的问题,不知何故,它收集了图书馆项目的BuildConfig(在Android Studio 3发布之前总是处于发布模式) –

+0

非常感谢您的支持。给我留下了很多麻烦。 –

6

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

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

+1

这是正确的答案。返回“release”,而BuildConfig.DEBUG总是返回“true”。 –

2

我正在使用此解决方案以防万一找出我的应用程序正在调试版本上运行。

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

请在您的回答中添加说明。这比仅仅一段代码更有帮助。 – Billa

相关问题