Webkit实战技术:如何添加日志信息

调试日志信息

调试日志都是由宏来定义和实现的,并由另外定义的宏来作为开关。

日志开关

Webkit中只有JNI部分是有Log日志的,其他代码都没有加入日志。JNI部分常用的LOG有:
  • DBG_SET_LOG      在external/webkit/Source/WebKit/android/jni/PictureSet.h中定义,开关为PICTURE_SET_DEBUG
  • DBG_SET_LOGD在external/webkit/Source/WebKit/android/jni/PictureSet.h中定义开关为PICTURE_SET_DEBUG
  •  DBG_HANDLE_LOG 在external/webkit/Source/WebKit/android/nav/SelectText.cpp中定义,开关为VERBOSE_LOGGING
  • DBG_NAV_LOG在external/webkit/Source/WebKit/android/nav/CachedDebug.h中定义,开关为DEBUG_NAV_UI
  • DBG_NAV_LOGD在external/webkit/Source/WebKit/android/nav/CachedDebug.h中定义
  • DBG_NAV_LOGV在external/webkit/Source/WebKit/android/nav/CachedDebug.h中定义开关为DEBUG_NAV_UI_VERBOSE
  • DEBUG_PRINT_BOOL在external/webkit/Source/WebKit/android/nav/CachedNode.cpp和CachedRoot.cpp中定义,开关是DUMP_NAV_CACHE
  • DEBUG_PRINT_RECT在external/webkit/Source/WebKit/android/nav/CachedNode.cpp和CachedRoot.cpp中定义,开关是DUMP_NAV_CACHE
  • DEBUG_PRINT_COLOR在external/webkit/Source/WebKit/android/nav/CachedColor.cpp和CachedHistory.cpp中定义,开关是DUMP_NAV_CACHE

添加日志

对于Android的JNI代码或是C/C++层代码添加日志是通过system/core/include/cutils/log.h中定义的一些宏来实现的,log.h定义了这些宏,并有一些调试相关的开关。
LOGV,LOGD,LOGI,LOGW,LOGE
它们的级别是由上向下递增的,这些宏与Java代码android.util.Log中的Log.v,Log.d,Log.i,Log.w ,Log.e都是类似的。通常情况下只有LOGV是关闭的,其他的都是打开的。具体的定义和开关设置可以查看system/core/include/cutils/log.h文件。这些宏都使用了system/core/include/android/log.h中定义的一些方法如__android_log_print,__android_log_write等。
LOGE等这些宏跟print()函数一样可以使用变参,如LOGE(“rect is {%d,%d,%d,%d}”, a, b,c,d);但是查看LOGE宏的定义可以看到,还有一个参数就是宏LOG_TAG,cutils/log.h中定义的默认LOG_TAG是NULL,所以当你使用LOGE这些宏的时候要自己定义一个LOG_TAG。
总结,想要给C/C++ 文件添加日志,需要:
  1. #include <utils/Log.h>把Log.h 文件包含进来
  2. #define LOG_TAG “your log tag”定义LOG_TAG,通常为文件名字,以方便定位到哪个文件
  3. 使用LOGE,LOGW或LOGD等添加打印输出。
-------------------------------------------------更新于2012年7月19日------------------------------------------

如果发现LOGE等无法打印出Log,换用android_printLog试试,它的用法是:

android_printLog(LOG_LEVEL, LOG_TAG, ...),例如:

android_printLog(ANDROD_LOG_ERROR, "FrameLoader", "url is %s", url.string().latin1().data());

如何打印各种变量

对于bool, int, long就用%d就可以了;

对于指针类型可以用%p;

对于字串类型,有点麻烦,在WebKit中有四种字串类型:AtomicString,String, CString, string。但是打印输出中只能用%s来输出字符数组或字符指针,也就是char *类型,所以想要打印字串类型就需要把字串转化为char *类型。

  • 对于string,最简单,它是STL中的类型,直接用string.c_str()方法即可
  • 对于CString,它是与平台相关的类,它的方法data()可以返回char *类型,如LOGE("url is %s", url.data());
  • 对于String,要先转化为CString,它的方法latin1()可以转化为CString,再用其data()方法,如LOGE("url is %s", url.latin1().data());
  • 对于AtomicString,要先转化为String,它的方法string()即可得到String类型,如LOGE("url is %s", url.string().latin1().data());

可以看出,C++中的打印输出还是非常麻烦的,而Java中所有对象均有toString()方法就大大方便了I/O操作了。还要注意要包含头文件

  • #include <CString.h>
  • #include <String.h>
  • #include <AtomicString.h>

否则编译会有错误:incomplete type。这跟Java编译器的提示也不一样,Java会直接提示cannot find symbol,相对来说比较直观。

你可能感兴趣的:(Webkit实战技术:如何添加日志信息)