【Android应用开发】 Android 崩溃日志 本地存储 与 远程保存

示例代码下载 :;

一. 崩溃日志本地存储

1. 保存原理解析

崩溃信息本地保存步骤 :

— 1. 自定义类实现UncaughtExceptionHandler :public class CrashHandler implements UncaughtExceptionHandler;

— 2. 设置该自定义的CrashHandler类为单例模式 :

// 单例模式private static CrashHandler INSTANCE = new CrashHandler();private CrashHandler() {}public static CrashHandler getInstance() {return INSTANCE;}– 重写 uncaughtException方法 :@Overridepublic void uncaughtException(Thread thread, Throwable ex)– 自定义handleException 方法处理异常信息 : 在该方法中进行设备信息收集, 以及将信息保存到文件中;

(1) UncaughtExceptionHandler 类解析

UncaughtExceptionHandler 作用 : 该类处理以下情况, 如果有未捕获的异常发生, 出现了程序崩溃闪退的情况, 此时会回调该类的uncaughtException 方法;

(2) 线程相关

线程相关 : 每个线程都对应有响应的默认的未捕获异常处理器;

— 获取线程默认的未捕获异常处理器 :Thread.getDefaultUncaughtExceptionHandler();

— 设置线程默认的未捕获异常处理器 :Thread.setDefaultUncaughtExceptionHandler(this);

(3)uncaughtException 方法

uncaughtException 方法解析 :

— 回调时机 : 出现未定义的异常时;

— 回调参数 : 回调时会传入 线程对象 和 要抛出的异常信息, 我们可以在程序中拿到这两个信息;

public void uncaughtException(Thread thread, Throwable ex)

(4) 手机设备信息

手机设备信息手机步骤 :

— 1. 获取包信息 :

//获取包管理器PackageManager pm = ctx.getPackageManager();//获取包信息PackageInfo pi = pm.getPackageInfo(ctx.getPackageName(),PackageManager.GET_ACTIVITIES);– 2. 获取版本号信息 :if (pi != null) {//版本号String versionName = pi.versionName == null ? "null": pi.versionName;//版本代码String versionCode = pi.versionCode + "";//将版本信息存放到 成员变量 Map<String, String> mInfos 中this.mInfos.put("versionName", versionName);this.mInfos.put("versionCode", versionCode);}– 3. 使用反射获取 Build 类成员变量变量 , 并遍历获取这些变量内容://获取 Build 中定义的变量, 使用反射方式获取, 该类中定义了设备相关的变量信息Field[] fields = Build.class.getDeclaredFields();//遍历获取额变量, 将这些信息存放到成员变量 Map<String, String> mInfos 中for (Field field : fields) {try {//设置 Build 成员变量可访问field.setAccessible(true);//将 设备相关的信息存放到 mInfos 成员变量中mInfos.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);}}

(4) 保存崩溃信息到文件

保存文件步骤 : 这些步骤就很简单了, 使用 IO流即可;

— 1. 将之前获取的 Build 设备信息, 版本信息, 崩溃信息转为字符串 :

//存储相关的字符串信息StringBuffer sb = new StringBuffer();//将成员变量 Map<String, String> mInfos 中的数据 存储到 StringBuffer sb 中for (Map.Entry<String, String> entry : this.mInfos.entrySet()) {String key = entry.getKey();String value = entry.getValue();sb.append(key + "=" + value + "\n");}– 2. 在 Logcat 中打印崩溃信息 : 之前的默认操作就是打印崩溃信息到 Logcat 中, 我们在这里继续执行完这个步骤, 否则Logcat 中没有数据的;//将 StringBuffer sb 中的字符串写出到文件中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();– 3. 写出数据到文件中 : IO 流知识点, 不再做过多赘述;String result = writer.toString();sb.append(result);try {long timestamp = System.currentTimeMillis();String time = formatter.format(new Date());String fileName = "crash-" + time + "-" + timestamp + ".txt";if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {//获取文件输出路径String path = Environment.getExternalStorageDirectory()+ "/crashinfo/";//创建文件夹和文件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);}

2. 代码及示例

(1) 相关代码示例

生活若剥去了理想梦想幻想,那生命便只是一堆空架子

【Android应用开发】 Android 崩溃日志 本地存储 与 远程保存

相关文章:

你感兴趣的文章:

标签云: