前言:在Android开发app中,想要及时了解线上app的运行情况,须要采集样本日志,也就是常说的log,今天由“懂你行云”授权本公众号独家发布,分享他的《处理崩溃异常和分析日志的两种思路》,懂你行云的blog链接为:http://blog.csdn.net/zhangteng22。下方阅读原文可看他的原文。正文如下:

我们写程序的时候都希望能写出一个没有任何Bug的程序,期望在任何情况下都不会发生程序崩溃。不过理想是丰满的,现实是骨感的。没有一个程序员能保证自己写的程序绝对不会出现异常崩溃。特别是针对用户数达到几十万几百万的程序,当你用户数达到一定数量级后,就算你的程序出现个别异常崩溃情况也不用惊讶。此时及时收集用户的日志成了解决问题的关键。本文从两种方式分析查看日志的方式:

1、在自测阶段或者交给测试部测试阶段出现了:

1,程序异常退出 , uncaused exception
2,程序强制关闭 ,Force Closed (简称FC)
3,程序无响应 , Application No Response (简称ANR) , 顺便,一般主线程超过5秒么有处理就会ANR

将终端的/data/anr/traces.txt文件取出(命令如:adb pull /data/anr/traces.txt C:\)拿到日志文件打开后一看"哇"好长,但是不要害怕log日志虽长,但其实它由三大块儿组成:

1、系统基本信息 ,包括 内存,CPU ,进程队列 ,虚拟内存 , 垃圾回收等信息 。
Heap: 4% free, 66MB/69MB; 164920 objects
Dumping cumulative Gc timings
Total number of allocations 617049
Total bytes allocated 86MB
Free memory 3MB
Free memory until GC 3MB
Free memory until OOME 189MB
Total memory 69MB
Max memory 256MB
Total mutator paused time: 0
Total time waiting for GC to complete: 598.247us

2、时间信息 , 也是我们主要分析的信息 。
----- pid 17845 at 2016-10-19 10:59:32 -----

3、虚拟机信息 , 包括进程的,线程的跟踪信息,这是用来跟踪进程和线程具体点的好地方 。

----- pid 17845 at 2016-10-19 10:59:32 -----
Cmd line: com.XX.XX

从这么多大堆栈里如何分析出关键问题呢:

1,如果是ANR问题 , 则搜索“ANR”关键词 。 快速定位到关键事件信息 。
2,如果是ForceClosed 和其它异常退出信息,则搜索"Fatal" 关键词, 快速定位到关键事件信息 。
3,定位到关键事件信息后 , 如果信息不够明确的,再去搜索应用程序包的虚拟机信息 ,查看具体的进程和线程跟踪的日志,来定位到代码

该方式适合能够及时拿到终端的情况下进行日志分析,那如果是用户的终端该如何及时分析bug日志呢,采用第二种方法如下

2、应用程序出现问题时采用HTTP的方式将日志及时上报到后台进行分析:

看了网上大部分是采用日志收集的第三方jar包来完成的,还有一种是自定义一个自己的CrashHandler实现UncaughtExceptionHandler接口来捕获闪退信息然后上传到自己的服务器。这样的实现方式总觉得如果用户误删了闪退的日志文件那么就会导致无法及时上报闪退日志,也就无从分析隐藏的Bug了,于是采用另一种实现思路,即:在程序发生异常时提醒用户发生了什么样的异常,同时把本次捕获的Exception的字段写入到自己定义的log文件中,然后上报异常字段到自己的异常服务器上,从手机端或者后台都可以看到发生的异常堆栈。日志记录系统不借助与任何第三方jar包。说干就干,

项目目录如下:

关键代码如下:

1、定义IExceptionHandler接口

2、定义ExceptionHandler实现自IExceptionHandler

3、在AndroidManifest.xml里面配置自己的Application:IApplication,并在里面初始化app日志文件目录

4、采用HTTP方式将实时catch的异常发送到异常服务器,并将异常的堆栈信息写入到SDcard中

5、使用方式:在程序里面采用try catch捕获可能会出现的异常的代码块(界面给出提示,程序不闪退),另一种是没有进行try catch应用程序直接闪退


这样友好的提示也给了用户,异常信息也及时上报了。但是该方式也有自己的缺点:大量的try catch会导致代码的效率不高。

详细代码点击下载(http://download.csdn.net/detail/zhangteng22/9666912)

第一时间获得博客更新提醒,以及更多android干货,源码分析,欢迎关注我的微信公众号,扫一扫下方二维码或者长按识别二维码,即可关注。

Android中处理崩溃异常和分析日志的两种思路相关推荐

  1. Android记录日志方式,关于Android中处理崩溃异常和记录日志的另一种实现思路

    我们写程序的时候都希望能写出一个没有任何Bug的程序,期望在任何情况下都不会发生程序崩溃.不过理想是丰满的,现实是骨感的.没有一个程序员能保证自己写的程序绝对不会出现异常崩溃.特别是针对用户数达到几十 ...

  2. Android中处理崩溃异常

    2019独角兽企业重金招聘Python工程师标准>>> 大家都知道,现在安装Android系统的手机版本和设备千差万别,在模拟器上运行良好的程序安装到某款手机上说不定就出现崩溃的现象 ...

  3. Android中处理崩溃异常 (转)

    大家都知道,现在安装Android系统的手机版本和设备千差万别,在模拟器上运行良好的程序安装到某款手机上说不定就出现崩溃的现象,开发者个人不可能购买所有设备逐个调试,所以在程序发布出去之后,如果出现了 ...

  4. Android中处理崩溃异常和记录日志

    转载请注明出处:http://blog.csdn.net/u014608640/article/details/52485340 现在安装Android系统的手机版本和设备千差万别,在模拟器上运行良好 ...

  5. android 中处理崩溃异常并重启程序

    转:http://blog.csdn.net/cym_lmy/article/details/24704089 有时候由于测试不充分或者程序潜在的问题而导致程序异常崩溃,这个是令人无法接受的,在and ...

  6. Android中通过数组资源文件xml与适配器两种方式给ListView列表视图设置数据源

    场景 实现效果如下 注: 博客: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获取编程相关电子书.教程推送与免费下载. 实现 将布局改 ...

  7. Android application捕获崩溃异常

    Java代码 个人笔记: 通用 application 1.收集所有 avtivity 用于彻底退出应用 2.捕获崩溃异常,保存错误日志,并重启应用 public class HKBaseApplic ...

  8. Android中app卡顿原因分析示例

    http://www.cnblogs.com/zhucai/p/weibo-graphics-performance-analyse.html 朱才 专注于Android图形动画 MIUI工程师 博客 ...

  9. android中倒计时控件CountDownTimer分析

    android中倒计时控件CountDownTimer分析1 示例代码 new CountDownTimer(10000, 1000) {public void onTick(long millisU ...

  10. Android 中设置线程优先级的正确方式(2种方法)

    Android 中设置线程优先级的正确方式(2种方法) 在 Android 中,有两种常见的设置线程优先级的方式: 第一种,使用 Thread 类实例的 setPriority 方法,来设置线程优先级 ...

最新文章

  1. debian10 简单的DNS服务器搭建
  2. cpp 条件判断 大于等于_第31p,if条件语句,请满足我的要求
  3. cstring转为long64_CString 与其他数据类型的转换(转)
  4. [vue-cli]vue-cli怎么解决跨域的问题?
  5. 进击的Kubernetes调度系统(一):SchedulingFramework
  6. 二本 计算机专业2017分数线,2017年二本心理学专业大学排名及分数线
  7. unity3d android 后台运行,unity3d发布apk在android虚拟机中运行的详细步骤(unity3d导出android...
  8. mPaSS小程序 路由跳转
  9. 生成CFree 5.0 注册码
  10. ShellCode欺骗的艺术!
  11. 华为方会提供一份CRS(客户需求)和SOW(工作任务书)
  12. Google SketchUp SKP文件转OBJ 专业版注册机
  13. java设置post超时时间_HttpClient 如何设置超时时间
  14. 论文笔记:SubRank: Subgraph Embeddings via a Subgraph Proximity Measure2020PAKDD
  15. 猫咪藏在哪个房间python_盘点:猫咪玩“躲猫猫”喜欢藏的几个地方,这下再也不愁找不到了...
  16. 虚函数 2 之虚函数的定义
  17. win 32 学习笔记(十) 对话框
  18. opencv矩形轮廓顶点的具体位置确定
  19. Kermit文件传输协议
  20. MySQL 去重方法之一

热门文章

  1. linux 执行安装脚本,批量执行Linux安装程序和脚本
  2. java lower_Java TreeSet lower()用法及代码示例
  3. Java集合框架源码解读(4)——WeakHashMap
  4. 论文翻译 | ORB-SLAM3:一个用于视觉、视觉惯性和多地图SLAM系统
  5. 深度学习笔记_基本概念_逆卷积的详细解释ConvTranspose2d(fractionally-strided convolutions)
  6. 数值分析(4)-多项式插值: 埃尔米塔插值法
  7. DB2 亲身实例(GUI界面) 加 笔记和注意事项
  8. vector容器中是否应该放指针?解决方法
  9. 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList
  10. Windows 10 开发日记(二)-- 手势顺序调研