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