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

来自:开发者说

在产品的研发测试以及投放给用户使用的过程中,我们会遇到各种各样的问题,为了有效的分析解决问题,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能够快速的定位问题。

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

推荐↓↓↓
安卓开发
上一篇:Android事件分发机制详解与实战剖析,一张事件分发流程图,让你彻底搞明白 下一篇:Android Studio 升级到3.4后的两个小坑