Android驱动笔记(8)——bugreport介绍
8.1、概述及应⽤场景
安卓bugreport主要⽤于分析⼿机的状态。其包含:main log,kernel log,cpuinfo等信息。bugreport是⼀个可执⾏⽂件,编译后的路径为system/bin/bugreport,源码位于framework/native/cmds/bugreport。其核⼼在于启动dumpsys服务。bugreport同dumpstate服务建⽴socket 通信(建⽴连接20次,超时3min⽆数据等容错)。连接之后,将接收到的数据定向到⽂件中。
因此我们看到的bugreport数据均来⾃dumpstate。
1. print_header(string):读取了需要显⽰的prop如fingerprint,build type等等。
美就在身边作文2. dump_systrace():将⽂件加⼊到bugreport.zip中。
论持久战读后感3. dump_raft():将⽂件加⼊到bugreport.zip中。
8.2、bugreport流程梳理
1. 提⾼dumpsate进程的优先级,防⽌被OOM Killer杀死五色梅花
虾仁意面2. 参数解析(adb shell dumpstate -h)
3. (打开vibrator,在执⾏bugreport时,先震动⼀下提醒)
4. 通过dump_traces()来完成收集虚拟机和native进程的stack traces
5. 通过get_tombstone_fds来获取tombstone⽂件描述符
6. 开始执⾏切换到⾮root⽤户和组,在这之前的执⾏都处于root权限
7. 执⾏dumpstate()主要过程都在这⾥执⾏
8. 再次通过震动以提醒dump操作执⾏完成
9. 发送⼴播,告知ActivityManager已完成bugreport操作
8.3、⼩结
bugreport通过socket与dumpstate服务建⽴通信,在dumpstate.cpp中的dumpstate()⽅法完成核⼼功能。分别输出:current log、 last log、 vm trace、 dumpsys、 system info
其详细内容主要有:系统build及运⾏时长等信息、内存和CPU进程的信息、 kernel log、 system log、 radio log、 event log等等。实际来说,bugreport中显⽰的⼤部分为信息,都有对应的命令⽅式可以获取。bugreport只是作为⼀个在不打扰⽤户的前提下执⾏的⼀套命令集合。
8.4、bugreport的解析⽅法
有以下两种办法可以更加⽅便地解析bugreport。
1. 推荐使⽤Sony开源的⼀款checkbugreport的⼯具来解析成⼀个html⽂件。
安装java环境
在cmd 窗⼝中执⾏ java -jar {path}/checkbugreport.jar {path}/bugreport.log
解析好的⽂件在bugreport log⽂件夹中会⽣成 bugreport_out的⽂件夹,打开index.html即可以查看。
2. 推荐google的开源⼯具:。
这个⼯具需要FQ,借助google解析,本地搭建环境也不复杂,看情况有时间出教程。
8.5、Dumpsys nsorrvices解析
作为⼀个nsor⼯程师,这是⼀个必备的技能。
Dumpsys nsorrvices⽤于查看当前设备nsor的使⽤情况。可通过_adb shell dumpsys nsorrvice_获取。开头提供了Active nsors的信息:
Active nsors:中国人民公安大学报考条件
BMI120 Accelerometer (handle=0x00000001, connections=3)
stk3x3x alsprx (handle=0x00000008, connections=1)
Step Counter (handle=0x00000015, connections=3)
Step Detector -Wakeup Secondary (handle=0x00000021, connections=1)
Socket Buffer size = 984 events
WakeLock Status: not held
Mode : NORMAL
其中有加速度计、光线距离感应器、步进计数器、步进探测器等。
8 active connections
Connection Number: 0
Operating Mode: NORMAL //对应到前⾯的Mode
//这⾥只能显⽰uid,并不能显⽰pid,通过uid,可以在/data/system/package.list看到对应的package name
Step Counter 0x00000015 | status: active | pending flush events 0
Connection Number: 1
Operating Mode: NORMAL
android.view.OrientationEventListener | WakeLockRefCount 0 | uid 10160 | cache size 0 | max cache size 0
水底鱼
BMI120 Accelerometer 0x00000001 | status: active | pending flush events 0
Connection Number: 2
Operating Mode: NORMAL
有些情况下,两个APP的uid是⼀样的,这时就需要pid来进⾏区分,想要看到app运⾏的pid信息,需要在nsorrvice中增加⼀些code才可以。打开_frameworks\native\rvices\nsorrvice\SensorService.h_
增加如下内容:
uid_t mUid;
pid_t mPid; //Debug
在_frameworks\native\rvices\nsorrvice\SensorService.cpp_⽂件中添加:
SensorService::SensorEventConnection::SensorEventConnection(
mChannel = new BitTube(mService->mSocketBufferSize);
mPid = IPCThreadState::lf()->getCallingPid(); //Debug
...)
SensorService::SensorEventConnection::Dump(String8& result){
result.appendFormat("\t WakeLockRefCount %d pid %d | uid %d | ..., mPid, mUid");
}
增加上⾯的内容以后就可以在nsorrvice中打印出pid信息。
Previous Registrations:
14:50:16 + 0x00000001 pid= 3580 uid=10160 package=android.view.OrientationEventListener samplingPeriod=200000us batchingPeriod=0us
14:50:16 + 0x00000001 pid= 3580 uid=10160 package=android.view.OrientationEventListener samplingPeriod=200000us batchingPeriod=0us
14:50:16 - 0x00000001 pid= 3580 uid=10160 package=android.view.OrientationEventListener
14:50:16 + 0x00000001 pid= 3580 uid=10160 package=android.view.OrientationEventListener samplingPeriod=200000us batchingPeriod=0us
14:48:27 + 0x00000015 pid= 5314 uid=10161 t.mm.del.g samplingPeriod=600000us batchingPeriod=0us
14:48:21 + 0x00000015 pid= 3390 uid=10161 t.mm.del.c samplingPeriod=600000us batchingPeriod=0us
14:48:18 + 0x00000021 pid= 4975 uid= 1000 package=com.xiaomi.joyo.stepsprovider.StepsService samplingPeriod=200000us batchingPeriod=300000000us
14:48:18 - 0x00000007 pid= 2480 uid= 1000 package=miui.util.ProximitySensorWrapper
14:48:17 + 0x00000015 pid= 3251 uid=10160 t.ad samplingPeriod=200000us batchingPeriod=360000000us
14:48:14 + 0x00000001 pid= 2288 uid= 1000 package=com.android.rver.policy.WindowOrientationListener samplingPeriod=66667us batchingP
eriod=100000us
14:48:14 + 0x00000007 pid= 2480 uid= 1000 package=miui.util.ProximitySensorWrapper samplingPeriod=0us batchingPeriod=0us
14:48:11 + 0x00000008 pid= 2288 uid= 1000 package=hidl_client_pid_880 samplingPeriod=500000us batchingPeriod=0us
只有你知道--------- 0.035s was the duration of dumpsys nsorrvice, ending at: 2019-02-11 14:58:37怎么清洗热水器
最后会打印出⼀些最近的注册信息,可以清晰地看到相关服务的启动时间、pid、uid、采样时间以及批处理时间。整个dumpsys nsorrvices也就宣告结束。