http://blog.csdn.net/chb2000/article/details/6598361
Android 开发文档中说明Log.d和Log.v只有在开发版本中输出,在Release版本中无输出。那么这个功能是如何实现的呢?Android中Log.d和Log.v在Java和Native Code有不同的实现,需要分别说明。
1. native code中实现
我们知道C/C++版本编译的时候会有release/debug 编译参数可以选择,所以在native code中可以根据不同的编译宏开关参数实现。
#ifndef LOGV
#if LOG_NDEBUG
#define LOGV(...) ((void)0)
#else
#define LOGV(...) ((void)LOG(LOG_VERBOSE, LOG_TAG, __VA_ARGS__))
#endif
#endif
2. Java代码中实现
Java的编译器就没有C/C++编译宏参数的功能,所以只能通过最原始的方法,写两个不同实现文件,在Make File 中根据编译参数不同进行COPY源代码的动作。大家可以在frameworks/base/Android.mk中查找实现方法。
其实在Java代码中,如果使用直接使用Log.v的方式输入trace,那么无论是Debug版本还是Release版本都还是会有Log输出的。文档所讲的,在Release版本中Verbose是不输出,在Android原始代码中使用下面的方式实现。
if (Config.LOGV) Log.v(TAG, "<<< Releasing cursor " + this);
Config.LOGV的最值是最终是根据ConfigBuildFlags.java文件,而ConfigBuildFlags.java是在Android.mk中进行控制的。
# Include a different set of source files when building a debug build.
# TODO: Maybe build these into a separate .jar and put it on the classpath
# in front of framework.jar.
# NOTE: Do not use this as an example; this is a very special situation.
# Do not modify LOCAL_SRC_FILES based on any variable other
# than TARGET_BUILD_TYPE, otherwise builds can become inconsistent.
ifeq ($(TARGET_BUILD_TYPE),debug)
LOCAL_SRC_FILES += $(call find-other-java-files,core/config/debug)
else
LOCAL_SRC_FILES += $(call find-other-java-files,core/config/ndebug)
endif
即使在Android2.2之后有增加Slog.java这样的类,在实现Log.v的控制的时候也是采用了Config.LOGV来做判断条件。由于每次写输出Log的时候都需要加上这样的判断,还真是有点痛苦哦。是否可以将Log.java 和 Slog.java进行下面的优化。
public static int v(String tag, String msg) {
if (Config.LOGV)
return Log.println_native(Log.LOG_ID_SYSTEM, Log.VERBOSE, tag, msg);else
return 0;
}public static int v(String tag, String msg, Throwable tr) {
if (Config.LOGV)
return Log.println_native(Log.LOG_ID_SYSTEM, Log.VERBOSE, tag,
msg + ‘\n‘ + Log.getStackTraceString(tr));else
return 0;
}
原文:http://www.cnblogs.com/terryc/p/5052254.html