Java 包含调试代码的最佳方法?

Java 包含调试代码的最佳方法?,java,android,debugging,buildconfig,Java,Android,Debugging,Buildconfig,我正在编写Android应用程序,这里的最佳方法可能与Java一般相同,也可能不同 我只想能够设置一个调试标志,当它被设置为true时,它只执行代码的某些部分。 有没有一种公认的或最好的方法可以在Java中实现这一点 现在我只想在我的应用程序对象中设置一个变量,但我认为这不是最好的方法。我就是这样做的: // in some.class.with.Constants public static final boolean DEV_MODE = true; // in some other cl

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

<>我只想能够设置一个调试标志,当它被设置为true时,它只执行代码的某些部分。 有没有一种公认的或最好的方法可以在Java中实现这一点


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

我就是这样做的:

// 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');
}

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

final static int appFlags = context.getApplicationInfo().flags;
final static boolean isDebug = (appFlags & ApplicationInfo.FLAG_DEBUGGABLE) != 0
根据应用程序的“可调试”属性(在AndroidManifest.xml中设置),将
标志\u DEBUGGABLE
位自动设置为true或false。最新版本的ADT(版本8)在不导出签名包时自动为您设置此属性

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


您可以在中阅读更多内容。

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

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

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

从:

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


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


关于这个类BuildConfig@的更多细节。

我建议使用内置的android API
BuildConfig

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

看看这个答案:很好!我不知道你可以导入一个常数!我想避免每次都输入X.X.CONST。这一点,再加上对我的问题()的评论中引用的答案,它显示了一个条件为false常量的“if”语句如何被排除在编译之外,这正是我想要的。谢谢根据我的实验(检查字节码),这种方法只会将代码从定义常量的类中排除。。其他类仍将包含代码(但不会执行)。我错了吗?import static基本上只是一个名称,我想我会发现它有时非常有用,但我喜欢另一种方法在'if'语句中使用一个假常量从编译中省略整个块。我同时使用方法和注释条件。每一个都有它的位置,尽管真正的预处理器最好。问题是,当我的应用程序崩溃时,调试器并不总是连接的。我正在收集异常中的堆栈跟踪并保存到文件中。但我必须只在调试版本中完成。几乎没有CPU使用。太好了。@OrB,我为你感到高兴,我认为这是现代安卓工作室的最佳选择。我将编辑我的帖子,因为现在它应该被用作最简单的代码。感谢您注意并提醒我。对于我的应用程序正在使用的库,始终返回false。为了正确使用SDK提供的API,应在正确答案或下面的答案处进行标记
if (BuildConfig.DEBUG) {
  // do something for a debug build
}