我是靠谱客的博主 大力黑裤,这篇文章主要介绍Android Crash日志本地输出到文件,现在分享给大家,希望可以做个参考。

1.说明

当没有firebase 或者 bugly时,crash日志本地存储可以方便的查看并发现问题,系统各个版本存储或有差别,具体路径可参考 此文章

2.具体使用

  • 1.创建CrashHandlers实现Thread.UncaughtExceptionHandler,具体代码如下
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
public class CrashHandlers implements Thread.UncaughtExceptionHandler { public static final String TAG = "CrashHandler"; // 系统默认的UncaughtException处理类 private Thread.UncaughtExceptionHandler mDefaultHandler; // CrashHandler实例 private static CrashHandlers INSTANCE = new CrashHandlers(); // 程序的Context对象 private Context mContext; // 用来存储设备信息和异常信息 private Map<String, String> infos = new HashMap<String, String>(); /** * 保证只有一个CrashHandler实例 */ private CrashHandlers() { } /** * 获取CrashHandler实例 ,单例模式 */ public static CrashHandlers getInstance() { return INSTANCE; } /** * 初始化 * * @param context */ public void init(Context context) { Log.e("CrashHandler","...........................2"); mContext = context; // 获取系统默认的UncaughtException处理器 mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler(); // 设置该CrashHandler为程序的默认处理器 Thread.setDefaultUncaughtExceptionHandler(this); } /** * 当UncaughtException发生时会转入该函数来处理 */ @Override public 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; } // 收集设备参数信息 collectDeviceInfo(mContext); // 保存日志文件 saveCrashInfo2File(ex); return false; } /** * 收集设备参数信息 * * @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 (PackageManager.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) { Log.e(TAG,"------1"+ ex.getMessage()); StringBuffer sb = new StringBuffer(); Calendar calendar = Calendar.getInstance(); int year = calendar.get(Calendar.YEAR); int month = calendar.get(Calendar.MONTH) + 1; int day = calendar.get(Calendar.DAY_OF_MONTH); int hour = calendar.get(Calendar.HOUR_OF_DAY); int minute = calendar.get(Calendar.MINUTE); int second = calendar.get(Calendar.SECOND); String time = year + "-" + month + "-" + day + " " + hour + ":" + minute + ":" + second; sb.append("rn"); sb.append("rn"); sb.append("rn"); sb.append("************************************************"+time+"****************************************"+"rn"); sb.append("rn"); 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 { String fileName = "errorLog.txt"; if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { // String path = Environment.getExternalStorageDirectory() + "/errorLog"; //手机里的路径为:文件管理器 - Android/data/包名/-cach/errorLog String path = mContext.getExternalCacheDir() + "/errorLog"; Log.e(TAG, "-----2"+path); File dir = new File(path); if (!dir.exists()) { dir.mkdir(); } // File file = new File(path + File.separator + fileName); File file = new File(dir ,File.separator + System.currentTimeMillis()+fileName); if (!file.exists()) { file.createNewFile(); } FileWriter fileWriter = new FileWriter(file, true); fileWriter.write(sb.toString()); Log.e(TAG, "--write===="+path); fileWriter.close(); } return fileName; } catch (Exception e) { Log.e(TAG, "--====="+e.toString()); return null; } } }
  • 2.在Application的onCreate()中初始化
复制代码
1
2
3
4
5
6
7
@Override public void onCreate() { super.onCreate(); CrashHandlers.getInstance().init(this); }

最后

以上就是大力黑裤最近收集整理的关于Android Crash日志本地输出到文件的全部内容,更多相关Android内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(73)

评论列表共有 0 条评论

立即
投稿
返回
顶部