一、崩溃检测原理

通过thread.setDefaultUncaughtExceptionHandler(),设置默认异常处理Handler,对未被捕获异常进行处理。

虚拟机会将没有处理的异常交给默认的UncaughtExceptionHandler处理,我们需要做的是将异常上报至服务端处理,APP端按照原本的逻辑走下去。
代码很简单:

/**
* 系统默认的handler
*/
Thread.UncaughtExceptionHandler mDefaultHandler;
mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {@Overridepublic void uncaughtException(Thread t, Throwable e) {handleException(thread, ex);//收集数据上报之后交给默认的handler处理if (mDefaultHandler != null) {mDefaultHandler.uncaughtException(thread, ex);}}
});

我们在handleException中手机设备的硬件和软件信息将其上报给服务端。

二、ANR检测

方法一:通过向UI线程发送消息判断

Android UI线程是一个通过Looper进行消息循环的过程,UI线程不断的从消息队列中获取消息进行处理,而UI线程不会处理耗时任务,所以向UI线程发送的消息会得到及时处理,如果超过一段时间没有被处理,那说明发生了ANR。

所以实现方案是:
开一个子线程,定时想UI线程发送消息。若没有及时处理,说明主线程没有响应,认为是ANR异常。

@Overridepublic void run() {while (true) {watchDogHandler.sendEmptyMessage(MESSAGE_WATCHDOG_TIME_TICK);try {Thread.sleep(ACTIVITY_ANR_TIMEOUT);} catch (InterruptedException e) {e.printStackTrace();}//如果相等,说明过了ACTIVITY_ANR_TIMEOUT的时间后watchDogHandler仍没有处理消息,已经ANR了if (timeTick == lastTimeTick) {//todo 上报ANR异常} else {lastTimeTick = timeTick;}}}private class WatchDogHandler extends Handler {@Overridepublic void handleMessage(Message msg) {timeTick++;timeTick = timeTick % Integer.MAX_VALUE;LogUtil.i("timeTick = " + timeTick);LogUtil.i("lastTimeTick = " + lastTimeTick);}}

方法二:通过监控主线程处理消息的时长判断

通过查看Looper源码知道,里面有一段很关键的代码如下:

public static void loop() {...for (;;) {...if (logging != null) {logging.println(">>>>> Dispatching to " + msg.target + " " +msg.callback + ": " + msg.what);}...msg.target.dispatchMessage(msg);...if (logging != null) {logging.println("<<<<< Finished to " + msg.target + " " + msg.callback);}...}...}}

从上面这段代码可以看出,loop方法在处理每一个消息前后都会打印相关的日志,那么我们可以设置自定义的logging来判断每次处理消息的耗时。

Looper.getMainLooper().setMessageLogging(new Printer() {@Overridepublic void println(String x) {//通过计算两次打印日志的时间来判断处理消息的时间是否过长,从而认为是ANR。}
});

Android客户端异常检测相关推荐

  1. android 入侵检测系统,面向Android智能手机异常入侵检测的在线学习算法.DOC

    面向Android智能手机异常入侵检测的在线学习算法 页码 计算机应用研究 第28卷收稿日期:2014-00-00:修回日期: 基金项目:基金项目1全称(基金项目号):基金项目2全称(基金项目号):作 ...

  2. 微信Android客户端的ANR监控方案

    微信Android客户端的ANR监控方案 微信公众号,WeMobileDev 2021年7月19日发布的 微信Android客户端的ANR监控方案 该方案的所有代码已经在Matrix(https:// ...

  3. Android客户端性能优化(魅族资深工程师毫无保留奉献)

    Android客户端性能优化(魅族资深工程师毫无保留奉献) 转载学习:http://blog.tingyun.com/web/article/detail/155?from=groupmessage& ...

  4. Android基础性能检测与分析

    本文内容:基于Android基础性能检测与分析 版权声明:本文为原创文章,未经允许不得转载 博客地址:http://blog.csdn.net/kevindgk 前言 UI性能分析 应用启动时间计算以 ...

  5. 千万级用户的Android客户端是如何养成的

    声明:本文来自「七牛云主办的架构师实践日--亿级移动应用架构最佳实践」的演讲内容整理.PPT.速记和现场演讲视频等参见"七牛架构师实践日"官网. 嘉宾:阿刘,in技术专家. 责编: ...

  6. 利用Kafka和Cassandra构建实时异常检测实验

    导言 异常检测是一种跨行业的方法,用于发现事件流中的异常事件 - 它适用于物联网传感器,财务欺诈检测,安全性,威胁检测,数字广告欺诈以及许多其他应用程序.此类系统检查流数据以检查异常或不规则,并在检测 ...

  7. 接入新浪、腾讯微博和人人网的Android客户端实例 接入新浪、腾讯微博和人人网的Android客户端实例...

    做了个Android项目,需要接入新浪微博,实现时也顺带着研究了下腾讯微博和人人网的Android客户端接入,本文就跟大家分享下三者的Android客户端接入方法. 一.实例概述 说白了,接入微博就是 ...

  8. JavaScript之如何对客户端进行检测

    本文主要是针对各种客户端进行检测,使用了用户代理字符串检测技术,具体代码如下: var client=function() {var engine= {// 呈现引擎ie: 0, gecko: 0, ...

  9. 勤于思考:从客户端中检测到有潜在危险的 Request.Form 值

    在提交表单时候,asp.net 提示:"从客户端(......)中检测到有潜在危险的 Request.Form 值" . asp.net中的请求验证特性提供了某一等级的保护措施防止 ...

最新文章

  1. 解读2016全球ICT 50强榜单:谁动了传统通信产业的奶酪?
  2. jQuery 核心 - noConflict() 方法,jQuery 文档操作 - detach() 方法
  3. python multiprocessing manager list error: [Errno 2] No such file or directory
  4. 【HoorayOS】开源的Web桌面应用框架(第二版 v120311)
  5. 使用java spring开发ckeditor的文件上传功能(转)
  6. 备库设置read_only被阻塞
  7. .NET或.NET Core Web APi基于tus协议实现断点续传
  8. 计算机网络应用押韵句,现代汉语练习题
  9. 解决报错OMP: Error #15: Initializing libiomp5.dylib, but found libomp.dylib already initialized
  10. 紫鸟超级浏览器-SeleniumAPI通信
  11. 明白熊猫与冰墩墩的区别,就知道青云KubeSphere与QKCP该如何选择
  12. 杜威分类法_设计机器人:从都会到休伊,杜威和路易
  13. [Java反序列化]—SnakeYaml反序列化
  14. 网页功能升华必备播放器
  15. 3D Tiles规格1.0 中文版
  16. 钝化程序模式SOA架构BPM
  17. 工作流相关讲解 转载
  18. 分享申请IDP账号的过程,包含duns申请的分享
  19. 【mq】从零开始实现 mq-09-消费者拉取消息 pull message
  20. 求解输入参数的立方根

热门文章

  1. 心流:写作、编程和修炼武功的共同法门
  2. 怎么mac ftp服务器文件夹,mac 访问 ftp服务器文件夹权限
  3. Cesium中gltf模型的坐标系
  4. 4.pycharm(免费专业版)下载与安装与环境配置
  5. cad标注样式快捷键_制图大神最常用的六大类CAD快捷命令,学会CAD就是这么简单...
  6. Win10配置adb环境
  7. 身份证号码验证(直接调用idCardValidate(String idCard) )
  8. 单身的我写了一个七夕表白程序
  9. CSP开发基础--数字证书调用CSP过程
  10. 字节跳动Go 语言面试会问哪些问题?