公司的车载产品用的是高通平台的芯片和源码。高通平台的源码本身是没有收集log这个功能的。只能在终端通过adb去实时查看。断电后本次的log也随之消失。显然,在出现问题的时候,如果当前机器没有连接在终端,bug对应的log我们也就看不到了。这对于分析问题是非常不利的。而且一般情况下,测试和开发是分离的,测试人员提供bug复现时的log,开发人员根据log分析bug,解决bug。所以:给在Android系统上开发一款Log收集的工具是非常必要的。
架构设计:
第一种:
所有收集log的逻辑,界面操作等都在上层一个App中实现:
优点:简单快速,方便开发。缺点:可能抓不到刚开机时,和时间点很早的log
第二种:
上层和底层协同合作,对时间点要求不高log收集在上层实现(比如获取配置:getprop,系统服务信息:dumpsys)
需要抓取到时间点很早的log在底层实现(比如 logcat,kernel等)
我们可以把App和收集逻辑分离,收集Log逻辑封装为library,作为SDK,提供外部访问接口给App,这样根据SDK提供的framework接口,就可以开发各种UI的App,App用于给用户操作。
框图:
收集log的原理:
在代码中去执行抓取log的adb命令:(上层Java实现,底层C实现)
Java层执行命令:
Process mProcess = Runtime.getRuntime().exec(command);
// 获取到输入流
InputStream inputStream = mProcess.getInputStream();
// 然后从输入流读取,使用输出流写入文件中
command eg:
dumpsys
getprop
logcat -v time -b main -v threadtime -f filePath -n 5 -r 1000
根据上层App传递过来的配置,进行字符串拼接,生成不同的字符串命令,继而抓取相应的log。
总体来说,收集log的功能,不管是在Java层实现,还是C层实现,就是利用各自的语言,根据上层App传递过来的配置参数,拼接字符串命令,再去执行相应的命令即可。