From 3a154bdb0a5aaa2c0ac3eac95a6ba747068bd454 Mon Sep 17 00:00:00 2001
From: MrShi <1878285526@qq.com>
Date: 星期二, 13 一月 2026 10:00:37 +0800
Subject: [PATCH] 优化
---
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/CrashHandler.java | 343 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 343 insertions(+), 0 deletions(-)
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/CrashHandler.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/CrashHandler.java
new file mode 100644
index 0000000..2eb455d
--- /dev/null
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/CrashHandler.java
@@ -0,0 +1,343 @@
+package com.doumee.keyCabinet.utils;
+
+import android.app.AlarmManager;
+import android.app.PendingIntent;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.os.Build;
+import android.os.Environment;
+import android.os.Looper;
+
+import com.doumee.keyCabinet.ui.guide.GuideActivity;
+import com.doumee.keyCabinet.ui.main.MainActivity;
+import com.doumee.lib_coremodel.util.SpUtil;
+import com.innohi.YNHAPI;
+
+import java.io.BufferedWriter;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.io.Writer;
+import java.lang.Thread.UncaughtExceptionHandler;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Properties;
+
+/**
+ *
+ *
+ * UncaughtExceptionHandler锛氱嚎绋嬫湭鎹曡幏寮傚父鎺у埗鍣ㄦ槸鐢ㄦ潵澶勭悊鏈崟鑾峰紓甯哥殑銆� 濡傛灉绋嬪簭鍑虹幇浜嗘湭鎹曡幏寮傚父榛樿鎯呭喌涓嬪垯浼氬嚭鐜板己琛屽叧闂璇濇
+ * 瀹炵幇璇ユ帴鍙e苟娉ㄥ唽涓虹▼搴忎腑鐨勯粯璁ゆ湭鎹曡幏寮傚父澶勭悊 杩欐牱褰撴湭鎹曡幏寮傚父鍙戠敓鏃讹紝灏卞彲浠ュ仛浜涘紓甯稿鐞嗘搷浣� 渚嬪锛氭敹闆嗗紓甯镐俊鎭紝鍙戦�侀敊璇姤鍛� 绛夈��
+ *
+ * UncaughtException澶勭悊绫�,褰撶▼搴忓彂鐢烾ncaught寮傚父鐨勬椂鍊�,鐢辫绫绘潵鎺ョ绋嬪簭,骞惰褰曞彂閫侀敊璇姤鍛�.
+ */
+public class CrashHandler implements UncaughtExceptionHandler {
+ private static final String TAG = "CrashHandler";
+ private static String PATH = Environment.getExternalStorageDirectory().getPath() + "/log/";
+ public static final String FILE_NAME = "crash";
+ //log鏂囦欢鐨勫悗缂�鍚�
+ private static final String FILE_NAME_SUFFIX = ".txt";
+
+ public static final String CLIENT_VERSION = "clientVersion";
+
+ /** CrashHandler瀹炰緥 */
+ private static CrashHandler INSTANCE;
+ /** 绋嬪簭鐨凜ontext瀵硅薄 */
+ private Context mContext;
+ /** 绯荤粺榛樿鐨刄ncaughtException澶勭悊绫� */
+ private UncaughtExceptionHandler mDefaultHandler;
+
+ /** 浣跨敤Properties鏉ヤ繚瀛樿澶囩殑淇℃伅鍜岄敊璇爢鏍堜俊鎭� */
+ private Properties mDeviceCrashInfo = new Properties();
+
+ /** 淇濊瘉鍙湁涓�涓狢rashHandler瀹炰緥 */
+ private CrashHandler() {
+ }
+
+ /** 鑾峰彇CrashHandler瀹炰緥 ,鍗曚緥妯″紡 */
+ public static CrashHandler getInstance() {
+ if (INSTANCE == null) {
+ INSTANCE = new CrashHandler();
+ }
+ return INSTANCE;
+ }
+
+ /**
+ * 鍒濆鍖�,娉ㄥ唽Context瀵硅薄, 鑾峰彇绯荤粺榛樿鐨刄ncaughtException澶勭悊鍣�, 璁剧疆璇rashHandler涓虹▼搴忕殑榛樿澶勭悊鍣�
+ *
+ * @param ctx
+ */
+ public void init(Context ctx) {
+ mContext = ctx;
+ //PATH = ctx.getFilesDir().getParentFile().getAbsolutePath()+ "/log/";
+ mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
+ Thread.setDefaultUncaughtExceptionHandler(this);
+ // 鏀堕泦璁惧淇℃伅
+ collectCrashDeviceInfo(mContext);
+ }
+
+ @Override
+ public void uncaughtException(Thread thread, Throwable ex) {
+ try {
+ //瀵煎嚭寮傚父淇℃伅鍒癝D鍗′腑
+ YNHAPI mAPI = YNHAPI.getInstance();
+ mAPI.setNavigationBarVisibility(YNHAPI.NavigationBarVisibility.VISIBLE);
+ dumpExceptionToSDCard(ex);
+ long time = SpUtil.getLong("err_app");
+ SpUtil.saveLong("err_app",System.currentTimeMillis());
+ if(System.currentTimeMillis()-time>60000){
+ //鎶ラ敊闂撮殧60绉掞紝鎵嶉噸鍚�
+ //System.out.println("閲嶅惎搴旂敤");
+ // 鍒涘缓涓�涓柊鐨勫惎鍔ㄦ剰鍥�
+ Intent intent = new Intent(mContext, MainActivity.class);
+ // 璁剧疆FLAG_ACTIVITY_CLEAR_TASK鏍囧織浣�
+ intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
+ // 浣跨敤PendingIntent鍖呰鍚姩鎰忓浘
+ PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0, intent, PendingIntent.FLAG_ONE_SHOT);
+ // 鑾峰彇AlarmManager瀹炰緥
+ AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
+ // 鍦�500姣鍚庤Е鍙戦噸鍚搷浣�
+ alarmManager.set(AlarmManager.RTC, System.currentTimeMillis() + 10, pendingIntent);
+
+ android.os.Process.killProcess(android.os.Process.myPid());
+ System.exit(1);
+ }
+ //杩欓噷鍙互閫氳繃缃戠粶涓婁紶寮傚父淇℃伅鍒版湇鍔″櫒锛屼究浜庡紑鍙戜汉鍛樺垎鏋愭棩蹇椾粠鑰岃В鍐砨ug
+
+ } catch (IOException e) {
+ e.printStackTrace();
+ System.out.println("閿欒鏃ュ織1"+e.getMessage());
+ }
+ //鎵撳嵃鍑哄綋鍓嶈皟鐢ㄦ爤淇℃伅
+ ex.printStackTrace();
+ //濡傛灉绯荤粺鎻愪緵浜嗛粯璁ょ殑寮傚父澶勭悊鍣紝鍒欎氦缁欑郴缁熷幓缁撴潫鎴戜滑鐨勭▼搴忥紝鍚﹀垯灏辩敱鎴戜滑鑷繁缁撴潫鑷繁
+ if (mDefaultHandler != null) {
+ mDefaultHandler.uncaughtException(thread, ex);
+ } else {
+ android.os.Process.killProcess(android.os.Process.myPid());
+ }
+
+ if (!handleException(ex) && mDefaultHandler != null) {
+ // 濡傛灉鐢ㄦ埛娌℃湁澶勭悊鍒欒绯荤粺榛樿鐨勫紓甯稿鐞嗗櫒鏉ュ鐞�
+ mDefaultHandler.uncaughtException(thread, ex);
+ } else {
+ /*try {
+ Thread.sleep(500);
+ } catch (InterruptedException e) {
+ Log.e(TAG, "error : ", e);
+ }*/
+ /*System.out.println("閲嶅惎搴旂敤");
+ // 鍒涘缓涓�涓柊鐨勫惎鍔ㄦ剰鍥�
+ Intent intent = new Intent(mContext, GuideActivity.class);
+ // 璁剧疆FLAG_ACTIVITY_CLEAR_TASK鏍囧織浣�
+ intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
+ // 浣跨敤PendingIntent鍖呰鍚姩鎰忓浘
+ PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0, intent, PendingIntent.FLAG_ONE_SHOT);
+ // 鑾峰彇AlarmManager瀹炰緥
+ AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
+ // 鍦�500姣鍚庤Е鍙戦噸鍚搷浣�
+ alarmManager.set(AlarmManager.RTC, System.currentTimeMillis() + 10, pendingIntent);
+
+ android.os.Process.killProcess(android.os.Process.myPid());
+ System.exit(1);*/
+ /*// 鏈崟鑾峰紓甯稿啓鏂囦欢
+ writeCrashInfoToFile(ex);
+ // 閫�鍑烘暣涓簲鐢�
+ if (mDefaultHandler != null) {
+ mDefaultHandler.uncaughtException(thread, ex);
+ } else {
+ System.exit(0);
+ }*/
+ }
+ }
+
+ /**
+ * 鑷畾涔夐敊璇鐞�,鏀堕泦閿欒淇℃伅 鍙戦�侀敊璇姤鍛婄瓑鎿嶄綔鍧囧湪姝ゅ畬鎴�. 寮�鍙戣�呭彲浠ユ牴鎹嚜宸辩殑鎯呭喌鏉ヨ嚜瀹氫箟寮傚父澶勭悊閫昏緫
+ *
+ * @param ex
+ * @return true:濡傛灉澶勭悊浜嗚寮傚父淇℃伅;鍚﹀垯杩斿洖false
+ */
+ private boolean handleException(Throwable ex) {
+ if (ex == null) {
+ return false;
+ }
+ // 浣跨敤Toast鏉ユ樉绀哄紓甯镐俊鎭�
+ new Thread() {
+ @Override
+ public void run() {
+ Looper.prepare();
+ //T.ss("寰堟姳姝�,绋嬪簭鍑虹幇寮傚父,鍗冲皢閫�鍑�");
+ Looper.loop();
+ }
+ }.start();
+ // 鏈崟鑾峰紓甯稿啓鏂囦欢
+ writeCrashInfoToFile(ex);
+ return true;
+ }
+
+ /**
+ * 鏀堕泦绋嬪簭宕╂簝鐨勮澶囦俊鎭�
+ *
+ * @param ctx
+ */
+ private void collectCrashDeviceInfo(Context ctx) {
+ try {
+ PackageManager pm = ctx.getPackageManager();
+
+ PackageInfo pi = pm.getPackageInfo(ctx.getPackageName(),
+ PackageManager.GET_ACTIVITIES);
+ if (pi != null) {
+ mDeviceCrashInfo.setProperty(CLIENT_VERSION,
+ pi.versionName == null ? "not set" : pi.versionName);
+ }
+ } catch (NameNotFoundException e) {
+ e.printStackTrace();
+ System.out.println("閿欒鏃ュ織3"+e.getMessage());
+ }
+ }
+
+ /**
+ * 灏嗗紓甯镐俊鎭啓鍏ユ棩蹇楁枃浠�
+ *
+ * @param ex
+ * @return
+ */
+ private String writeCrashInfoToFile(Throwable ex) {
+ Writer info = new StringWriter();
+ PrintWriter printWriter = new PrintWriter(info);
+ // printStackTrace(PrintWriter s)
+ // 灏嗘 throwable 鍙婂叾杩借釜杈撳嚭鍒版寚瀹氱殑 PrintWriter
+ ex.printStackTrace(printWriter);
+
+ // getCause() 杩斿洖姝� throwable 鐨� cause锛涘鏋� cause 涓嶅瓨鍦ㄦ垨鏈煡锛屽垯杩斿洖 null銆�
+ Throwable cause = ex.getCause();
+ while (cause != null) {
+ cause.printStackTrace(printWriter);
+ cause = cause.getCause();
+ }
+
+ // toString() 浠ュ瓧绗︿覆鐨勫舰寮忚繑鍥炶缂撳啿鍖虹殑褰撳墠鍊笺��
+ String result = info.toString();
+ printWriter.close();
+
+ String errorLog = String
+ .format("FINGERPRINT=%s|"
+ + "STACK_TRACE=%s|versionName=%s|MODEL=%s|MANUFACTURER=%s|BRAND=%s|RELEASE=%s",
+ // 纭欢鍚嶇О
+ Build.FINGERPRINT,
+ // 寮傚父淇℃伅
+ result,
+ // 搴旂敤鐗堟湰鍚嶇О
+ mDeviceCrashInfo.getProperty(CLIENT_VERSION),
+ // 璁惧鍚嶇О
+ Build.MODEL,
+ // 纭欢鍒堕�犲晢
+ Build.MANUFACTURER,
+ // android绯荤粺瀹氬埗鍟�
+ Build.BRAND,
+ // android SDK鐗堟湰
+ Build.VERSION.RELEASE);
+ //sp.setString(Constants.SP_CRASH_EXCEPTION, errorLog);
+ return null;
+ }
+
+ private void dumpExceptionToSDCard(Throwable ex) throws IOException {
+ //濡傛灉SD鍗′笉瀛樺湪鎴栨棤娉曚娇鐢紝鍒欐棤娉曟妸寮傚父淇℃伅鍐欏叆SD鍗�
+ if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
+ /*if (Const.DEBUG) {
+ LogUtils.w(TAG, "sdcard unmounted,skip dump exception");
+ return;
+ }*/
+ return;
+ }
+ /*File dir = new File(PATH);
+ if (!dir.exists()) {
+ dir.mkdirs();
+ }*/
+ long current = System.currentTimeMillis();
+ String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(current));
+ try {
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ PrintStream print = new PrintStream(out);
+ //瀵煎嚭鍙戠敓寮傚父鐨勬椂闂�
+ print.println(time);
+ //瀵煎嚭鎵嬫満淇℃伅
+ dumpPhoneInfo(print);
+ print.println();
+ ex.printStackTrace(print);
+ //SpUtil.saveString(FILE_NAME+time,new String(out.toByteArray()));
+ print.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ System.out.println("閿欒鏃ュ織2"+e.getMessage());
+ //LogUtils.e(TAG, "dump crash info failed");
+ }
+ //浠ュ綋鍓嶆椂闂村垱寤簂og鏂囦欢
+ File file = new File(PATH , FILE_NAME + time + FILE_NAME_SUFFIX);
+ try {
+ PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file)));
+ //瀵煎嚭鍙戠敓寮傚父鐨勬椂闂�
+ pw.println(time);
+ //瀵煎嚭鎵嬫満淇℃伅
+ dumpPhoneInfo(pw);
+ pw.println();
+ //瀵煎嚭寮傚父鐨勮皟鐢ㄦ爤淇℃伅
+ ex.printStackTrace(pw);
+ pw.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ System.out.println("閿欒鏃ュ織2"+e.getMessage());
+ //LogUtils.e(TAG, "dump crash info failed");
+ }
+ }
+ private void dumpPhoneInfo(PrintStream pw) throws NameNotFoundException {
+ //搴旂敤鐨勭増鏈悕绉板拰鐗堟湰鍙�
+ PackageManager pm = mContext.getPackageManager();
+ PackageInfo pi = pm.getPackageInfo(mContext.getPackageName(), PackageManager.GET_ACTIVITIES);
+ pw.print("App Version: ");
+ pw.print(pi.versionName);
+ pw.print('_');
+ pw.println(pi.versionCode);
+ //android鐗堟湰鍙�
+ pw.print("OS Version: ");
+ pw.print(Build.VERSION.RELEASE);
+ pw.print("_");
+ pw.println(Build.VERSION.SDK_INT);
+ //鎵嬫満鍒堕�犲晢
+ pw.print("Vendor: ");
+ pw.println(Build.MANUFACTURER);
+ //鎵嬫満鍨嬪彿 pw.print("Model: ");
+ pw.println(Build.MODEL);
+ //cpu鏋舵瀯
+ pw.print("CPU ABI: ");
+ pw.println(Build.CPU_ABI); }
+
+ private void dumpPhoneInfo(PrintWriter pw) throws NameNotFoundException {
+ //搴旂敤鐨勭増鏈悕绉板拰鐗堟湰鍙�
+ PackageManager pm = mContext.getPackageManager();
+ PackageInfo pi = pm.getPackageInfo(mContext.getPackageName(), PackageManager.GET_ACTIVITIES);
+ pw.print("App Version: ");
+ pw.print(pi.versionName);
+ pw.print('_');
+ pw.println(pi.versionCode);
+ //android鐗堟湰鍙�
+ pw.print("OS Version: ");
+ pw.print(Build.VERSION.RELEASE);
+ pw.print("_");
+ pw.println(Build.VERSION.SDK_INT);
+ //鎵嬫満鍒堕�犲晢
+ pw.print("Vendor: ");
+ pw.println(Build.MANUFACTURER);
+ //鎵嬫満鍨嬪彿 pw.print("Model: ");
+ pw.println(Build.MODEL);
+ //cpu鏋舵瀯
+ pw.print("CPU ABI: ");
+ pw.println(Build.CPU_ABI); }
+}
--
Gitblit v1.9.3