Android开发Android开发经验谈Android开发

【平台开发】如何有效的收集Android日志?

2019-05-21  本文已影响19人  风暴小狼

在产品的研发测试以及投放给用户使用的过程中,我们会遇到各种各样的问题,为了有效的分析解决问题,Log的收集也就至关重要了。

log上传流程

设备出现异常时,提示用户上传log,后端运维人员根据设备ID提取log信息给开发人员进行定位分析,再根据客服提供的用户操作信息以及log将会大大缩减了问题发现到解决的时间,提升了系统迭代的效率,增强了产品的健壮性和生命力。

以Android 8.0为例,由于是log收集,肯定少不了组件logcat,目录位于:system/core/logcat/

我们不是要去分析Logcat的实现,而是要利用logcat(编译烧录板子后位于system/bin目录)进行log收集,由于Android8.0 Selinux的原因,我们无法直接操作system/bin/logcat ,那么该如何解决这个问题?我们有个方法:拷贝一份logcat到vender分区(并进行重命名,比如xxxLogcat),独立于system/bin/logcat 

##通过mk文件,拷贝编译好的logcat到vendor/bin

PRODUCT_COPY_FILES +=device/manufacturer/xxx/etc/logcat:/vendor/bin/xxxlogcat

 再对vender/bin/xxxLogcat进行Selinux的相关权限配置即可。

到目前为止,核心组件logcat的问题已经解决,接下来就是如何让xxxLogcat进行工作,用户通过什么方式开启log?

日志收集子流程

如上子流程图所示,打开日志开关,开启log收集,那么体现在代码中,如何通过“开关”来进行logcat的开启和关闭呢?这里需要借助init.rc(系统第一个启动的init程序解析),在rc文件的定义中有四种类型的定义:Action、Commands、Services、Options,因为我们想用过设置prop的方式来开启和关闭xxxlogcat服务,所以rc是最佳首选。

on property:persist.service.logcat.enable=1 

 start logcat_service

on property:persist.service.logcat.enable=0 

 stop logcat_service

service logcat_service /vendor/bin/xxxlogcat -b system -b events -b main -n 10 -v threadtime -f /data/logger/logcat.log -r 5000       //这里是logcat循环存储,单个log最大5000k,最多存10个

user  root

group log system

class main

disabled  //设置该service开机默认不启动

在UI中通过设置prop "persist.service.logcat.enable"来控制xxxlogcat服务的开启和关闭,待log收集完成后,用户点击上传按钮完成log上传,这里需要注意的是,因为系统里不止有android log,还有data/anr/trace 以及tombstone等关键信息,需要把这些文件一并上传。

这种方案同时也非常适用的测试阶段,特别是在老化试验中,先开启log,在进行老化试验,出现问题时及时取出log能够快速的定位问题。

如果有更好的方案还请留言探讨。

上一篇下一篇

猜你喜欢

热点阅读