Android中Log.d和Log.v如何实现在release版本不输出

本文探讨了Android系统如何在Release版本中不输出Log.d和Log.v。在native code中,通过编译宏开关参数实现;在Java代码中,利用Config.LOGV变量在Android.mk中控制。当Config.LOGV为真时,才会执行Log输出。Android 2.2后的Slog.java类也遵循相同机制,但每次写Log需添加条件判断,增加了代码复杂性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值