`

Android 捕获App意外退出错误的日志信息

阅读更多
  1.创建获取日志信息的类AppLogHandler,该类的功能是捕获导致应用程序意外退出的错误的日志信息,这里写的是一个错误保存一个log文件,保存到SD卡对应的目录下。代码如下:
package com.ryan.test.crash;

import java.io.File;
import java.io.FileOutputStream;
import java.lang.Thread.UncaughtExceptionHandler;

import android.content.Context;
import android.os.Environment;
import android.os.Looper;

public class AppLogHandler implements UncaughtExceptionHandler {

	public static final boolean DEBUG = true;

	public static final String AGR_LOG_DIRECOTORY = "agrlog";

	private Thread.UncaughtExceptionHandler mDefaultHandler;

	private static AppLogHandler instance;

	private AppLogHandler() {
	}

	public static AppLogHandler getInstance() {
		if (instance == null) {
			instance = new AppLogHandler();
		}
		return instance;
	}

	public void init(Context context) {
		mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
		Thread.setDefaultUncaughtExceptionHandler(this);
	}

	@Override
	public void uncaughtException(Thread thread, Throwable ex) {
		if (!handleException(ex) && mDefaultHandler != null) {
			mDefaultHandler.uncaughtException(thread, ex);
		} else {
			try {
				Thread.sleep(3000);
			} catch (Exception e) {
				e.printStackTrace();
			}
			android.os.Process.killProcess(android.os.Process.myPid());
			System.exit(10);
		}
	}

	private boolean handleException(final Throwable ex) {
		if (DEBUG) {
			if (ex == null) {
				return false;
			}
			final StackTraceElement[] stack = ex.getStackTrace();
			final String message = ex.getMessage();
			new Thread() {
				@Override
				public void run() {
					Looper.prepare();
					createLogDirectory();
					String fileName = AGR_LOG_DIRECOTORY + "/crash-" + System.currentTimeMillis() + ".log";
					File file = new File(
							Environment.getExternalStorageDirectory(), fileName);
					try {
						FileOutputStream fos = new FileOutputStream(file, true);
						fos.write(message.getBytes());
						for (int i = 0; i < stack.length; i++) {
							fos.write(stack[i].toString().getBytes());
						}
						fos.flush();
						fos.close();
					} catch (Exception e) {
					}
					Looper.loop();
				}
			}.start();
		}
		return false;
	}

	private void createLogDirectory() {
		File file = new File(Environment.getExternalStorageDirectory(), AGR_LOG_DIRECOTORY);
		try {
			if (!file.exists() || !file.isDirectory()) {
				file.mkdir();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}


  2.为了读取Logcat的信息并保存到SD卡中,必须添加对应的权限:
<uses-permission android:name="android.permission.READ_LOGS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

  3.新建MyApplication类继承自Application,在应用启动时开启对导致程序意外退出的错误的捕获:
import com.ryan.test.crash.AppLogHandler;

import android.app.Application;

public class MyApplication extends Application{

	@Override
	public void onCreate() {
		super.onCreate();
		AppLogHandler appLogHandler = AppLogHandler.getInstance();
		appLogHandler.init(getApplicationContext());
	}
}


  4.为了使MyApplication生效,必须修改AndroidMenifest.xml文件:
 <application
        android:name="com.ryan.test.MyApplication"
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.NoTitleBar">
       <!-- 省略其他信息 -->
 </application>
分享到:
评论
1 楼 mnameyang 2013-05-12  
[u][/u]

相关推荐

    Android捕获全局异常并写日志保存到sd卡.rar

    Android捕获全局异常并写日志保存到sd卡,捕获异常消息后输出这个消息,可避免APP强制退出,抛出NullPointException玩玩哈,捕获全局异常是因为有的异常我们捕获不到,捕获时我们采用同步方法,以免单例多线程环境下...

    android程序意外退出自动重启

    "android程序意外退出自动重启"这个主题涉及到如何在程序出现意外错误导致崩溃时,实现程序的自动恢复和持续运行。以下是一些关键知识点的详细说明: 1. **异常处理**: - 在Android中,每个应用都有一个独立的...

    android 捕获异常重启APP

    "android 捕获异常重启APP"这一主题就是关于如何在Android应用中实现这种功能的讨论。 首先,要捕获异常,我们需要在应用的主进程中设置全局的异常处理器。Android系统提供了`Thread.UncaughtExceptionHandler`接口...

    Android app 闪退弹框 CrashUI当 Android app内发生exception

    当Android应用在运行时遇到未被捕获的异常(Exception),系统会默认终止应用并显示一个简单的错误信息,这对于用户来说并不友好。因此,开发者通常会自定义CrashUI来提供更友好的错误反馈和调试信息。 首先,我们...

    【Android studio】service在app直接退出下,整体输出情况,实现开机自启动,一直后台运行

    总结,要在Android Studio中实现Service在app退出后继续运行并开机自启动,需要理解Service的生命周期,正确配置BroadcastReceiver,以及采取保活策略。同时,对App的卡死崩溃进行监控和处理,以提升用户体验和应用...

    ANDROID 完美退出APP的实例代码

    然而,有些情况下,开发者需要提供一个明确的退出选项,比如教育类应用或者游戏,用户可能希望完全退出应用以节省资源或避免意外操作。本文将详细介绍如何实现“完美退出APP”的实例代码。 首先,我们需要理解...

    Android LOG日志抓取工具

    "Android LOG日志抓取工具"专注于捕获异常日志,通常会在程序出现错误或崩溃时自动触发,收集相关的堆栈跟踪和上下文信息。这样,开发者无需在运行环境中实时监控,就能在后期分析日志以找出问题所在。 3. **集成...

    Android全局捕获崩溃异常记录日志保存至本地并定时删除

    为了解决这个问题,开发者通常会实现全局异常捕获机制,以便在程序崩溃时记录异常信息,并将这些日志保存到本地。此外,为了维护存储空间的有效利用,日志还需要定时清理。本文将详细介绍如何在Android中实现这一...

    UncaughtException不让Android应用异常退出

    "UncaughtException不让Android应用异常退出"这个主题,就是关于如何处理程序中的未捕获异常,以防止应用突然崩溃,从而提升用户体验。在这个问题上,我们可以从以下几个方面来探讨: 1. **...

    Android编程实现捕获程序异常退出时的错误log信息功能详解

    本篇文章将深入讲解如何在Android中实现捕获程序异常退出时的错误log信息。 首先,Android系统提供了`UncaughtExceptionHandler`接口,用于处理未被捕获的异常。当程序中的异常没有被try-catch块捕获,或者在主线程...

    android app异常收集处理

    总的来说,Android应用的异常收集和处理是一个系统性的工程,涉及到异常的捕获、处理、日志记录、错误报告等多个环节。通过合理的异常处理策略,开发者可以快速定位和修复问题,提高应用的稳定性和用户体验。

    AndroidCrash全局崩溃异常捕获

    在Android应用开发中,确保应用稳定性...它涵盖了从异常捕获、信息收集、数据上报到用户交互的多个环节,是Android开发中不可或缺的一部分。通过对这些知识点的理解和实践,开发者能够更好地管理和改进自己的应用程序。

    Android-AppManager如何优雅的退出应用和处理崩溃异常自动重启

    2. **日志记录**: 当发生异常时,记录详细的错误信息,包括堆栈跟踪,便于后续调试。 3. **崩溃反馈**: 可以集成第三方服务(如Crashlytics)收集崩溃报告,以便开发者能及时发现和修复问题。 **自动重启应用** 1...

    android 完美退出程序

    ### Android完美退出程序详解 #### 一、引言 在Android开发过程中,有时我们需要实现一个“一键退出”功能,即用户点击某个按钮后能够迅速且干净地关闭整个应用程序。这不仅可以提升用户体验,还能确保程序资源...

    android工程全局异常处理-将未处理异常日志保存在文件中,可后续开发提交至服务器

    在Android应用开发中,异常处理是一项至关重要的任务,它能够确保程序在遇到错误时不会突然崩溃,而是能够优雅地处理并记录错误信息。本篇主要介绍如何实现一个全局的异常处理机制,以便将未处理的异常日志保存到...

    Android平台Native代码的崩溃捕获机制及实现

    在Android平台,nativecrash一直是crash里的大头。nativecrash具有上下文不全、出错信息模糊...在Unix-like系统中,所有的崩溃都是编程错误或者硬件错误相关的,系统遇到不可恢复的错误时会触发崩溃机制让程序退出,如

    Android 全局异常捕获实例详解

    在Android开发中,全局异常捕获是至关重要的一个环节,它可以帮助开发者在应用程序出现未预期错误时,收集必要的信息并进行处理,防止应用崩溃或提供友好的用户反馈。本篇文章将详细讲解如何在Android中实现全局异常...

    Android崩溃后重启App

    这样,当程序中出现未被处理的异常时,这个处理器将被调用,我们可以在这个处理器中记录错误日志、展示错误信息,甚至启动重启应用的逻辑。 2. **Activity管理栈** Activity管理栈是Android系统管理应用程序界面的...

    Android-用于监听App前后台状态变化的工具类

    4. 反注册BroadcastReceiver:为了避免内存泄漏,记得在App退出或者不再需要监听状态变化时,使用unregisterReceiver()方法来取消注册BroadcastReceiver。 此外,ActivityMonitor可能还提供了其他辅助方法,比如...

Global site tag (gtag.js) - Google Analytics