部分转自:http://blog.csdn.net/yaoming168/article/details/38777727 其余摘录自MTK官方解释 一、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、adb devices 检查连接是否成功 2、adb install 3、adb uninstall (卸载软件时,卸载包名,后面跟着包名,而不是.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、启动)蓝牙相关问题出现了启动问题,一些关于服务唤醒和手机休眠的记录。
主要包括四种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注意事项 抓取log最好标注问题发生的时间
[Description] Android USER 版本与ENG 版本的差异, 用户版和工程版的区别
[Keyword] USER ENG user eng 用户版本 工程版本 差异
[Solution] Google 官方描述: USER/USERDEBUG/ENG 版本的差异, 参考alps/build/core/build-system.html 的详细说明 eng This is the default flavor. A plain make is the same as make eng. * Installs modules tagged with: eng, debug, user, and/or development. * Installs non-APK modules that have no tags specified. * Installs APKs according to the product definition files, in addition to tagged APKs. * ro.secure=0 * ro.debuggable=1 * ro.kernel.android.checkjni=1 * adb is enabled by default. * Setupwizard is optional user make user This is the flavor intended to be the final release bits. * Installs modules tagged with user. * Installs non-APK modules that have no tags specified. * Installs APKs according to the product definition files; tags are ignored for APK modules. * ro.secure=1 * ro.debuggable=0 * adb is disabled by default. * Enable dex pre-optimization for all TARGET projects in default to speed up device first boot-up userdebug make userdebug The same as user, except: * Also installs modules tagged with debug. * ro.debuggable=1 * adb is enabled by default.
MTK 补充说明差异: (1) Debug/LOG 原则上,方面user 版本只能掌握有限的信息,eng 更多的信息,Debug 能力强,提倡使用eng 版本开发测试 * 因ro.debuggable 的差异,eng 默认打开版本app 的JDWP,以及uart console debug; 相对应的user 版本关闭, 导致在DDMS 上无法看到app process 的列表. * 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 信息 * eng 版本linux kernel 开启了大量的debug 选项,可以抓取出更多的资讯,如可以使用sysrq-trigger, KDB, User 版本则关闭
(2) 性能方面(Performance),原则上进行性能测试请使用user 版本测试 * user 版本为提高第一次开机速度,使用了DVM 的预优化,将dex 文件分解成可直接load 运行的odex 文件,eng 版本不会开启这项优化 * user 版本相关kernel debug 关闭,有利于提高linux kernel 的性能 * user 版本更少的LOG 打印,更少的debug 代码,以及uart 的关闭,原则上user 版本的性能要优于eng 版本
(3) 安全方面(security)的影响 * eng 版本默认关闭了adb 的PC RSA指纹验证,而user 版本默认开启, 如果没有验证 PC RSA 指纹, adb 连接时将提升devices offline * 因user/eng 版本设置ro.secure不同,导致user 版本adb 只拥有shell 权限,而eng 版本具有root 权限
- eng 版本内置了su, adb 具有root 权限, 导致系统的安全性严重受到影响
(4) 如何确认user/eng 版本 * Java 层,check android.os.Build 类中的TYPE 值 * native 层,property_get(“ro.build.type”, char* value, “eng”); 然后check value 值 * Debug 时, adb shell getprop ro.build.type 返回值如果是user 即user 版本,eng 即eng 版本 * Log 确认, mobile log/Aplog_xxxxx/versions 中查看ro.build.type 属性
(5) 如何编译user/eng 版本 * 默认编译是eng 版本,如果需要编译user 版本,请加入参数 -o=TARGET_BUILD_VARIANT=user 如: ./mk -o=TARGET_BUILD_VARIANT=user mt6595_phone new
[Description] 如何在User版本开启串口(Uart),开启输入控制台,抓取上层Log
[Keyword] User Uart Log Logcat 输入 控制台 串口
[Solution] (1) 如何在User版本中使用串口(Uart) *Android GB 2.3 GB.MP GB.TDD.MP GB2.MP GB2.TDD.MP alps/mediatek/config/common/autoconfig/kconfig/USER 如果版本一致的话,应当是这个文件的37行 CONFIG_COMLINE=”console=ttyMT3,921600n1 loglevel=0” 您把最后的loglevel = 8 即可
*Android GB3.MP GB3.TDD.MP 手法1:直接用ENG 版本的lk 替换掉user 版本的lk, 即重新download eng 版本的lk 即可。 手法2: alps/bootable/bootloader/lk/app/mt_boot/mt_boot.c 里面的 178 行,找到printk.disable_uart=1 改成 printk.disable_uart=0 然后重新编译lk, download lk 即可。
*Android ICS 4.0/JB 4.1 如果是必须开机即需要抓取User 版本的Uart log, 请提交eservice 申请默认开启uart 的xlog 执行档 否则可以直接在adb shell 中输入aee -k 6, 后面的6即kernel printk 的Log等级,您可以选择不同的等级
*Android JB 4.2 以及以后版本 手法1:直接用ENG 版本的lk 替换掉user 版本的lk, 即重新download eng 版本的lk 即可。 手法2: alps/bootable/bootloader/lk/app/mt_boot/mt_boot.c 里面的 178 行,找到printk.disable_uart=1 改成 printk.disable_uart=0 然后重新编译lk, download lk 即可。 手法3: 如果只是临时将uart log 打开用于测试,请到我司DMS 上查询文档: Enable UART Log in user build.pptx
注意事项: 由于uart log 的打印对系统的性能造成严重影响, 在JB9.MP 以及以后版本, 在开机完成后默认关闭了uart log, 以提高系统性能. 从uart log 中可以看到如: 抓UART Log的时候会看到类似下面的Log。 [ 25.986567].(1)[324:Binder_1][usktrk] socket close[10422] [ 25.987748].(1)[324:Binder_1]BOOTPROF: 25987.740155:BOOT_Animation:END [ 25.988616].(1)[324:Binder_1]<< printk console disable >>
要关闭此功能,可以进行如下操作: 有三种种方法可以重新打开UART log:
- 在超级终端窗口按下键盘的任何一个按键就可以让UART log继续吐。此种方式需要UART的TX和RX都要连接好。
- 通过修改proc参数的方式: adb shell echo 1 > /proc/mtprintk
- 通过设置system property: 使用: UART:command: setprop persist.uartconsole.enable 1 ADB Shell: adb shell setprop persist.uartconsole.enable 1
(2) 如何开启Uart 的控制台(console/sh) Uart 控制台的开启,决定于System property ro.debuggable,默认如果ro.debuggable=1 则开启(Eng 版本),User 版本ro.debuggable=0 则关闭。 想在User 版本中打开,需要更新alps/mediatek/config/mt65xx/init.rc, 在init.rc 的触发器代码: on property:ro.debuggable=1 start console 后面增加: on property:ro.debuggable=0 start console 然后重新编译bootimage 即可, ./mk [project_name] new bootimage
(3) 如何在Uart 上抓取上层LOG Uart 上进行输入,实际就是开启了一个sh 对接起来,所以绝对不能在uart 上输入一个长命令(不可中断),否则uart 将被卡住,不能再输入。 抓取上层log, 我们通常需要call logcat, 但logcat 是不可中断的,将导致uart 不能再输入。 处理的方法即将logcat 转入后台执行,如下操作即可: Main log: logcat -v time & Radio log: logcat -v time -b radio & Event log: logcat -v time -b events & 如果想关闭上层log, 直接ps 查阅前面开启的logcat process pid, 然后kill -9 pid 杀掉即可。 注意一定要带“&”,否则将block 住uart输入