mPaaS最佳实践之《Android Native crash处理》

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
mPaaS订阅基础套餐,标准版 3个月
简介: 目前 mPaas Android是使用的是Crash SDK对闪退进行的处理,CrashSDK 是 Android 平台上一款功能强大的崩溃日志收集 SDK,有着极高的崩溃收集率和完整、全面的崩溃日志信息,生成的日志内容非常利于问题的跟进和解决。在我们的日常运维中,经常遇到一些闪退,无法直接从闪退堆栈看到原因,尤其是一些非Java的Native的闪退,这里分享下在mPaas框架下怎么使用Crash SDK对闪退进行分析。

一 背景

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

二 闪退报文分析工具介绍

对于mPaas的用户,从MAS上闪退分析平台导出的一般是原始的闪退信息,闪退信息比较多,如果直接阅读会比较困难,使用者可以通过下载Chrome的插件LogAnalyzerLogAnalyzer会将Crash SDK生成的日志文本内容转化成可视效果较强的 HTML 页面展现,功能还是很强大的,主要包含:

1. 高亮显示日志中重点信息,并使用不同颜色区分;

2. 支持日志内容整体结构预览,快速定位重点内容;

3. 常见崩溃原因提醒;

安装好chrome插件后,还需要做以下配置

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

由于MAS上默认下载的文件后缀是.dat,需要改为.txt,否则 LogAnalyzer 会不识别

2. 修改插件配置

由于 Chrome 默认权限限制,任何 Chrome 插件默认都不能访问文件网址,需要在 Chrome 插件中进行如下操作。

  1. 打开 Chrome 插件管理页面 chrome://extensions/
  2. 找到 LogAnalyzer 插件,点击 “详细信息" 进入设置:

  1. 找到允许访问文件网址选项,并勾选:
  2. 打开或者刷新日志页面,LogAnalyzer 就生效了。

3. 生效效果

把日志文件直接拖到chrome后,可以看到右边插件生效后,可以通过不同颜色显示闪退信息的各个字段

首次打开后的使用说明如下:

正常查看闪退截图如下:

三 闪退分析举例

我们经常在日常运维中遇到一些非Java的Native模块闪退,比如UC。这种时候很多时候只能去联系UC团队进行支撑,其实很多场景下,闪退的根因并不是UC,只是最后的闪退点在UC。以我最近日常运维中比较常遇到的UC内核的闪退为例,对一些案例的处理分享如下。

1. java空指针导致UC闪退

我们在闪退点上可以看到以下闪退(已经隐藏客户apk相关信息),如果只是从这看我们暂时没有任何线索,我们继续往下看日志

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

从上面的案例我们可以看出,

  1. Native的闪退不一定是Native模块的原因导致的,有可能是由于java导致的异常,从而导致Native闪退
  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的问题。

四 总结

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

目录
相关文章
|
2月前
|
移动开发 监控 Android开发
Android & iOS 使用 ARMS 用户体验监控(RUM)的最佳实践
本文主要介绍了 ARMS 用户体验监控的基本功能特性,并介绍了在几种常见场景下的最佳实践。
|
7月前
|
存储 移动开发 数据库
构建高效Android应用:探究LiveData和ViewModel的最佳实践
【4月更文挑战第20天】 在动态演化的移动开发领域,构建一个既响应迅速又能够在用户界面保持稳定的Android应用是至关重要的。近年来,随着Android架构组件的推出,特别是LiveData和ViewModel的引入,开发者得以更有效地管理应用状态并优化用户界面的响应性。本文将深入探讨LiveData和ViewModel的实现机制,并通过案例分析展示如何结合它们来构建一个高效且健壮的Android应用架构。我们将重点讨论如何通过这些组件简化数据绑定过程、提高代码的可维护性和测试性,同时确保用户界面的流畅性。
|
6月前
|
XML API 网络安全
【安卓】在安卓中使用HTTP协议的最佳实践
【安卓】在安卓中使用HTTP协议的最佳实践
122 4
|
6月前
|
设计模式 安全 前端开发
探索Android应用开发的最佳实践
【6月更文挑战第19天】在这篇文章中,我们将深入探讨Android应用开发的最佳实践。从设计模式的选择到性能优化的技巧,我们将一一解析如何构建高效、可维护且用户友好的Android应用。无论你是新手还是经验丰富的开发者,这篇文章都将为你提供有价值的见解和实用的建议。让我们一起探索Android应用开发的奥秘吧!
75 4
|
6月前
|
安全 开发工具 Android开发
探索Android应用开发的最佳实践
在这篇文章中,我们将深入探讨开发高效、稳定且用户友好的Android应用所需的关键实践。通过分析最新的开发工具和技术,本文旨在为开发者提供实用的建议和策略,以提升他们的应用性能和用户体验。
|
6月前
|
JavaScript 前端开发 Android开发
kotlin安卓在Jetpack Compose 框架下使用webview , 网页中的JavaScript代码如何与native交互
在Jetpack Compose中使用Kotlin创建Webview组件,设置JavaScript交互:`@Composable`函数`ComposableWebView`加载网页并启用JavaScript。通过`addJavascriptInterface`添加`WebAppInterface`类,允许JavaScript调用Android方法如播放音频。当页面加载完成时,执行`onWebViewReady`回调。
|
5月前
|
Dart Android开发 Windows
Flutter和Native 通信 android端
Flutter和Native 通信 android端
|
7月前
|
安全 Android开发 数据安全/隐私保护
Android中的动态权限请求与最佳实践
【4月更文挑战第14天】 在现代安卓应用开发中,用户隐私和安全被赋予了前所未有的重要性。随着Android 6.0(API级别23)引入的运行时权限模型,开发者必须更加细致地处理权限请求,以确保应用功能的完整性同时不侵犯用户的隐私。本文将深入探讨如何在Android应用中实现动态权限请求,分析常见问题,并提供一系列最佳实践,以帮助开发者优雅地处理这一挑战。
430 5
|
7月前
|
数据库 Android开发 开发者
实现高效安卓应用:探究LiveData和ViewModel的最佳实践
【4月更文挑战第19天】 在构建响应式的Android应用程序时,LiveData和ViewModel是两个核心组件。它们不仅提供了数据持有和界面更新的机制,还促进了组件间的解耦。本文将深入探讨如何通过结合LiveData和ViewModel来优化应用架构,提升用户体验,并确保数据的一致性和生存期管理。我们将透过实际案例分析,揭示这些技术如何协同工作以应对复杂的UI场景,并展示如何在实际项目中实施这些最佳实践。
|
7月前
|
移动开发 调度 Android开发
构建高效Android应用:探究Kotlin协程的最佳实践
在移动开发领域,性能优化和资源管理是至关重要的。特别是对于Android开发者来说,合理利用Kotlin协程可以大幅提升应用的响应性和用户体验。本文将深入探讨Kotlin协程的核心概念、优势以及它们在Android项目中的实际应用。我们还将通过代码示例来揭示如何有效地使用协程进行后台任务处理,避免阻塞UI线程,并确保内存的有效管理。文章的目标是为读者提供一套实用的指南,帮助他们在Android开发中充分利用Kotlin协程的强大功能。
85 1
下一篇
无影云桌面