热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

Android实现自定义Crashhandler记录崩溃信息实例代码

这篇文章主要给大家介绍了Android实现自定义Crashhandler记录崩溃信息的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。

前言

在使用自己开发的android应用时,偶尔会出现 系统已停止运行 错误.这时候如果能记录错误日志,是非常有帮助的。

App异常崩溃信息存入文件中。

应用崩溃时,尽可能的收集多的数据,方便后续定位追踪修改。

如果可以,尽量将崩溃日志上传到服务器。一些集成服务已经提供了相应的功能。

主要使用的方法是Thread.UncaughtExceptionHandler

方法如下

一般在application中启动CrashHandler,个人认为应该放在调用其他模块前尽早启动。

CrashHandler.java

import android.os.Build;
import android.os.Environment;
import android.os.Process;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class CrashHandler implements Thread.UncaughtExceptionHandler {
 private static final String TAG = "CrashHandler";
 private static final boolean DEBUG = true;
 // 自定义存储的目录
 private static final String PATH = Environment.getExternalStorageDirectory().getPath() + "/myApp/log/";
 private static final String FILE_NAME = "crash";
 private static final String FILE_NAME_SUFFIX = ".txt";
 private String phoneInfo;
 private static CrashHandler instance = new CrashHandler();
 private Thread.UncaughtExceptionHandler mDefaultCrashHandler;

 private CrashHandler() {
 }

 public static CrashHandler getInstance() {
  return instance;
 }

 public void init() {
  mDefaultCrashHandler = Thread.getDefaultUncaughtExceptionHandler();
  Thread.setDefaultUncaughtExceptionHandler(this);
  phOneInfo= getPhoneInformation();
 }

 /**
  * 这个是最关键的函数,当程序中有未被捕获的异常,系统将会自动调用uncaughtException方法
  * thread为出现未捕获异常的线程,ex为未捕获的异常,有了这个ex,我们就可以得到异常信息
  */
 @Override
 public void uncaughtException(Thread thread, Throwable ex) {
  try {
   //导出异常信息到SD卡中
   dumpExceptionToSDCard(ex);
   //这里可以上传异常信息到服务器,便于开发人员分析日志从而解决bug
   uploadExceptionToServer();
  } catch (IOException e) {
   e.printStackTrace();
  }
  ex.printStackTrace();
  //如果系统提供默认的异常处理器,则交给系统去结束程序,否则就由自己结束自己
  if (mDefaultCrashHandler != null) {
   mDefaultCrashHandler.uncaughtException(thread, ex);
  } else {
   try {
    Thread.sleep(2000); // 延迟2秒杀进程
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
   android.os.Process.killProcess(Process.myPid());
  }
 }

 private void dumpExceptionToSDCard(Throwable ex) throws IOException {
  //如果SD卡不存在或无法使用,则无法把异常信息写入SD卡
  if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
   if (DEBUG) {
    Log.e(TAG, "sdcard unmounted,skip dump exception");
    return;
   }
  }
  File dir = new File(PATH);
  if (!dir.exists()) {
   dir.mkdirs();
  }
  long current = System.currentTimeMillis();
  String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA).format(new Date(current));
  File file = new File(PATH + FILE_NAME + time + FILE_NAME_SUFFIX);
  try {
   PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file)));
   pw.println(time);
   pw.println(phoneInfo);
   pw.println();
   ex.printStackTrace(pw);
   pw.close();
   Log.e(TAG, "dump crash info seccess");
  } catch (Exception e) {
   Log.e(TAG, e.getMessage());
   Log.e(TAG, "dump crash info failed");
  }
 }

 private void uploadExceptionToServer() {
  // 将异常信息发送到服务器
 }

 private String getPhoneInformation() {
  StringBuilder sb = new StringBuilder();
  sb.append("App version name:")
    .append(BuildConfig.VERSION_NAME)
    .append(", version code:")
    .append(BuildConfig.VERSION_CODE).append("\n");
  //Android版本号
  sb.append("OS Version: ");
  sb.append(Build.VERSION.RELEASE);
  sb.append("_");
  sb.append(Build.VERSION.SDK_INT).append("\n");
  //手机制造商
  sb.append("Vendor: ");
  sb.append(Build.MANUFACTURER).append("\n");
  //手机型号
  sb.append("Model: ");
  sb.append(Build.MODEL).append("\n");
  //CPU架构
  sb.append("CPU ABI:").append("\n");
  for (String abi : Build.SUPPORTED_ABIS) {
   sb.append(abi).append("\n");
  }
  return sb.toString();
 }
}

使用方式,可在Application中调用初始化方法

@Override
public void onCreate() {
 super.onCreate();
 // init application...
 CrashHandler.getInstance().init();
}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。


推荐阅读
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • Vue 2 中解决页面刷新和按钮跳转导致导航栏样式失效的问题
    本文介绍了如何通过配置路由的 meta 字段,确保 Vue 2 项目中的导航栏在页面刷新或内部按钮跳转时,始终保持正确的 active 样式。具体实现方法包括设置路由的 meta 属性,并在 HTML 模板中动态绑定类名。 ... [详细]
  • 优化联通光猫DNS服务器设置
    本文详细介绍了如何为联通光猫配置DNS服务器地址,以提高网络解析效率和访问体验。通过智能线路解析功能,域名解析可以根据访问者的IP来源和类型进行差异化处理,从而实现更优的网络性能。 ... [详细]
  • Windows服务与数据库交互问题解析
    本文探讨了在Windows 10(64位)环境下开发的Windows服务,旨在定期向本地MS SQL Server (v.11)插入记录。尽管服务已成功安装并运行,但记录并未正确插入。我们将详细分析可能的原因及解决方案。 ... [详细]
  • 探讨如何通过编程技术实现100个并发连接,解决线程创建顺序问题,并提供高效的并发测试方案。 ... [详细]
  • 本周信息安全小组主要进行了CTF竞赛相关技能的学习,包括HTML和CSS的基础知识、逆向工程的初步探索以及整数溢出漏洞的学习。此外,还掌握了Linux命令行操作及互联网工作原理的基本概念。 ... [详细]
  • 本文详细介绍了如何使用PHP检测AJAX请求,通过分析预定义服务器变量来判断请求是否来自XMLHttpRequest。此方法简单实用,适用于各种Web开发场景。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文介绍了如何在具备多个IP地址的FTP服务器环境中,通过动态地址端口复用和地址转换技术优化网络配置。重点讨论了2Mb/s DDN专线连接、Cisco 2611路由器及内部网络地址规划。 ... [详细]
  • 创建第一个 MUI 移动应用项目
    本文将详细介绍如何使用 HBuilder 创建并运行一个基于 MUI 框架的移动应用项目。我们将逐步引导您完成项目的搭建、代码编写以及真机调试,帮助您快速入门移动应用开发。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 梦幻西游挖图奇遇:70级项链意外触发晶清诀,3000W轻松到手
    在梦幻西游中,挖图是一项备受欢迎的活动,无论是小宝图还是高级藏宝图,都吸引了大量玩家参与。通常情况下,小宝图的数量保证了稳定的收益,但特技装备的出现往往能带来意想不到的惊喜。本文讲述了一位玩家通过挖图获得70级晶清项链的故事,最终实现了3000W的游戏币逆袭。 ... [详细]
  • 本文探讨了 RESTful API 和传统接口之间的关键差异,解释了为什么 RESTful API 在设计和实现上具有独特的优势。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 如何配置Unturned服务器及其消息设置
    本文详细介绍了Unturned服务器的配置方法和消息设置技巧,帮助用户了解并优化服务器管理。同时,提供了关于云服务资源操作记录、远程登录设置以及文件传输的相关补充信息。 ... [详细]
author-avatar
银杰声群当_993
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有