【平台开发】如何有效的收集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能够快速的定位问题。
如果有更好的方案还请留言探讨。