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

sto*_*986 37 java debugging android buildconfig

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

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

在Java中有没有可接受的或最好的方法来实现这一目标?

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

HRJ*_*HRJ 55

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

final static int appFlags = context.getApplicationInfo().flags;
final static boolean isDebug = (appFlags & ApplicationInfo.FLAG_DEBUGGABLE) != 0
Run Code Online (Sandbox Code Playgroud)

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

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

您可以在此主题中阅读更多内容.


yan*_*nko 30

这就是我这样做的方式:

// 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');
}
Run Code Online (Sandbox Code Playgroud)

  • 太好了!我不知道你可以一直导入到一个常数!我希望每次都避免输入XXCONST.这与我的问题评论(http://stackoverflow.com/questions/1344270/java-preprocessor)中引用的答案相结合,它显示了如何在条件中排除带有假常量的'if'语句汇编,正是我所寻找的.谢谢! (3认同)

IlD*_*Dan 26

SDK工具的修订版17(2012年3月)介绍了一种模仿 C的方法#ifdef DEBUG

一般说明:

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


Sun*_*mbi 16

我建议使用内置的Android API BuildConfig

if (BuildConfig.DEBUG) {
  // do something for a debug build
}
Run Code Online (Sandbox Code Playgroud)


The*_*oid 12

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

有关此类BuildConfig @ Build System Concepts的更多详细信息.


dra*_*ard 6

if ( Debug.isDebuggerConnected() ) {
  // debug stuff
}
Run Code Online (Sandbox Code Playgroud)

  • 我同时使用方法和注释条件。每个都有自己的位置,尽管真正的预处理器会是最好的。 (2认同)