1. log抓取方法
*#*#996996#*#* 开始抓取*#*#996996#*#* 结束抓取
2. log文件和存储
存储位置: sdcard/diag_logs
文件:
1. 81cf12e6-b266-eefa-cd8e-8676e8ff3684.qdb
2. diag_log_20220329_1558111648540691565.qmdl2
3. diag_qdss_log_mpss_adsp_audio_pd_20220329_1558231648540703019.qdss
4. diag_qsr4_guid_list.xml
3. log抓取过程实现
1. 电话触发,发送广播
2. catchLog app 接收广播,调用SystemService.start("diag_mdlog_start"); & SystemService.start("diag_mdlog_stop");
3. SystemService.java 中处理对应的命令: SystemProperties.set("ctl.start", name); -> native_set(key, val); 此处key就是ctl.start, value就是 diag_mdlog_start or diag_mdlog_stop
此处在本地尝试
adb shell setprop ctl.start diag_mdlog_start
adb shell setprop ctl.start diag_mdlog_stop也可以抓取 996 log
设置diag_mdlog_start或者diag_mdlog_stop之后会打开或者关闭这个service。
service diag_mdlog_start /vendor/bin/diag_mdlog -q 0x2006 -j 1 -u -c -i -n 50
class late_start
user shell
group system oem_2901 sdcard_rw sdcard_r media_rw
disabled
oneshotservice diag_mdlog_stop /vendor/bin/diag_mdlog -k (k就是kill)
class late_start
user shell
group system oem_2901 sdcard_rw sdcard_r media_rw
disabled
oneshot
service打开就是调用vendor/qcom/proprietary/diag/mdlog/diag_mdlog.c 的main函数
vendor/bin/diag_mdlog 这个bin文件调用了libdiag,其所有的实现都在/vendor/qcom/proprietary/diag/src/中。
vendor/qcom/proprietary/diag/src/diag_lsm_qdss.c
diag_mdlog.c 的main函数 会打开很多线程,每个线程都是死循环。
qdss_read_thread_mdm 这个线程一直取数据,一直从设备节点 /dev/mhi_qdss 取数据,然后写到buffer中。
qdss_write_thread_mdm 这个线程一直写数据,一直从buffer取出去,调用write_to_qdss_file_mdm写入数据。
/dev/mhi_qdss 这个设备节点在kernel里面会写入数据。
总结:
综上,抓取996 log其实就是用户在电话中输入暗码,电话匹配到暗码后发广播。Catch log app收到广播设置prop,prop通过JNI设置到native中。native拿到prop之后就会打开diag_mdlog service,这个service打开时创建了好几个线程,其中一个线程就会循环从dev/mhi_qdss设备节点取数据,另一个线程把数据读出并存进文件中。kenerl中会循环把音频数据写入设备节点dev/mhi_qdss中。