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;
}

更多相关文章

  1. Android视录视频示例及代码下载
  2. 关于webservice服务器接收不到Android传递过来的参数的问题
  3. ios与android语音通用方案 编译libopencore-amr xcode4.5/ios6版
  4. android recovery 系统代码分析 -- 选择进入
  5. 【Android】技术调研:用代码模拟屏幕点击、触摸事件
  6. cocos2dx通过Jni调用Android的Java层代码(上)
  7. 200行Java代码实现Android下的视频通话

随机推荐

  1. Android(安卓)Zygote进程启动过程
  2. 关于Android(安卓)打开新的Activity 虚拟
  3. android-如何在子线程中更新ui
  4. listview所带来的滑动冲突
  5. Android屏幕密度与UI大小显示
  6. Android(安卓)NDK 编译过程中遇到错误 ex
  7. 如何自学Android
  8. Android(安卓)不同手机分辨率适配(xml方
  9. Andorid入门学习笔记整理(一)
  10. Android(安卓)SDK4.0.3及以上版本支持int