android - 如何以编程方式判断我的应用程序是否正在调试?

标签 android debugging

我正在寻找一种方法来判断我的应用程序是在调试器下运行还是在 Android Studio 下“正常”运行。

这两个案例是
1. 单击“运行应用程序”按钮(绿色箭头)运行应用程序
2. 单击“调试应用程序”按钮(齿轮图标)运行应用程序

我想在调试时输出更详细的诊断信息(使用 Log.*)。
我尝试检查 BuildConfig.DEBUG 但无论哪种情况都是如此。我怀疑这是因为 Android Studio 在这两种情况下都使用调试证书对应用程序进行签名。

有人知道如何在运行时区分这两种情况吗?

最佳答案

通常,人们会检查 BuildConfig.DEBUG (或保存它的 boolean 变量),然后记录:

if(BuildConfig.DEBUG) {Log.d("SomeActivity", "debug message");}

参见 documentation ...与调试最相关的是 build-config debuggable true/false

run 按钮不会启动调试器;无论构建配置如何(它只是跳过所有断点)。

在多模块项目中,应该检查:

(getContext().getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0 

为了区分它们,需要配置两种构建类型:

android {
    ...
    buildTypes {
        debug {
            ...
            renderscriptDebuggable true
            jniDebuggable true
            debuggable true
        }
        release {
            ...
            renderscriptDebuggable false
            jniDebuggable false
            debuggable false
        }
    }
}

为了准确回答这个问题,甚至有一种方法称为 isDebuggerConnected() ,当点击run按钮时,它总是返回false(无论构建配置如何)。

关于android - 如何以编程方式判断我的应用程序是否正在调试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53560750/

相关文章:

android - 实现下拉菜单项切换复选框

android - Android MVVM + 数据绑定(bind) + 架构组件示例(ViewModel 和 Room)

java - 我们可以在 webRTC 视频通话中动态删除和添加音频流而无需重新协商吗

c - 在链表错误中用字符串替换字符?

java - 使用 swing 中的 BasicTableUI 时,rendererPane 变为 null

java - 无法关闭 Android 中的进度对话框

java - 如何自动生成 API 版本之间的差异?

.net - 调试多线程应用程序的建议

c - C语言dll调试

c++ - 错误代码 C2451 无法运行基本程序