android反馈Crash报告

2024-06-24 04:18
文章标签 android 报告 反馈 crash

本文主要是介绍android反馈Crash报告,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

此文章转载他人,担有所改动,,在全局获取异常有所改动


为什么需要反馈Crash报告?

 

做Android应用程序,要尽量避免程序Crash的发生。虽然说零Crash是程序员追逐的最终目标,但是现实的情况是,程序员只能尽量的减少Crash的发生,而几乎不可能完全杜绝Crash。也许,你认为你的应用的健壮性已经近乎完美,轻松的经受住了测试部门魔鬼般的考验,但是当你的应用发布到市场,面对百万甚至千万级别的用户的时候,可能就没有那么幸运了。

基于以上原因,一般的应用程序,都要有一个Crash反馈的机制。程序员可以根据反馈的结果,对当前的版本的代码进行改进,使发布的下一个版本更加稳定。

 

如何反馈?

 

先来看如何捕获Crash的发生。

 

Java中有一个接口,UncaughtExceptionHandler,先看描述。

static interface

Thread.UncaughtExceptionHandler 
          当 Thread 因未捕获的异常而突然终止时,调用处理程序的接口。

 

再来看Thread类中的一个方法。

static void

setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh) 
          设置当线程由于未捕获到异常而突然终止,并且没有为该线程定义其他处理程序时所调用的默认处理程序。

 

看了这些API,就知道我们需要实现这样一个接口,然后在程序的主线程中设置处理程序。

 

看下面的接口实现。

 

  1. package com.arui.framework.android.exception;  
  2.   
  3.    
  4.   
  5. import java.lang.Thread.UncaughtExceptionHandler;  
  6.   
  7. import android.content.Context;  
  8.   
  9.    
  10.   
  11. /** 
  12.  
  13.  * Default exception handler for all activities. 
  14.  
  15.  *  
  16.  
  17.  * @author http://blog.csdn.net/arui319 
  18.  
  19.  * @version 2011/12/01 
  20.  
  21.  *  
  22.  
  23.  */  
  24.   
  25. public class DefaultExceptionHandler implements UncaughtExceptionHandler {  
  26.   
  27.    
  28.   
  29.     private Context act = null;  
  30.   
  31.    
  32.   
  33.     public DefaultExceptionHandler(Context act) {  
  34.   
  35.        this.act = act;  
  36.        
  37.        //把系统错误改成自己的
           Thread.setDefaultUncaughtExceptionHandler(this);
  38.   
  39.     }  
  40.   
  41.    
  42.   
  43.     @Override  
  44.   
  45.     public void uncaughtException(Thread thread, Throwable ex) {  
  46.   
  47.    
  48.   
  49.        // 收集异常信息 并且发送到服务器  
  50.   
  51.        sendCrashReport(ex);  
  52.   
  53.    
  54.   
  55.        // 等待半秒  
  56.   
  57.        try {  
  58.   
  59.            Thread.sleep(500);  
  60.   
  61.        } catch (InterruptedException e) {  
  62.   
  63.            //  
  64.   
  65.        }  
  66.   
  67.          
  68.   
  69.        // 处理异常  
  70.   
  71.        handleException();  
  72.   
  73.    
  74.   
  75.     }  
  76.   
  77.    
  78.   
  79.     private void sendCrashReport(Throwable ex) {  
  80.   
  81.    
  82.   
  83.        StringBuffer exceptionStr = new StringBuffer();  
  84.   
  85.        exceptionStr.append(ex.getMessage());  
  86.   
  87.    
  88.   
  89.        StackTraceElement[] elements = ex.getStackTrace();  
  90.   
  91.        for (int i = 0; i < elements.length; i++) {  
  92.   
  93.            exceptionStr.append(elements[i].toString());  
  94.   
  95.        }  
  96.   
  97.    
  98.   
  99.        //TODO   
  100.   
  101.        //发送收集到的Crash信息到服务器  
  102.   
  103.     }  
  104.   
  105.    
  106.   
  107.     private void handleException() {  
  108.   
  109.        //TODO   
  110.   
  111.        //这里可以对异常进行处理。  
  112.   
  113.        //比如提示用户程序崩溃了。  
  114.   
  115.        //比如记录重要的信息,尝试恢复现场。  
  116.   
  117.        //或者干脆记录重要的信息后,直接杀死程序。  
  118.   
  119.     }  
  120.   
  121.    
  122.   
  123. }  


 

 

在主Activity的onCreate(Bundle savedInstanceState)方法中增加如下代码。

 

  1. Thread.setDefaultUncaughtExceptionHandler(new DefaultExceptionHandler(  
  2.   
  3.        this.getApplicationContext()));  


 改动

/**
* 新建一个类是在AndroidManifest里面调用的
*/
public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        MyCrashHandler.getInstance().init(this);
    }
}
//AndroidManifest
<application android:label="@string/app_name"
                 android:name=".MyApplication"
android:icon="@drawable/ic_launcher">


 

如何发送到服务器?

 

这个不同的项目组会有不同的方式,具体不在这里讨论了。需要提醒的是,除了把异常的具体信息发送给服务器外,至少还需要发送版本信息,这样程序员才可以判断服务器上的异常信息是哪个版本出现的。除了版本信息,可能还需要手机的SDK版本,屏幕分辨率,手机型号等等信息,有了这些信息,可以更全面的了解异常信息。

 

更多说明。

 

只需要在主Activity中设置一次异常处理类即可,不需要在所有的Acitivity都进行设置。

 

个人感觉Crash发生后,恢复现场继续运行的意义不大。Crash以后,程序的运行情况已经是不可预知的了,用一个错误,去弥补另外一个错误,本身就会导致更多的错误。建议还是尽量避免Crash的发生更合理。

 

---------------------------------------------------------------------------

GL(arui319)

http://blog.csdn.net/arui319

<本文可以转载,但是请保留以上作者信息。谢谢。>

---------------------------------------------------------------------------

这篇关于android反馈Crash报告的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1089143

相关文章

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

Android NDK版本迭代与FFmpeg交叉编译完全指南

《AndroidNDK版本迭代与FFmpeg交叉编译完全指南》在Android开发中,使用NDK进行原生代码开发是一项常见需求,特别是当我们需要集成FFmpeg这样的多媒体处理库时,本文将深入分析A... 目录一、android NDK版本迭代分界线二、FFmpeg交叉编译关键注意事项三、完整编译脚本示例四

Android与iOS设备MAC地址生成原理及Java实现详解

《Android与iOS设备MAC地址生成原理及Java实现详解》在无线网络通信中,MAC(MediaAccessControl)地址是设备的唯一网络标识符,本文主要介绍了Android与iOS设备M... 目录引言1. MAC地址基础1.1 MAC地址的组成1.2 MAC地址的分类2. android与I

Android 实现一个隐私弹窗功能

《Android实现一个隐私弹窗功能》:本文主要介绍Android实现一个隐私弹窗功能,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 效果图如下:1. 设置同意、退出、点击用户协议、点击隐私协议的函数参数2. 《用户协议》、《隐私政策》设置成可点击的,且颜色要区分出来res/l

Android实现一键录屏功能(附源码)

《Android实现一键录屏功能(附源码)》在Android5.0及以上版本,系统提供了MediaProjectionAPI,允许应用在用户授权下录制屏幕内容并输出到视频文件,所以本文将基于此实现一个... 目录一、项目介绍二、相关技术与原理三、系统权限与用户授权四、项目架构与流程五、环境配置与依赖六、完整

Android 12解决push framework.jar无法开机的方法小结

《Android12解决pushframework.jar无法开机的方法小结》:本文主要介绍在Android12中解决pushframework.jar无法开机的方法,包括编译指令、框架层和s... 目录1. android 编译指令1.1 framework层的编译指令1.2 替换framework.ja

Android开发环境配置避坑指南

《Android开发环境配置避坑指南》本文主要介绍了Android开发环境配置过程中遇到的问题及解决方案,包括VPN注意事项、工具版本统一、Gerrit邮箱配置、Git拉取和提交代码、MergevsR... 目录网络环境:VPN 注意事项工具版本统一:android Studio & JDKGerrit的邮

Android实现定时任务的几种方式汇总(附源码)

《Android实现定时任务的几种方式汇总(附源码)》在Android应用中,定时任务(ScheduledTask)的需求几乎无处不在:从定时刷新数据、定时备份、定时推送通知,到夜间静默下载、循环执行... 目录一、项目介绍1. 背景与意义二、相关基础知识与系统约束三、方案一:Handler.postDel

Android使用ImageView.ScaleType实现图片的缩放与裁剪功能

《Android使用ImageView.ScaleType实现图片的缩放与裁剪功能》ImageView是最常用的控件之一,它用于展示各种类型的图片,为了能够根据需求调整图片的显示效果,Android提... 目录什么是 ImageView.ScaleType?FIT_XYFIT_STARTFIT_CENTE

Android实现在线预览office文档的示例详解

《Android实现在线预览office文档的示例详解》在移动端展示在线Office文档(如Word、Excel、PPT)是一项常见需求,这篇文章为大家重点介绍了两种方案的实现方法,希望对大家有一定的... 目录一、项目概述二、相关技术知识三、实现思路3.1 方案一:WebView + Office Onl