Android程序Crash统计
来源:互联网 发布:银行模拟软件 编辑:程序博客网 时间:2024/06/15 06:56
大家都知道,在开发程序时,很难做到不会crash,程序在crash后我们就要分析其原因,那么首先就得统计crash信息。 本篇文章将介绍程序在crash后,如何获取crash的信息。
创建CrashHandler
package com.crash.xxx.crashhandlertest;import android.content.Context;import android.content.pm.PackageInfo;import android.content.pm.PackageManager;import android.os.Build;import android.os.Environment;import android.os.Process;import android.util.Log;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;/** * Created by xxx on 2016/8/19. */public class CrashHandler implements Thread.UncaughtExceptionHandler { private static final boolean DEBUG=true; private static final String TAG="CrashHanler"; private static final String PATH=Environment.getExternalStorageDirectory().getPath()+"/crashHandlerTest/crash_log/"; private static final String FILE_NAME="crash_"; private static final String FILE_NAME_SUFFIX=".trace"; private static CrashHandler mInstance=new CrashHandler(); private Thread.UncaughtExceptionHandler mUncaughtExceptionHandler; private Context mContext; private CrashHandler(){ } public static CrashHandler getInstance(){ return mInstance; } public void init(Context context){ mUncaughtExceptionHandler=Thread.getDefaultUncaughtExceptionHandler(); Thread.setDefaultUncaughtExceptionHandler(this); mContext=context.getApplicationContext(); } /** * 当程序中有未捕捉的异常,系统自动调用此方法; * thread为出现异常的线程,ex为未捕捉的异常 * @param thread * @param ex */ @Override public void uncaughtException(Thread thread, Throwable ex) { try { //将导出的异常写入SD卡中 dumpExceptionToSDCard(ex); } catch (IOException e) { e.printStackTrace(); } ex.printStackTrace(); //如果系统提供了异常处理,则交给系统去结束程序,否则由自己的程序结束自己 if (mUncaughtExceptionHandler!=null){ mUncaughtExceptionHandler.uncaughtException(thread,ex); }else{ Process.killProcess(Process.myPid()); } } public void dumpExceptionToSDCard(Throwable ex) throws IOException{ //如果sd卡存在,则将异常写入sd卡中 if (!Environment.getExternalStorageState().endsWith(Environment.MEDIA_MOUNTED)){ if (DEBUG){ Log.w(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").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); //写入手机信息 dumpPhoneInfo(pw); pw.println(); //写入崩溃信息 ex.printStackTrace(pw); pw.close(); } catch (Exception e) { e.printStackTrace(); if (DEBUG){ Log.e(TAG,"写入失败"+e); } } } public void dumpPhoneInfo(PrintWriter pw) throws PackageManager.NameNotFoundException{ PackageManager pm=mContext.getPackageManager(); PackageInfo pi=pm.getPackageInfo(mContext.getPackageName(),PackageManager.GET_ACTIVITIES); pw.println("APP Version:"); pw.print(pi.versionName); pw.print("_"); pw.println(pi.versionCode); //android version code pw.print("OS version: "); pw.print(Build.VERSION.RELEASE); pw.print("_"); pw.println(Build.VERSION.SDK_INT); //phone makes vendor pw.print("Vendor: "); pw.println(Build.MANUFACTURER); //phone model pw.print("Model: "); pw.println(Build.MODEL); //CPU ABI pw.print("CPU ABI: "); pw.println(Build.CPU_ABI); } //将crash日志上传到服务器 public void upLoadExceptionToServer(){ }}
在AppLication初始化时为线程配置CrashHandler
@Override public void onCreate() { super.onCreate(); CrashHandler crashHandler=CrashHandler.getInstance(); crashHandler.init(this); }
在清单文件中注册创建的AppLication,并添加所需的权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.Write_EXTERNAL_STORAGE"/>
测试
在MainActivity中创建一个Button,为其添加点击事件,在监听回调中抛一个自定义异常。
@Override public void onClick(View v) { if (v.getId()==R.id.btn_click){ throw new RuntimeException("自定义运行时异常"); } }
0 0
- Android程序Crash统计
- android crash log统计
- Android程序crash处理
- android 处理程序crash日志
- Android程序崩溃 crash信息
- Android程序Crash异常处理
- Android 程序crash后重新启动
- Android 程序添加Crash机制
- android处理crash程序崩溃异常
- Android程序Crash时的异常上报
- Android程序Crash时的异常上报
- 【android】程序Crash时的异常上报
- Android程序Crash时的异常上报
- Android程序Crash时的异常上报
- android处理crash程序崩溃异常
- Android程序Crash时的异常上报
- Android程序Crash时的异常上报
- Android程序Crash时的异常上报
- 对 void *(* func)(void *) 的理解
- 怎么写redmine wiki
- Oracle基础知识
- 关于ScrollView嵌套ListView与GridView的问题
- 简单的压缩、解压、查看
- Android程序Crash统计
- java笔试+面试总结——项目篇
- 07_多线程停止与守护线程
- 有道笔试之后的自我反省
- MySQL主备及代码方案
- SQLyog12最新版破解
- 火柴排队(树状数组求逆序对)
- leetcode_c++:Reverse String(344)
- iOS 导航条 知识简析(返回按钮,标题,背景颜色 等)