Android Log的抓取、USER 版本与ENG 版本差异、mtKUser版本开启串口输入

部分转自: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、启动)出了开机问题、手机对服务唤醒和休眠的一些记录蓝牙相关问题。

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注意事项
抓取log时最好标注一下问题发生的时间

Android USER 版本与ENG 版本差异
[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

如何在User版本开启串口(Uart),抓取上层Log,开启输入控制台
[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:

    1. 在超级终端窗口按下键盘的任何一个按键就可以让UART log继续吐。此种方式需要UART的TX和RX都要连接好。
    2. 通过修改proc参数的方式: adb shell echo 1 > /proc/mtprintk
    3. 通过设置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输入

你可能感兴趣的:(mtk)