写一个工具类,然后直接引用,简单粗暴。

package com.socialsecurity.main.exception;import java.io.File;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.Writer;
import java.lang.Thread.UncaughtExceptionHandler;
import java.lang.reflect.Field;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.Build;
import android.os.Environment;
import android.os.Looper;
import android.util.Log;
import android.widget.Toast;/*** UncaughtException处理类,当程序发生Uncaught异常的时候,有该类来接管程序,并记录发送错误报告.* * @author user* */
public class CrashHandler implements UncaughtExceptionHandler {public static final String TAG = "CrashHandler";// 系统默认的UncaughtException处理类private Thread.UncaughtExceptionHandler mDefaultHandler;// CrashHandler实例private static CrashHandler INSTANCE = new CrashHandler();// 程序的Context对象private Context mContext;// 用来存储设备信息和异常信息private Map<String, String> infos = new HashMap<String, String>();// 用于格式化日期,作为日志文件名的一部分private DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss");/** 保证只有一个CrashHandler实例 */private CrashHandler() {}/** 获取CrashHandler实例 ,单例模式 */public static CrashHandler getInstance() {return INSTANCE;}/*** 初始化* * @param context*/public void init(Context context) {mContext = context;// 获取系统默认的UncaughtException处理器mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();// 设置该CrashHandler为程序的默认处理器Thread.setDefaultUncaughtExceptionHandler(this);}/*** 当UncaughtException发生时会转入该函数来处理*/@Overridepublic void uncaughtException(Thread thread, Throwable ex) {if (!handleException(ex) && mDefaultHandler != null) {// 如果用户没有处理则让系统默认的异常处理器来处理
            mDefaultHandler.uncaughtException(thread, ex);} else {try {Thread.sleep(3000);} catch (InterruptedException e) {Log.e(TAG, "error : ", e);}// 退出程序
            android.os.Process.killProcess(android.os.Process.myPid());System.exit(1);}}/*** 自定义错误处理,收集错误信息 发送错误报告等操作均在此完成.* * @param ex* @return true:如果处理了该异常信息;否则返回false.*/private boolean handleException(Throwable ex) {if (ex == null) {return false;}// 使用Toast来显示异常信息new Thread() {@Overridepublic void run() {Looper.prepare();Toast.makeText(mContext, "很抱歉,程序出现异常,即将退出.", Toast.LENGTH_LONG).show();Looper.loop();}}.start();// 收集设备参数信息
        collectDeviceInfo(mContext);// 保存日志文件
        saveCrashInfo2File(ex);return true;}/*** 收集设备参数信息* * @param ctx*/public void collectDeviceInfo(Context ctx) {try {PackageManager pm = ctx.getPackageManager();PackageInfo pi = pm.getPackageInfo(ctx.getPackageName(), PackageManager.GET_ACTIVITIES);if (pi != null) {String versionName = pi.versionName == null ? "null" : pi.versionName;String versionCode = pi.versionCode + "";infos.put("versionName", versionName);infos.put("versionCode", versionCode);}} catch (NameNotFoundException e) {Log.e(TAG, "an error occured when collect package info", e);}Field[] fields = Build.class.getDeclaredFields();for (Field field : fields) {try {field.setAccessible(true);infos.put(field.getName(), field.get(null).toString());Log.d(TAG, field.getName() + " : " + field.get(null));} catch (Exception e) {Log.e(TAG, "an error occured when collect crash info", e);}}}/*** 保存错误信息到文件中* * @param ex* @return 返回文件名称,便于将文件传送到服务器*/private String saveCrashInfo2File(Throwable ex) {StringBuffer sb = new StringBuffer();for (Map.Entry<String, String> entry : infos.entrySet()) {String key = entry.getKey();String value = entry.getValue();sb.append(key + "=" + value + "\n");}Writer writer = new StringWriter();PrintWriter printWriter = new PrintWriter(writer);ex.printStackTrace(printWriter);Throwable cause = ex.getCause();while (cause != null) {cause.printStackTrace(printWriter);cause = cause.getCause();}printWriter.close();String result = writer.toString();sb.append(result);try {long timestamp = System.currentTimeMillis();String time = formatter.format(new Date());String fileName = "crash-" + time + "-" + timestamp + ".log";if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {String path = "/sdcard/jianke/crash/";File dir = new File(path);if (!dir.exists()) {dir.mkdirs();}FileOutputStream fos = new FileOutputStream(path + fileName);fos.write(sb.toString().getBytes());fos.close();}return fileName;} catch (Exception e) {Log.e(TAG, "an error occured while writing file...", e);}return null;}
}

在自己写的application 的onCreate方法里面,加上这句代码。

CrashHandler.getInstance().init(getApplicationContext());  

搞定 !!

转载于:https://www.cnblogs.com/Jackie-zhang/p/8883685.html

android闪退日志收集相关推荐

  1. Android闪退日志关键字,求助,简单UI界面,调试总是闪退,还没有LOG错误日志???...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 折腾了快一天了,还不知道哪里出错了 package com.example.love; import java.text.ParseException; ...

  2. 如何导出iPhone手机中app共享文件夹的文件与闪退日志的收集

    如何导出iPhone手机中app共享文件夹的文件.本文以app中记录的闪退文件日志例子. 现在由于苹果禁止应用收集app的用户信息.所以fir和蒲公英的日志在线收集SDK被苹果禁用,导致它们都下线该类 ...

  3. android 定位 闪退_Unity3D研究院之全方位定位Android闪退(九十三)

    首先强烈建议大家安卓打包一定要用il2cpp,我们项目对比了mono发现il2cpp闪退方面比mono少了很多.平常给QA打包推荐勾选Development Build 和 Autocontent P ...

  4. Android闪退原因

    自学Android开发到现在,发现的几个Android闪退的原因: 1)权限问题,一般是AndroidManifest文件中忘记配置相关权限. 2)在用AS开发Android程序时,涉及到Androi ...

  5. ubuntu中打开出现闪退_Ubuntu查看程序崩溃、系统闪退日志

    前言 本文旨在简单介绍如何查找Ubuntu的程序崩溃.系统闪退日志. MOTIVATION 最近自己的Ubuntu电脑总是在我打字写博客(使用的搜狗输入法)的时候突然整个屏幕就卡住了,鼠标能动,但是用 ...

  6. IOS闪退日志抓取及日志解析(记录更新ing)

    iOS系统如何查看APP的日志 一.XCode连苹果真机查看运行log 方法一:XCode 1 在mac电脑上安装XCode 2 将苹果手机连到mac电脑, 在苹果手机上点击信任 3 打开XCode, ...

  7. android 闪退解决方案,Android apk无法安装及闪退问题解决办法

    Android apk无法安装及闪退问题 app在部分手机上(低版本)打不开或打开就闪退的问题 之前做项目集成的是 环信的sdk ,环信的sdk 确实很好,客服 也很给力.但是在集成的过程中发现,ap ...

  8. 刺激战场android闪退,刺激战场总是闪退怎么办?刺激战场闪退解决办法

    刺激战场总是闪退怎么办?刺激战场闪退解决办法 2018-09-05 17:00:01 刺激战场在推出之后,成为手机上最火热的游戏之一,但是有玩家在下载游戏之后运行,会闪退,进入不了游戏,这是怎么回事呢 ...

  9. 腾讯游戏助手运行闪退日志查看

    由于公司游戏真机上运行没有问题,但是在腾讯手游助手运行闪退,因为没有log所以很纠结,最后终于找到查看日志的方法,如下: adb connect localhost:5555 adb -s local ...

最新文章

  1. Java五年,已财富自由,美人在手!
  2. @所有城市:想建AI智算中心的看这里!国家认可的那种
  3. Spring使用webjar
  4. (笔试题)将数组分成两组,使两组的和的差的绝对值最小
  5. 002_SpringBoot整合Servlet
  6. 【博客话题】我与Linux的不解情缘
  7. ubuntu/deepin 禁用IPV6
  8. 因服务器升级维护 造成不便敬请谅解,《梦幻西游》2020年5月20日维护公告
  9. 腾讯绝悟AI完全体限时开放体验,研究登上国际顶会与顶刊
  10. 条码生成 SDK - Zint 教程及示例
  11. Angular2 - Starter - NgModule
  12. ubuntu安装 ssh server
  13. day 0150面向对象-成员
  14. php hapijs,hapi 起步
  15. 石溪分校 计算机研究生专业,纽约州立石溪分校 - 985本科申请纽约州立大学石溪分校计算机研究生容易吗?要准备什么?还有如果成功了好毕业吗??...
  16. 手把手教你用深度学习做物体检测(二):数据标注
  17. 【Linux】红帽子安装过程超详细(学生教学用)
  18. 时间序列分类05:滑动窗口处理时间序列分类数据
  19. docker — volumes、MySQL数据库持久化
  20. 3D-GIS地理信息系统研发解决方案

热门文章

  1. 简明 Git 命令速查表(中文版)
  2. locate和find命令
  3. Dot Net设计模式—外观模式
  4. 软考自查:多媒体基础知识
  5. Coursera: Internet History, Technology, and Security
  6. 分布式服务框架 Zookeeper(二)官方介绍
  7. 微博达人硅谷之歌:Testin云測移动搜索性能測试非常是让人信服
  8. 一个想法照进现实-《IT连》创业项目:直觉型面试招聘的Bug
  9. 《Java虚拟机原理图解》5. JVM类加载器机制与类加载过程
  10. 玩转spring boot——结合阿里云持续交付