ChatGPT解决这个技术问题 Extra ChatGPT

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

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


C
CommonsWare

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

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 标志设置为对该开发人员和该构建类型有意义的任何值。


BuildConfig 位于您的应用程序包中,例如 import com.mycompany.myapp.BuildConfig;
由于 AndroiStudio 中的一个错误,这不再起作用,它总是错误的,即使在调试模式下也是如此
我正在使用 v1.2.2 并且 BuildConfig.DEBUG 总是错误的,然后我尝试了下面对我有用的建议 - 我也会尝试你的 - 非常感谢!
事实证明,这在使用库时不起作用(总是返回 true): stackoverflow.com/q/20176284/878126 。想知道什么是最好的选择
此答案不适用于库项目(.aar)
a
amorenew

尝试以下操作:

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

科特林:

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

它取自 here 的 bundells 帖子


无论库项目或应用程序项目如何,此答案都适用于所有情况。
getApplicationInfo().flags 需要导入什么才能工作?
好的,它只是在静态上下文中不起作用,请参阅 stackoverflow.com/questions/10641144/…
V
Vansuita Jr.

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

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

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

https://i.stack.imgur.com/5dPJd.png


“除非你导入了错误的 BuildConfig 类”......是的,非常好的一点:D
谢谢!这是我的项目中的问题,它以某种方式获取了库项目的 BuildConfig(在 Android Studio 3 出现之前始终是发布模式)
我在颤振中收到错误未定义的 BuildConfig 类。
如果我确实在项目的不同模块中怎么办?例如,我为其他应用程序制作了一个 SDK,我想检查一下?
S
Someone Somewhere

由于关于 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。
谢谢@MikeBonnell,我将代码更改为示例代码
我看不出这与使用 BuildConfig.DEBUG 有什么不同 - 如果您只为调试版本设置 BuildConfig.ENABLE_CRASHLYTICS,那么 BuildConfig.DEBUG 和 BuildConfig.ENABLE_CRASHLYTICS 将始终具有相同的值,对吧?
我认为开发人员在库项目上的工作在使用 BuildConfig.DEBUG 检测调试/发布版本时遇到了问题。也可能涉及早期的 Android Studio 错误......
P
Prudhvi

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

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


这是正确的答案。返回“发布”,而 BuildConfig.DEBUG 始终返回 true
我在颤振中收到错误未定义的 BuildConfig 类。
G
Giedrius Šlikas

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

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

请在您的答案中添加描述。这将比仅仅一段代码更有帮助。
我在依赖 gradle 模块中使用 if (BuildConfig.DEBUG) {} ,该模块(当然)没有引用应用程序的 build.gradle 文件 - 这导致调试模式以错误的方式被识别。 if (BuildConfig.BUILD_TYPE.equals("Debug")){ } 修复了该问题。谢谢
这是真正的答案,只需将“调试”更改为“调试”
我在颤振中收到错误未定义的 BuildConfig 类。
@Kamlesh 在撰写此答案时,Flutter 与我们的想法相去甚远。请注意这一点
S
Salim Lachdhaf

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

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

正确的导入是 <package_name>.BuildConfig
不为我工作。我在颤振中收到错误未定义的 BuildConfig 类。
J
Jayesh Dankhara
if (BuildConfig.DEBUG) { 



}

这对我有用


d
duskrivermoon

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


如果出于某种原因使发布版本可调试怎么办?
@androiddeveloper 可以使发布版本可调试吗?
@KhalidLakhani 可以肯定。