如何最佳地包含调试代码?

44

我正在编写安卓应用程序,这里使用的最佳方式可能与 Java 的一般方法相同或不同。

我只想能够设置一个调试标志,当它被设置为 true 时仅执行某些代码段,类似于 C++ 中设置预处理器 #define DEBUG 并使用 #ifdef DEBUG。

在 Java 中是否有一种被接受或最佳的方法来实现这一点?

目前我只是要设置一个变量在我的 Application 对象中,但我不认为这是最好的方式。


2
请查看这个答案:https://dev59.com/onM_5IYBdhLWcg3wgzhl - zmbush
7个回答

56

你可以使用 ADT 自动设置的标志,而不是使用自己的标志,方法如下:

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

FLAG_DEBUGGABLE 位会根据应用程序的“debuggable”属性(在AndroidManifest.xml中设置)自动设置为true或false。当不导出已签名的包时,ADT的最新版本(版本8)会为您自动设置此属性。

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

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


35

我建议使用内置的Android API BuildConfig

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

1
这应该标记为正确答案或下面的答案,以正确使用SDK提供的API。 - DevZer0

31

这是我的做法:

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

3
很好!我不知道你可以导入到一个单独的常量!我想避免每次都输入X.X.CONST。这个与我问题评论中引用的答案(https://dev59.com/onM_5IYBdhLWcg3wgzhl)相结合,该答案展示了在条件中使用false常量的'if'语句被排除在编译之外,这正是我要找的。谢谢! - stormin986
通过我的实验(检查字节码),这种方法只会从定义常量的类中排除代码...其他类仍然会有代码(尽管不会执行)。我错了吗? - Vlad
导入静态是基本上只是一个名称的事情。 - Vlad

27

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

通用说明中可以得知:

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


我的应用程序使用的库总是返回false。 - Ed of the Mountain

13

我使用了if (BuildConfig.DEBUG)的代码,通过使用BuildConfig类来实现。这是一段安全而简单的代码。当您使用此类代码时,请注意不要在发布版本和调试版本之间存在两个不同的代码分支。如果这样做,可能会使发布版本的应用程序测试失效。对我来说,我只用它来跳过Log消息的调用。

有关BuildConfig类的更多详细信息,请参见构建系统概念


几乎零的 CPU 使用率。完美。 - romulof
@OrB,我为你感到高兴,我认为这是现代Android Studio的最佳选择。我会编辑我的帖子,因为现在它应该被用作最简单的代码。感谢你的注意并提醒我。 - The Original Android

8
if ( Debug.isDebuggerConnected() ) {
  // debug stuff
}

我喜欢这个,我想有时候我会觉得它非常有用,但我喜欢另一种方法是在“if”语句中使用false常量来省略整个块的编译。 - stormin986
2
我同时使用两种方法和注释条件语句。每种方法都有其适用的场合,虽然一个真正的预处理器会更好。 - drawnonward
问题在于,当我的应用程序崩溃时,调试器并不总是连接着。我正在异常中收集堆栈跟踪并保存到文件中。但我必须仅在调试构建中执行此操作。 - anishsane

1

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接