简介: Android Native crash 处理案例分享

1. 背景

目前 mPaas[1] Android使用Crash SDK对闪退进行的处理,CrashSDK 是 Android 平台上一款功能强大的崩溃日志收集 SDK,有着极高的崩溃收集率和完整、全面的崩溃日志信息,生成的日志内容非常利于问题的跟进和解决。在日常运维中,经常遇到一些闪退,无法直接从闪退堆栈找到原因,尤其是一些非Java的Native的闪退,这里分享下在mPaas框架下怎么使用Crash SDK分析闪退。

2. 闪退报文分析工具介绍

对于mPaas的用户,从MAS上闪退分析平台导出的一般是原始的闪退信息,闪退信息比较多,如果直接阅读会比较困难,使用者可以通过下载Chrome的插件LogAnalyzer,LogAnalyzer会将Crash SDK生成的日志文本内容转化成可视效果较强的 HTML 页面展现,功能强大,主要包含:
1) 高亮显示日志中重点信息,并使用不同颜色区分;
2) 支持日志内容整体结构预览,快速定位重点内容;
3) 常见崩溃原因提醒;
安装好chrome插件后,仍需以下配置:

1. 修改闪退文件后缀为 .txt

由于MAS默认下载的文件后缀是.dat,需改为.txt,否则 LogAnalyzer 无法识别。

2. 修改插件配置

由于 Chrome 默认权限限制,任何 Chrome 插件均默认无法访问文件网址,需要在 Chrome 插件中进行如下操作。
1) 打开 Chrome 插件管理页面 chrome://extensions/
2) 找到 LogAnalyzer 插件,点击 “详细信息" 进入设置:

3) 勾选“允许访问文件网址”选项
4) 打开或者刷新日志页面,LogAnalyzer 便可生效。

3. 生效效果

把日志文件直接拖到chrome后,可以看到右边插件生效后,可以通过不同颜色显示闪退信息的各个字段
首次打开后的使用说明如下:

正常查看闪退截图如下:

3. 闪退分析举例

我们经常在日常运维中遇到一些非Java的Native模块闪退,比如UC。其实很多场景下,闪退的根因并不是UC,只是最后的闪退点在UC。以日常运维高频的UC内核的闪退为例,对一些案例的处理分享如下。

1. java空指针导致UC闪退

在闪退点上可以看到以下闪退信息(已经隐藏客户apk相关信息),暂无任何线索,继续查看日志。

查看logcat节点信息时,首先看到关键字:begin to generate native report, 表示当前是闪退日志上报的日志,在往前看,logcat节点里打印了异常堆栈信息,从堆栈信息可以看到,由于precreate操作触发了底层的空指针,从而导致初始化异常,触发了闪退。解决方案为临时关闭预创建,从而规避闪退。

从上面的案例可以看出,
1) Native的闪退原因不一定是Native模块,有可能是java异常导致的。
2) begin to generate native report 附近可以查看闪退相关的logcat信息,协助定位闪退的上下文日志。

2. 上层OOM导致UC闪退

首先,查看上报的闪退点的日志,如下图所示,闪退在RenderThread里,毫无头绪。

其次,在logcat节点里查找begin to generate native report上报节点,可以看到大量的底层OOM的异常日志,基本确定是OOM的原因了,继续查找OOM的触发源头。

点击闪退里的内存节点,基本原因就比较清晰了,当前手机的vmsize基本已经到最大了,我们知道对于 32 位的进程,APP 可使用的 VmSize 最大为 3GB,不过当运行在 64 位 CPU 上时,VmSize 最大可超过 3GB,接近 4GB。但是由于内核需要占据一部分,以及不同的ROM版本的差别,有以下规律:android 8.1.0 及之后的系统,大部分 native oom crash 发生时 vmSize 分布在 3.5 - 3.9 G 的位置,相对较为集中。下面讲解下如何解决OOM。

3. FD误关导致UC闪退

日志如下图所示,我大概只能看出SIGILL有可能是主动崩溃,崩溃ILL_ILLOPC表示非法操作。

然后我们继续看logcat节点的begin to generate native report, 基本确认原因是为uc使用的FD对象被其他程序关闭。

随后UC提供了带FDscan的工具包,通过我们复现后发现,是由于UC调用shouldIntercept回调的输入流对象被其他模块close掉了,导致UC使用的时候发现FD对象已经被关闭,从而做了崩溃处理。最后的处理方案就变成了用户解决其他模块的误关FD的问题。

4. 总结

综合以上的case分析,在遇到Native模块闪退的时候,一般如果从直接的闪退堆栈看不出原因的时候,不要心急,可以搜索begin to generate native report 找到崩溃上下文,多看看logcat闪退上下文的日志,会有一些收获,同时对于oom类型的问题,可以结合当前内存统计来看。

作者:荣阳

原文链接

本文为阿里云原创内容,未经允许不得转载

Android Native crash 处理案例分享的更多相关文章

  1. Android Native crash日志分析

    在Android应用crash的类型中,native类型crash应该是比较难的一种了,因为大家接触的少,然后相对也要多转几道工序,所有大部分对这个都比较生疏.虽然相关文章也有很多了,但是我在刚开始学 ...

  2. 字节Android Native Crash治理之Memory Corruption工具原理与实践

    作者:字节跳动终端技术--庞翔宇 内容摘要 ​ MemCorruption工具是字节跳动AppHealth (Client Infrastructure - AppHealth) 团队开发的一款用于定 ...

  3. android native crash 分析

    工具: addr2line arm-linux-androideabi-addr2line -aCfe libart.so 0x63006d 当libart.so包含符号表的情况下,可以查询到他的地址 ...

  4. 性能调优案例分享:jvm crash的原因 1

    性能调优案例分享:jvm crash的原因   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq: ...

  5. Android Native App自动化测试实战讲解(上)(基于python)

    1.Native App自动化测试及Appuim框架介绍 android平台提供了一个基于java语言的测试框架uiautomator,它一个测试的Java库,包含了创建UI测试的各种API和执行自动 ...

  6. NDK开发历程(一):android native code的调试方法

    引用:http://www.cnblogs.com/ychellboy/archive/2013/02/22/2922683.html 使用NDK在android上做开发是一件“痛并快乐着”的差事,之 ...

  7. 常见Android Native崩溃及错误原因

    http://www.droidsec.cn/%E5%B8%B8%E8%A7%81android-native%E5%B4%A9%E6%BA%83%E5%8F%8A%E9%94%99%E8%AF%AF ...

  8. Android Native App自动化测试实战讲解(下)(基于python)

    6.Appuim自动化测试框架API讲解与案例实践(三) 如图1,可以在主函数里通过TestSuite来指定执行某一个测试用例: 6.1,scroll():如图2 从图3中可以看到当前页面的所有元素r ...

  9. mysql的"双1设置"-数据安全的关键参数(案例分享)

    mysql的"双1验证"指的是innodb_flush_log_at_trx_commit和sync_binlog两个参数设置,这两个是是控制MySQL 磁盘写入策略以及数据安全性 ...

  10. MySQL数据库详解之"双1设置"的数据安全的关键参数案例分享

    mysql的"双1验证"指的是innodb_flush_log_at_trx_commit和sync_binlog两个参数设置,这两个是是控制MySQL 磁盘写入策略以及数据安全性 ...

随机推荐

  1. uniapp使用uview报错Cannot find module ‘@/uni_modules/uview-ui/components

    参考:https://github.com/umicro/uView 记录使用uniapp报的错 注意uview目前只支持vue2 按照教程引入uview,然后执行的时候还是会报Cannot find ...

  2. spring boot2集成api文档工具swagger-ui(上)

    说明 第一步:创建项目 浏览器打开:https://start.spring.io/,生成一个spring boot项目 点击Generate这个按钮,下载项目包文件 第二步:导入开发工具 打开下载目 ...

  3. 记录--@click和@click.native有什么区别,如何阻止第三方组件内部的冒泡

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一.@click和@click.native的区别 vue @click.native 原生点击事件: 1,给vue组件绑定事件时候,必须 ...

  4. 记录--CSS 滚动驱动动画 scroll()

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 CSS 滚动驱动动画 scroll() animation-timeline 通过 scroll() 指定可滚动元素与滚动轴来为容器动画提 ...

  5. APP备案通知

    截至2024年4月1日前,所以已上市APP均需备案,未备案的可以登陆云擎官网进行备案. 关于工信部开展在中华人民共和国境内从事互联网信息服务的APP主办者,应当依法履行备案手续,未履行备案手续的,不得 ...

  6. LOTO示波器选型指南

    LOTO示波器选型指南 LOTO示波器属于虚拟示波器,产品主要基于USB接口的,所以使用LOTO示波器产品需要配备一台Windows电脑或者Android(安卓)智能手机/平板. 针对一些特殊应用的工 ...

  7. 假期做了一项调研:大厂为啥都自研RPC?结果合乎情理!

    大家好,我是冰河~~ 五一假期过的可真快,今天开始,又要搬砖了.在五一假期当中,冰河做了一项调研,感觉结果还是挺合乎情理的. 翻看招聘信息 先来看我在某招聘网站上随便搜索了下Java招聘的岗位,看到的 ...

  8. JDK8 ::用法(双冒号)

    JDK8中有双冒号的用法,就是把方法当做参数传到stream内部,使stream的每个元素都传入到该方法里面执行一下. List<String> lt = Arrays.asList(&q ...

  9. 程序员/后端开发方向Java 跳槽注意事项(简历和面试经验分享)

    程序员/后端开发方向Java 跳槽注意事项(简历和面试经验分享) 应届生面试经验参考:https://www.cnblogs.com/rainbow-1/p/16779048.html 简历: 1.个 ...

  10. 【开源三方库】Easyui:基于OpenAtom OpenHarmony ArkUI深度定制的组件框架

      万冬阳 公司:中国科学院软件所 小组:知识体系工作组 简介 Easyui是一套基于ArkTS语言开发的轻量.可靠的移动端组件库,它是对OpenAtom OpenHarmony(以下简称" ...