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

相关文章

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

Android 10.0 mtk平板camera2横屏预览旋转90度横屏拍照图片旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,拍照保存的图片 依然是竖屏的,所以说同样需要将图片也保存为横屏图标了,所以就需要看下mtk的camera2的相关横屏保存图片功能, 如何实现实现横屏保存图片功能 如图所示: 2.mtk

android应用中res目录说明

Android应用的res目录是一个特殊的项目,该项目里存放了Android应用所用的全部资源,包括图片、字符串、颜色、尺寸、样式等,类似于web开发中的public目录,js、css、image、style。。。。 Android按照约定,将不同的资源放在不同的文件夹中,这样可以方便的让AAPT(即Android Asset Packaging Tool , 在SDK的build-tools目

Android fill_parent、match_parent、wrap_content三者的作用及区别

这三个属性都是用来适应视图的水平或者垂直大小,以视图的内容或尺寸为基础的布局,比精确的指定视图的范围更加方便。 1、fill_parent 设置一个视图的布局为fill_parent将强制性的使视图扩展至它父元素的大小 2、match_parent 和fill_parent一样,从字面上的意思match_parent更贴切一些,于是从2.2开始,两个属性都可以使用,但2.3版本以后的建议使

Android Environment 获取的路径问题

1. 以获取 /System 路径为例 /*** Return root of the "system" partition holding the core Android OS.* Always present and mounted read-only.*/public static @NonNull File getRootDirectory() {return DIR_ANDR