如何在我的代码中检测到我处于发布模式还是调试模式?
最简单、最好的长期解决方案是使用 BuildConfig.DEBUG
。这是一个 boolean
值,对于调试版本将是 true
,否则为 false
:
if (BuildConfig.DEBUG) {
// do something for a debug build
}
有报道称,这个值在基于 Eclipse 的构建中并不是 100% 可靠的,尽管我个人没有遇到过问题,所以我不能说它到底有多大的问题。
如果您使用的是 Android Studio,或者您从命令行使用 Gradle,则可以将自己的内容添加到 BuildConfig
或调整 debug
和 release
构建类型,以帮助在运行时区分这些情况。
Illegal Argument 的解决方案基于清单中 android:debuggable
标志的值。如果这就是您希望区分“调试”构建和“发布”构建的方式,那么根据定义,这是最好的解决方案。但是,请记住,今后,debuggable
标志实际上是一个独立于 Gradle/Android Studio 所认为的“调试”构建的概念。任何构建类型都可以选择将 debuggable
标志设置为对该开发人员和该构建类型有意义的任何值。
尝试以下操作:
boolean isDebuggable = ( 0 != ( getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE ) );
科特林:
val isDebuggable = 0 != applicationInfo.flags and ApplicationInfo.FLAG_DEBUGGABLE
它取自 here 的 bundells 帖子
getApplicationInfo().flags
需要导入什么才能工作?
是的,您可以毫无问题地使用:
if (BuildConfig.DEBUG) {
//It's not a release version.
}
除非您导入错误的 BuildConfig 类。确保您引用的是项目的 BuildConfig 类,而不是来自任何依赖库。
https://i.stack.imgur.com/5dPJd.png
由于关于 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
重命名为您想要的任何名称。我喜欢这种方法,因为我可以在配置中看到标志并且我可以控制标志。
或者,您可以使用 BuildConfig.BUILD_TYPE 进行区分;
如果您正在运行调试构建 BuildConfig.BUILD_TYPE.equals("debug");
,则返回 true。对于发布版本 BuildConfig.BUILD_TYPE.equals("release");
返回 true。
true
。
我正在使用这个解决方案,以防发现我的应用程序正在调试版本上运行。
if (BuildConfig.BUILD_TYPE.equals("debug")){
//Do something
}
if (BuildConfig.DEBUG) {}
,该模块(当然)没有引用应用程序的 build.gradle 文件 - 这导致调试模式以错误的方式被识别。 if (BuildConfig.BUILD_TYPE.equals("Debug")){ }
修复了该问题。谢谢
确保您正在导入正确的 BuildConfig 类 是的,您将没有问题使用:
if (BuildConfig.DEBUG) {
//It's not a release version.
}
<package_name>.BuildConfig
。
if (BuildConfig.DEBUG) {
}
这对我有用
Build.IS_DEBUGGABLE 可能没问题。它来自“ro.debuggable”
不定期副业成功案例分享
BuildConfig
位于您的应用程序包中,例如import com.mycompany.myapp.BuildConfig;