zoukankan      html  css  js  c++  java
  • Log.d and Log.v for Android

    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 + ' ' + Log.getStackTraceString(tr));

          else

           return 0;
        }

  • 相关阅读:
    script中的event和for的意思
    jQuery选择器详解(一)转载自:http://blog.imbolo.com/jqueryselectors/#comments
    抽象类那点事(一步步案例分析,为什么需要它)
    关于application/xwwwformurlencoded等字符编码的解释说明 + 异步 True 或 False?+ onreadystatechange 事件
    SVG中中文字体的显示
    通过Virtualbox安装Ubuntu设置Emacs搭建Erlang环境
    试用Windows Live Writer
    Erlang中Eunit基本内容汇总
    xml特殊字符
    VS2010开发环境最佳字体及配色
  • 原文地址:https://www.cnblogs.com/terryc/p/5052254.html
Copyright © 2011-2022 走看看