一、 背景
- 1、 bugly针对crash监控做的比较好,但是对anr监控,早期版本监听 /data/anr 目录的变化可以拿到数据,但是现在高版本已经没有权限监听此目录,当前数据非常少,结合历次数据来看对我们解决ANR问题没有任何帮助。
- 2、 当前ANR数据主要来自手机厂商系统监控得到的的Anr Top数据excel,因为他们是在系统层面做了监控,数据准确性相对第三方比较高,但是依赖于手机厂商测试人员提供给我们数据,不是万全之策,因为随时有断供的风险。
二、 目标
要求ANR率在万5之下,我们目前已经到了万10,明确超标了。
三、技术选型
3.1 OPPO系统ANR监控
由于OPPO系统监控ANR数据有比较高的准确性,目前可以想到的技术方案是由OPPO监控平台APM开放ANR数据查询接口数据给阅文,由阅文后台去查询获取。做一个ANR实时数据呈现,通过这个ANR数据帮助我们去监控和解决ANR问题。
目前已知这个方案行不通。OPPO侧有数据安全要求,禁止外部实时查询此数据。
只能是一个版本查一次,或者一周查一次。可以建立一个机制,要求OPPO一周提供一次TOP100的ANR数据excel,协助我们解决ANR问题。
3.2 谷歌官方严苛模式StrictMode预防ANR
严苛模式StrictMode将报告与线程及虚拟机相关的策略违例。一旦检测到策略违例policy violation,你将获得警告,其包含了一个栈trace显示你的应用在何处发生违例。你可以强制用警告代替崩溃crash,也可以仅将警告计入日志让你的应用继续执行。StrictMode是一个十分有用的类,它可以很方便地应用于检查Android应用程序的性能和存在的问题。当开启这个模式后,开发者能很好地检查应用中存在的潜在问题。
现状:当前版本没有开启,此特性可利用起来,在debug版本开启。
3.2 第三方开源ANR监控方案
框架 | xCrash | matrix | BlockCanary | acra | ANR-WatchDog |
---|---|---|---|---|---|
社区热度 2.9K | 9.9K | 6.3K | 5.9K | 2.4k | |
出品方 | 爱奇艺 | 微信 | 个人开发者 | 国外开发者 | 国外开发者 |
维护情况 | 仍在维护 | 仍在维护 | 已无人维护 | 仍在维护 | 已无人维护 |
技术原理 | linux信号捕获 | linux信号捕获+慢函数监控 | handler监控ANR消息打印 | 看门狗监控 | 看门狗监控 |
优点 | 成熟不易裁剪 | 成熟可裁剪 | 可作为补充手段 | 国外成熟 | 兼容性好 |
缺点 | 引入体积过大 | 引入So | 监控原理过时 | 无中文,难定制 | 捕获ANR会有很多疏漏 |
综合分析,matrix的功能成熟可裁剪的特性,并且在微信大规模应用过,而且仍然在维护,决定引入matrix。
3.3 Matrix监控功能,选择性引入Trace Canary
Matrix-android 当前监控范围包括:应用安装包大小,帧率变化,启动耗时,卡顿,慢方法,SQLite 操作优化,文件读写,内存泄漏等等。
- ● APK Checker: 针对 APK 安装包的分析检测工具,根据一系列设定好的规则,检测 APK 是否存在特定的问题,并输出较为详细的检测结果报告,用于分析排查问题以及版本追踪
- ● Resource Canary: 基于 WeakReference 的特性和 https://github.com/square/haha 库开发的 Activity 泄漏和 Bitmap 重复创建检测工具
- ● Trace Canary: 监控ANR、界面流畅性、启动耗时、页面切换耗时、慢函数及卡顿等问题
- ● SQLite Lint: 按官方最佳实践自动化检测 SQLite 语句的使用质量
- ● IO Canary: 检测文件 IO 问题,包括:文件 IO 监控和 Closeable Leak 监控
- ● Battery Canary: 监控 App 活跃线程(待机状态 & 前台 Loop 监控)、ASM 调用 (WakeLock/Alarm/Gps/Wifi/Bluetooth 等传感器)、 后台流量 (Wifi/移动网络)等 Battery Historian 统计 App 耗电的数据
- ● MemGuard 检测堆内存访问越界、使用释放后的内存、重复释放等问题
三、 落地方案
1、在我们服务端开发人力有限的情况下,采用matrix 采集 +严苛模式strickMode监控采集警告+ bugly上报数据+ bugly呈现数据的总体架构。
2、把anr数据,慢函数,打包成异常通过 CrashReport.postCatchedException()上报到bugly的错误, 在数据后台查看错误。
3、由于监控成本会影响到APP运行性能,所以无法在线上进行监控,控制在debug模式下测试阶段下进行,防止影响线上。
其它问题
线上监控加imei监控
安全合规问题
bugly冲突问题
包体积大小问题