android 处理程序crash日志

日志是为了方便记录程序的各种异常情况,方便以后对程序的维护的修补,一个程序不可能做到百分百健壮和完美,所以有必要在代码中保存日志,方便维护。Java线程类提供了一个接口UncaughtExceptionHandler,Thread.setDefaultUncaughtExceptionHandler(handler)设置当线程由于未捕获到异常而突然终止,并且没有为该线程定义其他处理程序时所调用的默认处理程序。

所以我们可以继承UncaughtExceptionHandler, 在handler实现对日志的读写

   public class CrashHandler implements UncaughtExceptionHandler {
	// 系统默认的UncaughtException处理
	private Thread.UncaughtExceptionHandler mDefaultHandler;

	public CrashHandler() {
		mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
	}

	@Override
	public void uncaughtException(Thread thread, Throwable ex) {
		try {
			// 创建日志文件
			File file = createCreashLogFile();

			// 写入日志文件
			if (file != null && file.exists()) {
				writeLog(file, ex);
			}
		} catch (Exception e) {
		    LogUtils.w("", e);
		}

		// 将异常抛给系统处??
		mDefaultHandler.uncaughtException(thread, ex);
	}

	private void writeLog(File logFile, Throwable ex) {
		PrintStream printStream = null;
		FileOutputStream fos = null;

		// 写入日志文件
		try {
			fos = new FileOutputStream(logFile);
			printStream = new PrintStream(fos);
			ex.printStackTrace(printStream);
		} catch (Exception e) {
		    LogUtils.w("", e);
		} finally {
			closeQuietly(printStream);
			closeQuietly(fos);
		}
	}

	private void closeQuietly(OutputStream os) {
		if (os != null) {
			try {
				os.close();
			} catch (IOException e) {
			    LogUtils.w("", e);
			}
		}
	}

	/** 创建??个空白的崩溃日志文件 */
	public static File createCreashLogFile() throws IOException {
		if (!isExternalStorageAvaliable()) { // ??查存储是否可??
			return null;
		}

		File directory = new File(Environment.getExternalStorageDirectory()
				+ "/ViolationQuery/crash_log");
		if (!directory.exists()) {
			directory.mkdirs();
		}
		File file = new File(directory, createCrashLogFileName());
		if (file.exists()) {
			file.delete();
		}
		file.createNewFile();

		return file;
	}

	/** 存储是否可用 */
	public static boolean isExternalStorageAvaliable() {
		String state = Environment.getExternalStorageState();
		if (Environment.MEDIA_MOUNTED.equals(state)) {
			return true;
		} else {
			return false;
		}
	}

	private static String createCrashLogFileName() {
		String dateString = new SimpleDateFormat("yyyyMMdd_HHmmss",
				Locale.getDefault()).format(new Date());
		return "CrashLog_" + dateString + ".txt";
	}
}
<pre name="code" class="java">public class CrashManager {
	public static void start() {
		// 设置异常处理实例
		CrashHandler handler = new CrashHandler();
		Thread.setDefaultUncaughtExceptionHandler(handler);
	}
}

 然后在Application中调用Application中CrashManager.start();这样就大功告成了
时间: 2024-10-07 06:45:11

android 处理程序crash日志的相关文章

Android Native crash日志分析

在Android应用crash的类型中,native类型crash应该是比较难的一种了,因为大家接触的少,然后相对也要多转几道工序,所有大部分对这个都比较生疏.虽然相关文章也有很多了,但是我在刚开始学的过程中还是遇到一些问题,下面一一记录,以便将来翻阅. 分析native crash 日志需要几个东西: addr2line,objdump,ndk-stack等几个工具 带symbols的so文件 log log native crash的日志都是从一行星号(*** *** *** *** ***

Android程序crash处理

Android程序crash处理 时间 2014-11-24 13:45:37  CSDN博客 原文  http://blog.csdn.net/allen315410/article/details/41444053 主题 Android 在实际项目开发中,会出现很多的异常直接导致程序crash掉,在开发中我们可以通过logcat查看错误日志,Debug出现的异常,让程序安全的运行,但是在开发中有些异常隐藏的比较深,直到项目发布后,由于各种原因,譬如android设备不一致等等,android

APP闪退分析及Crash日志获取

现在人们越来越离不开手机了,手机已经是我们生活的一部分了.APP也越来越多,要想让自己的APP脱颖而出,能在移动互联网时代能有一席之地,除了能满足大多数用户的刚需之外,也要让自己APP的体验做到最佳.所以APP闪退可能会导致用户的流失,所以作为研发.测试人员应该把APP的crash率降到最低.所以在测试的过程中也要特别注意闪退. 说了那么多,那么尤其对于测试人员来说,遇到crash(或偶发)应该怎么办呢?必须要把日志抓取出来,这里以Android为例: 一.手机crash之后,如果弹出的"应用程

Android程序Crash异常处理

在写程序时,肯定会碰到各种问题,在解决这些问题肯定要去看控制台打印的异常信息,根据控制台打印的异常信息来进行针对性的解决. 那么要解决程序运行在用户手机上崩溃的问题,必须得找到问题的原因.因此就要收集崩溃信息,也就是log日志. Android程序Crash时我们可以做的操作: 1.将Crash信息存到本地,然后上传到服务器,根据上传的异常信息进行针对性的处理: 2.系统自带的Crash界面是很不友好的,我们可以自定义程序Crash后的界面,做的友好点: 关于以上2中操作方式,自己的见解: 1.

Android开发调试日志工具类[支持保存到SD卡]

直接上代码: package com.example.callstatus; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.net.UnknownHostException; import java.text.SimpleDateFormat; impor

捕获android程序崩溃日志

主要类: package com.example.callstatus; import java.io.File; import java.io.FileOutputStream; import java.io.PrintWriter; import java.io.StringWriter; import java.lang.Thread.UncaughtExceptionHandler; import java.lang.reflect.Field; import java.net.Unkn

使用 symbolicatecrash转化crash日志

查看crash日志的步骤:1.找到xcode自带的文symbolicatecrash,路径是/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources 2.把symbolicatecrash文件拷贝到你方便查看的地方,比如桌面文件app 3.把应用包.app和

ios crash的原因与抓取crash日志的方法

首先我们经常会闪退的异常有哪些呢?crash的产生来源于两种问题:违反iOS策略被干掉,以及自身的代码bug. 1.IOS策略 1.1 低内存闪退 前面提到大多数crash日志都包含着执行线程的栈调用信息,但是低内存闪退日志除外,这里就先看看低内存闪退日志是什么样的. 我们使用Xcode 5和iOS 7的设备模拟一次低内存闪退,然后通过Organizer查看产生的crash日志,可以发现Process和Type都为Unknown: 1.2 Watchdog超时 Apple的iOS Develop

android app崩溃日志收集以及上传

源码获取请到github:https://github.com/DrJia/AndroidLogCollector 已经做成sdk的形式,源码已公开,源码看不懂的请自行google. 如果想定制适应自己app的sdk请自行fork. AndroidLogCollector android app崩溃日志收集sdk 1.0 作者:贾博士 崩溃日志收集方法: 1.LogCollector是lib包,在需要添加崩溃日志sdk的工程中导入此包. 2.导入lib后,在自己的工程的AndroidManife