调试日志信息
调试日志都是由宏来定义和实现的,并由另外定义的宏来作为开关。
日志开关
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++ 文件添加日志,需要:
- #include <utils/Log.h>把Log.h 文件包含进来
- #define LOG_TAG “your log tag”定义LOG_TAG,通常为文件名字,以方便定位到哪个文件
- 使用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,相对来说比较直观。
分享到:
相关推荐
6. **静态库编译**:如果需要静态库,可以在Android.mk中添加`LOCAL_STATIC_LIBRARIES`或CMakeLists.txt中指定`add_library`的类型为`STATIC`。然后重新编译。 7. **集成到应用**:将生成的`.so`库文件复制到项目的...
本文将深入探讨Android底层库的相关知识点,包括它们的结构、核心组成部分以及如何添加本地程序和库等内容。 #### 二、底层库与程序的结构 Android的底层库和程序构成了系统的基石,确保了Android设备能够稳定高效...
《Android底层开发技术实战详解——内核、移植和驱动》这本书深入探讨了Android系统的底层机制,包括内核、系统移植以及设备驱动等关键领域。在Android操作系统中,这些部分是构建高效、稳定和功能丰富的应用的基础...
在Android系统中,底层接口和驱动开发是至关重要的部分,它们构成了Android运行的...提供的“Android底层接口和驱动开发技术详解-下载代码”很可能是相关教程或项目的源代码,这对于实际操作和学习是非常宝贵的资源。
【Android系统架构及其驱动研究】 Android系统架构是一个分层的...以上是对Android底层驱动原理的详细解析,涵盖了系统架构、驱动类别、实例分析等多个方面,为Android开发者提供了深入理解硬件与软件交互的基础知识。
编译过程中,可能涉及到C/C++的NDK开发,因为内核日志通常需要底层编程知识。 6. **运行和解析日志**:`kernellogd`运行后,会将收集到的内核日志通过adb回传到开发者机器,或者保存在设备本地。解析这些日志通常...
本文将深入探讨Android底层开发中的关键知识点,包括内核架构、驱动模型、设备树、以及相关的开发工具和流程。 一、Android内核架构 Android内核基于Linux内核,它负责管理硬件资源、调度任务、处理中断、提供安全...
对于Android 2.3(也称为Gingerbread)版本,虽然现在已经较为陈旧,但了解其源码的获取与编译方法有助于理解Android系统的底层工作原理,对开发者来说仍然有价值。以下是关于"android2[1].3源码下载编译过程"的详细...
【Android底层详解启动篇】 Android系统的底层开发是一个深入且复杂的领域,它涵盖了操作系统、硬件交互、驱动程序以及系统服务等多个方面。本篇文章将基于“eoeAndroid特刊”第21期中的“Android启动流程分析”...
除了上述核心功能,AndroidKiller还依赖于一些外部库,例如lua5.3.0.dll是用于脚本支持,而AKCommon.bpl、vcl230.bpl和rtl230.bpl是Delphi开发的组件库,它们为工具提供了丰富的图形界面和底层操作支持。 在实际...
6. **调试与日志分析**:在反编译过程中,可能需要分析应用的日志文件(Logcat),`Androidkiller`可能提供了一些辅助功能来帮助开发者定位问题。 7. **代码混淆与反混淆**:部分APK可能采用了代码混淆技术来增加...
这份“Android底层驱动开发”文档很可能包含了深入浅出的讲解,帮助开发者理解并掌握Android驱动开发的核心技术。 一、Android驱动架构 1. Linux内核驱动:这部分驱动运行在内核空间,负责直接与硬件交互,包括...
《Android底层开发技术实战详解:内核、移植和驱动》这本书深入探讨了Android系统的底层机制,包括内核、系统移植和驱动程序开发等关键领域。作为一本实践性强的技术指南,它为开发者提供了全面且深入的知识点,以下...
腾讯XLog就是一个专为Android平台设计的日志打印工具,旨在提供高效、安全的日志记录功能。本文将深入探讨腾讯XLog的文件解密过程以及其在Android应用程序中使用的So(Shared Object)库。 首先,我们要理解XLog的...
同时,`__android_log_print`用于在Android日志系统中输出调试信息。 最后,通过NDK工具链编译C代码为.so动态链接库,然后将.so文件放置到Android项目的`jniLibs`目录下,以便在运行时被Java代码加载。 总结起来,...
#### 二、Android底层库和程序的结构 Android的底层主要由一系列库和程序构成,这些库和程序支持着整个系统的运行。主要包括以下几个部分: 1. **标准C/C++库bionic**:这是Android系统中使用的一种轻量级C/C++...
Android底层库和程序不仅支持了系统的稳定运行,还为开发者提供了丰富的API来构建高质量的应用程序。本文将详细介绍Android的底层库和程序的相关知识点。 #### 二、底层库和程序的结构 **1.1 本地实现底层的结构**...
7. **运行与调试**:在完成上述步骤后,你可以通过Android Studio的“Run”按钮来编译和运行项目。如果遇到问题,检查错误日志,根据提示进行修正。 8. **优化与打包**:在项目稳定后,可以进行性能优化和APK打包。...
在本文中,我们将详细探讨如何在Ubuntu 12.04上编译Android 4.1.1_r6源代码。这个过程对于开发者来说非常...在整个过程中,保持耐心,密切关注编译日志,及时解决出现的问题,最终才能成功编译出定制的Android系统。