目前mPaaSAndroid是使用的是CrashSDK对闪退进行的处理,CrashSDK是Android平台上一款功能强大的崩溃日志收集SDK,有着极高的崩溃收集率和完整、全面的崩溃日志信息,生成的日志内容非常利于问题的跟进和解决。在我们的日常运维中,经常遇到一些闪退,无法直接从闪退堆栈看到原因,尤其是一些非Java的Native的闪退,这里分享下在mPaaS框架下怎么使用CrashSDK对闪退进行分析。
闪退报文分析工具介绍
对于mPaaS的用户,从MAS上闪退分析平台导出的一般是原始的闪退信息,闪退信息比较多,如果直接阅读会比较困难,使用者可以通过下载Chrome的插件LogAnalyzer。
LogAnalyzer会将CrashSDK生成的日志文本内容转化成可视效果较强的HTML页面展现,功能还是很强大的,主要包含:
高亮显示日志中重点信息,并使用不同颜色区分;支持日志内容整体结构预览,快速定位重点内容;常见崩溃原因提醒;安装好Chrome插件后,还需要做以下配置
1.修改闪退文件后缀为.txt
由于MAS上默认下载的文件后缀是.dat,需要改为.txt,否则LogAnalyzer会不识别。
2.修改插件配置
由于Chrome默认权限限制,任何Chrome插件默认都不能访问文件网址,需要在Chrome插件中进行如下操作。
1.打开Chrome插件管理页面chrome://extensions/
2.找到LogAnalyzer插件,点击“详细信息进入设置:
3.找到允许访问文件网址选项,并勾选;
4.打开或者刷新日志页面,LogAnalyzer就生效了。
3.生效效果
把日志文件直接拖到Chrome后,可以看到右边插件生效后,可以通过不同颜色显示闪退信息的各个字段。
首次打开后的使用说明如下:
正常查看闪退截图如下:
闪退分析举例
我们经常在日常运维中遇到一些非Java的Native模块闪退,比如UC。这种时候很多时候只能去联系UC团队进行支撑,其实很多场景下,闪退的根因并不是UC,只是最后的闪退点在UC。
以最近日常运维中比较常遇到的UC内核的闪退为例,对一些案例的处理分享如下。
1.Java空指针导致UC闪退
我们在闪退点上可以看到以下闪退(已经隐藏客户apk相关信息),如果只是从这看我们暂时没有任何线索,我们继续往下看日志:
当看到logcat节点信息的时候,我们发现了线索,首先我们看到关键字:begintogeneratenativereport,表示当前是闪退日志上报的日志,我们再往前看,logcat节点里打印了异常堆栈信息。
从堆栈信息可以看到,是由于precreate操作触发了底层的空指针,从而导致初始化异常,最后触发了闪退。解决方案就是临时关闭预创建,从而规避了闪退。
从上面的案例我们可以看出:
Native的闪退不一定是Native模块的原因导致的,有可能是由于Java导致的异常,从而导致Native闪退;begintogeneratenativereport附近可以看闪退相关的logcat信息,协助定位闪退的一些上下文日志。
2.上层OOM导致UC闪退
首先我们看上报的闪退点的日志如下图所示,闪退在了RenderThread里,也是毫无头绪。
我们继续硬着头皮往下看,在logcat节点里查找begintogeneratenativereport上报节点,我们看到了大量的底层OOM的异常日志,基本大概率确定是OOM的原因了。
剩下的就是查找OOM是哪里触发的。
点击闪退里的内存节点,基本原因就比较清晰了,当前手机的Vmsize基本已经到最大了,我们知道对于32位的进程,APP可使用的VmSize最大为3GB,不过当运行在64位CPU上时,VmSize最大可超过3GB,接近4GB。
但是由于内核需要占据一部分,以及不同的ROM版本的差别,我们发现有以下规律:Android8.1.0及之后的系统,大部分nativeoomcrash发生时VmSize分布在3.5-3.9G的位置,相对较为集中。所以下面的案例的解决思路就变成了怎么解决OOM了。
3.FD误关导致UC闪退
上报的日志如下图所示,我们大概只能看出SIGILL有可能是主动崩溃,崩溃ILL_ILLOPC表示非法操作。
然后我们继续看logcat节点的begintogeneratenativereport,基本确认原因是因为UC使用的FD对象被其他程序关闭。
随后UC提供了带FDscan的工具包,通过我们复现后发现,是由于UC调用shouldIntercept回调的输入流对象被其他模块close掉了,导致UC使用的时候发现FD对象已经被关闭,从而做了崩溃处理。最后的处理方案就变成了用户解决其他模块的误关FD的问题。
总结
综合以上的Case分析,在遇到Native模块闪退的时候,一般如果从直接的闪退堆栈看不出原因的时候,不要心急,可以搜索begintogeneratenativereport找到崩溃上下文,多看看logcat闪退上下文的日志,会有一些收获,同时对于oom类型的问题,可以结合当前内存统计来看。
关于mPaaSMAS
MAS移动分析服务:通过多端埋点数据的采集与分析,实现产品核心指标监控。
支持应用稳定性分析,包括闪退监控、异常监控、性能监控及用户诊断功能,帮助开发人员及时发现、定位问题。
帮助企业更好的完成业务监控、用户洞察与行为分析,指导产品迭代,精细化产品运营,辅助营销决策,加速业务商业化。
-END-