【问题标题】:Best Way to Include Debug Code?包含调试代码的最佳方式?
【发布时间】:2011-02-12 16:44:49
【问题描述】:

我正在编写 Android 应用程序,这里的最佳方式可能与 Java 相同,也可能不同。

我只是希望能够设置一个调试标志,该标志仅在设置为 true 时执行代码的某些部分——相当于 C++ 设置预处理器#define DEBUG 并使用#ifdef DEBUG。

在 Java 中是否有公认的或最好的方法来实现这一点?

现在我只想在我的 Application 对象中设置一个变量,但我认为这不是最好的方法。

【问题讨论】:

标签: java android debugging buildconfig


【解决方案1】:

您可以使用 ADT 自动设置的标志,而不是使用自己的标志,如下所示:

final static int appFlags = context.getApplicationInfo().flags;
final static boolean isDebug = (appFlags & ApplicationInfo.FLAG_DEBUGGABLE) != 0

FLAG_DEBUGGABLE 位自动设置为 true 或 false,具体取决于应用程序的“可调试”属性(在 AndroidManifest.xml 中设置)。最新版本的 ADT(版本 8)在不导出签名包时会自动为您设置此属性。

因此,您不必记住设置/重置自己的自定义标志。

您可以在this thread阅读更多内容。

【讨论】:

    【解决方案2】:

    我就是这样做的:

    // in some.class.with.Constants
    public static final boolean DEV_MODE = true;
    
    // in some other class
    import static some.class.with.Constants.DEV_MODE;
    
    if(DEV_MODE){
        Log.d('sometag', 'somemessage');
    }
    

    【讨论】:

    • 不错!我不知道您可以一直导入到单个常量!我希望避免每次都输入 X.X.CONST。这与我的问题 (stackoverflow.com/questions/1344270/java-preprocessor) 的评论中引用的答案相结合,它显示了条件中具有错误常量的“if”语句是如何从编译中排除的,这正是我正在寻找的。谢谢!
    • 通过我的实验(检查字节码),这种方法只会从定义常量的类中排除代码。其他类仍然会有代码(它不会执行尽管)。我错了吗?
    • import static 基本上只是个名字而已
    【解决方案3】:

    我建议使用内置的android API BuildConfig

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

    【讨论】:

    • 正确使用SDK提供的API时,请在正确答案或下方标注此项
    【解决方案4】:

    SDK 工具的第 17 版(2012 年 3 月)引入了一种模仿 C 的 #ifdef DEBUG

    的方法

    来自General Notes

    添加了一项功能,允许您仅在调试模式下运行某些代码。构建现在会生成一个名为 BuildConfig 的类,其中包含一个根据您的构建类型自动设置的 DEBUG 常量。您可以检查代码中的 (BuildConfig.DEBUG) 常量以运行仅调试功能。

    【讨论】:

    • 对于我的应用正在使用的库,总是返回 false
    【解决方案5】:

    这适用于我的代码 if (BuildConfig.DEBUG),使用 BuildConfig 类。这是一个安全且简单的代码。使用这种风格的代码时要小心。不要在 Release 和 Debug 版本之间使用 2 个不同的不同代码分支。如果这样做,可能会使发布版本的应用程序测试无效。对我来说,我只用它来跳过调用Log 消息传递。

    关于这个类 BuildConfig 的更多细节@Build System Concepts

    【讨论】:

    • CPU 使用率几乎为零。完美。
    • @OrB,我为你感到高兴,我认为它是现代 Android Studio 的最佳选择。我将编辑我的帖子,因为现在它应该被用作最简单的代码。感谢您的关注和提醒。
    【解决方案6】:
    if ( Debug.isDebuggerConnected() ) {
      // debug stuff
    }
    

    【讨论】:

    • 我喜欢这个,我想有时我会发现它非常有用,但我喜欢另一种方法如何在 'if' 语句中使用错误常量从编译中省略整个块。
    • 我同时使用方法和注释条件。每个都有自己的位置,尽管最好使用真正的预处理器。
    • 这个问题是,当我的应用程序崩溃时,调试器并不总是连接。我正在收集异常中的堆栈跟踪并保存在文件中。但我必须仅在调试版本中执行此操作。
    【解决方案7】:

    我认为编写测试比添加调试代码更好。

    我的观点是,当您为某些组件/方法/类编写测试时,您不会用一些冗余的调试代码污染您的原始源代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-15
      • 1970-01-01
      • 1970-01-01
      • 2017-11-16
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 2011-06-18
      相关资源
      最近更新 更多