一、Android log框架简介
二、log获取方式
1、Eclipse 抓取
1)根据信息类型过滤log
那个显示框上面还有个下拉列表选项可以选择过滤哪些信息。
a、Log.v 的调试颜色为黑色的,任何消息都会输出,这里的v代表verbose啰嗦的意思,代码实现就是Log.v(“”,”“);
b、Log.d的输出颜色是蓝色的,仅输出debug调试的意思,但他会输出上层的信息,过滤起来可以通过DDMS的Logcat标签来选择
c、Log.i的输出为绿色,一般提示性的消息information,它不会输出Log.v和Log.d的信息,但会显示i、w和e的信息
d、Log.w的意思为橙色,可以看作为warning警告,一般需要我们注意优化Android代码,同时选择它后还会输出Log.e的信息。
e、Log.e为红色,可以想到error错误,这里仅显示红色的错误信息,这些错误就需要我们认真的分析,查看栈的信息了。log的过滤
2)自定义标签,过滤log
点击 添加Filter Name 和 by log Tag 来过滤代码中的Log.v(“yaoming”,”ringTone[0]== “); log信息
2、adb 抓取log
ADB 是一个C/S 架构的应用程序,有三部分组成:
1)adbclient,运行在PC上(DDMS)
2)adbdaemon(守护进程),运行在Emulator中
3)adbserver(服务进程),运行在PC(任务管理器上可以看见),
管理着adb client和 adb daemon通讯
注:server与client通讯端口5037, adb server会与emulator交互,使用的端口有两个,一个是5554专用与emulator实例的连接,那么数据可以从emulator转发给IDE控制台,另一个则是5555,专门与adb daemon连接为后面调试使用
1、adbdevices 查看是否连接成功
2、adbinstall
3、adbuninstall (卸载的软件时,卸载的是包名,后面跟的是包的名字,而不是.APK)
4、Logcat
1)、adb logcat>main.txt 重定向log、
2)、adb logcat -b main-v time>app.log 打印应用程序的log
3)、adb logcat -bradio -v time> radio.log 打印射频相关的log,SIM STK也会在里面,modem相关的ATcommand等,
4)、adb logcat -bevents -v time 打印系统事件的日志,比如触屏事件。。。
5)、tcpdump 是很有用的,对于TCP/IP协议相关的都可以使用这个来抓,adb shell tcpdump-s 10000 -w /sdcard/capture.pcap,比如抓mms下载的时候的UA profile,browser上网的时候,使用proxy的APN下载,streaming的相关内容包括UA profile等。
3、Mtklog
1, radio log
线:usb cable
命令: adb logcat –b radio –v time >radio.txt
-v time: 表示log中加入了时间信息
2, main log
main log和我们从DDMS中看到的log是一致的
线: usb cable
命令: adb logcat –b main –v time >main.txt
-v time: 表示log中加入了时间信息
3, event log
event log属于system log
线: usb cable
命令: adb logcat –b events –v time >events.log
-v time: 表示log中加入了时间信息
4, kernal log
使用超级终端来抓kernal log,请参考以下步骤:
四、log分析
1、Java Exception
在main log中分析,要注意Exception的时间、PID和栈
2、Native code/jni 导致
1)、error.h 这个文件 中标明含义
2)、sqlite 错误 sqlite3.h中查找 标明含义
3)、NO space left ondevice 磁盘空间已满
使用du命令 查看文件空间
find -type size +100k 大于100k文件
4)、ooM 异常
3、ANR
在log中查看 system log找到ANR关键字
MTK log分析
1、Mobile Log:也称AP log,系统应用层的log,比如应用程序无响应或强行关闭,kernel相关的,比如driver(相机、蓝牙、usb、启动)出了开机问题、手机对服务唤醒和休眠的一些记录蓝牙相关问题。
2、主要包括四种log:kernel、main、event and radio log
3、Modem log 是手机里负责搜网和sim卡数据操作底层模块,
md log用于分析掉网、掉话和无信号问题,一般此文件都需要特殊工具解码,主要针对射频modem相关问题抓取(mtklog/mdlog)
4、Network log
主要针对网络的Network相关问题抓取(mtklog/netlog)
主要场景:彩信下载、浏览器上网、streaming问题相关
WIFI、数据流量下不同场景信号下的网络连接问题,网络下的数据传输问题
五、抓取log注意事项
1、抓取log时最好标注一下问题发生的时间
2、MTK usr和eng的区别
MTK 补充说明差异:
(1) Debug/LOG 方面,原则上user版本只能抓到有限的资讯,eng可以抓到更多的资讯,Debug能力更强,推崇使用eng版本开发测试
- 因user/eng版本设置ro.secure不同,导致user版本adb只拥有shell 权限,而eng版本具有root权限
- MTK System LOG 在ICS以后,在user版本默认关闭全部LOG,在eng版本中默认打开,以便抓到完整的资讯
- 在eng版本上,LOG量 >= user 版本的log量,一些地方会直接check eng/user版本来确认是否打印LOG
- user 版本默认关闭uart, eng版本默认开启uart
- 在eng版本上,开启ANR的predump, 会抓取ftrace,可以得到更多ANR的资讯
- 在eng版本上,可用rtt抓取backtrace,可开启kdb进行kernel debug,可用ftrace抓取cpu 执行场景
- MTK aee 在ENG版本抓取更多的异常资讯,比如native exception会抓取core dump信息
(2) 性能方面,原则上进行性能测试请使用user版本测试
- user 版本为提高第一次开机速度,使用了DVM的预优化,将dex文件分解成可直接load运行的odex 文件,ENG版本不会开启这项优化
- 更少的LOG打印,uart的关闭,原则上user版本的性能要优于eng版本
(3) 如何确认user/eng版本
- Java 层,checkandroid.os.Build类中的TYPE值
- native 层,property_get(“ro.build.type”,char* value, “eng”);然后check value值
- Debug 时, adb shellgetprop ro.build.type返回值如果是user即user 版本,eng即eng版本
- Log 确认, mobilelog/Aplog_xxxxx/versions中查看ro.build.type属性