全局异常捕获-使用的是腾讯的Bugly
2018-12-09 19:16
615 查看
1.配置ndk
android { defaultConfig { ndk { // 设置支持的SO库架构 abiFilters 'armeabi' //, 'x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a' } } }
2.添加依赖
dependencies { compile 'com.tencent.bugly:crashreport:latest.release' //其中latest.release指代最新Bugly SDK版本号,也可以指定明确的版本号,例如2.1.9 compile 'com.tencent.bugly:nativecrashreport:latest.release' //其中latest.release指代最新Bugly NDK版本号,也可以指定明确的版本号,例如3.0 }
3.导入CrashHandler类
public class CrashHandler implements Thread.UncaughtExceptionHandler { private static CrashHandler sInstance = null; private Thread.UncaughtExceptionHandler mDefaultHandler; private Context mContext; // 保存手机信息和异常信息 private Map<String, String> mMessage = new HashMap<>(); public static CrashHandler getInstance() { if (sInstance == null) { synchronized (CrashHandler.class) { if (sInstance == null) { synchronized (CrashHandler.class) { sInstance = new CrashHandler(); } } } } return sInstance; } private CrashHandler() { } /** * 初始化默认异常捕获 * * @param context context */ public void init(Context context) { mContext = context; // 获取默认异常处理器 mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler(); // 将此类设为默认异常处理器 Thread.setDefaultUncaughtExceptionHandler(this); } @Override public void uncaughtException(Thread t, Throwable e) { if (!handleException(e)) { // 未经过人为处理,则调用系统默认处理异常,弹出系统强制关闭的对话框 if (mDefaultHandler != null) { mDefaultHandler.uncaughtException(t, e); } } else { // 已经人为处理,系统自己退出 try { Thread.sleep(1000); } catch (InterruptedException e1) { e1.printStackTrace(); } System.exit(1); } } /** * 是否人为捕获异常 * * @param e Throwable * @return true:已处理 false:未处理 */ private boolean handleException(Throwable e) { if (e == null) {// 异常是否为空 return false; } new Thread() {// 在主线程中弹出提示 @Override public void run() { Looper.prepare(); Toast.makeText(mContext, "捕获到异常", Toast.LENGTH_SHORT).show(); Looper.loop(); } }.start(); collectErrorMessages(); saveErrorMessages(e); return false; } /** * 1.收集错误信息 */ private void collectErrorMessages() { PackageManager pm = mContext.getPackageManager(); try { PackageInfo pi = pm.getPackageInfo(mContext.getPackageName(), PackageManager.GET_ACTIVITIES); if (pi != null) { String versionName = TextUtils.isEmpty(pi.versionName) ? "null" : pi.versionName; String versionCode = "" + pi.versionCode; mMessage.put("versionName", versionName); mMessage.put("versionCode", versionCode); } // 通过反射拿到错误信息 Field[] fields = Build.class.getFields(); if (fields != null && fields.length > 0) { for (Field field : fields) { field.setAccessible(true); try { mMessage.put(field.getName(), field.get(null).toString()); } catch (IllegalAccessException e) { e.printStackTrace(); } } } } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } } /** * 2.保存错误信息 * * @param e Throwable */ private void saveErrorMessages(Throwable e) { StringBuilder sb = new StringBuilder(); for (Map.Entry<String, String> entry : mMessage.entrySet()) { String key = entry.getKey(); String value = entry.getValue(); sb.append(key).append("=").append(value).append("\n"); } Writer writer = new StringWriter(); PrintWriter pw = new PrintWriter(writer); e.printStackTrace(pw); pw.close(); String result = writer.toString(); sb.append(result); // String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss",Locale.CHINA).format(new Date()); String fileName = "crash-"+System.currentTimeMillis()+"-"+".log"; // 有无SD卡 if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { String path = Environment.getExternalStorageDirectory().getPath()+"/crash/"; File dir = new File(path); if (!dir.exists()) dir.mkdirs(); FileOutputStream fos = null; try { fos = new FileOutputStream(path + fileName); fos.write(sb.toString().getBytes()); } catch (Exception e1) { e1.printStackTrace(); } finally { if (fos != null) { try { fos.close(); } catch (IOException e1) { e1.printStackTrace(); } } } } } }
4.创建一个application类
CrashHandler.getInstance().init(this); CrashReport.initCrashReport(getApplicationContext(), "注册时申请的APPID", false);
5.加权限
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.READ_LOGS" />
相关文章推荐
- Android使用UncaughtExceptionHandler捕获全局异常
- Android使用UncaughtExceptionHandler捕获全局异常
- Android -- 使用UncaughtExceptionHandler捕获全局异常
- Spring boot异常统一处理方法:@ControllerAdvice注解的使用、全局异常捕获、自定义异常捕获
- Android使用UncaughtExceptionHandler捕获全局异常
- Android使用UncaughtExceptionHandler捕获全局异常
- Android使用UncaughtExceptionHandler捕获全局异常
- Android使用UncaughtExceptionHandler捕获全局异常
- Android使用UncaughtExceptionHandler捕获全局异常
- Android使用UncaughtExceptionHandler捕获全局异常
- 【Android】 使用UncaughtExceptionHandler捕获全局异常
- Android使用UncaughtExceptionHandler捕获全局异常
- Android使用UncaughtExceptionHandler捕获全局异常
- Android使用UncaughtExceptionHandler捕获全局异常
- Android使用UncaughtExceptionHandler捕获全局异常
- Android使用UncaughtExceptionHandler捕获全局异常
- Android使用UncaughtExceptionHandler捕获全局异常
- Android使用UncaughtExceptionHandler捕获全局异常
- android使用UncaughtExceptionHandler捕获全局异常
- Android捕获全局异常CrashExceptionHander 使用