diff --git a/sdk-bugcollect/src/main/java/com/xuqm/sdk/bugcollect/BugCollect.kt b/sdk-bugcollect/src/main/java/com/xuqm/sdk/bugcollect/BugCollect.kt index 9471d3e..45ee491 100644 --- a/sdk-bugcollect/src/main/java/com/xuqm/sdk/bugcollect/BugCollect.kt +++ b/sdk-bugcollect/src/main/java/com/xuqm/sdk/bugcollect/BugCollect.kt @@ -134,6 +134,7 @@ object BugCollect { val bugCollectApiUrl = XuqmSDK.bugCollectApiUrl ?: return crashCaptureStarted = true CrashCapture.start( + appContext = XuqmSDK.appContext, logApiUrl = bugCollectApiUrl, appKey = XuqmSDK.appKey, getUserId = { XuqmSDK.getUserId() }, diff --git a/sdk-bugcollect/src/main/java/com/xuqm/sdk/bugcollect/CrashCapture.kt b/sdk-bugcollect/src/main/java/com/xuqm/sdk/bugcollect/CrashCapture.kt index f426d5f..5c0083a 100644 --- a/sdk-bugcollect/src/main/java/com/xuqm/sdk/bugcollect/CrashCapture.kt +++ b/sdk-bugcollect/src/main/java/com/xuqm/sdk/bugcollect/CrashCapture.kt @@ -1,12 +1,14 @@ package com.xuqm.sdk.bugcollect +import android.content.Context import com.xuqm.sdk.bugcollect.internal.LogStorage internal object CrashCapture { - fun start(logApiUrl: String, appKey: String, getUserId: () -> String?) { + fun start(appContext: Context, logApiUrl: String, appKey: String, getUserId: () -> String?) { val prev = Thread.getDefaultUncaughtExceptionHandler() Thread.setDefaultUncaughtExceptionHandler { thread, throwable -> - LogStorage.saveCrash(throwable, logApiUrl, appKey, getUserId()) + // 使用带 Context 的重载,依赖 context.filesDir 获取可靠路径 + LogStorage.saveCrash(appContext, throwable, logApiUrl, appKey, getUserId()) prev?.uncaughtException(thread, throwable) } } diff --git a/sdk-bugcollect/src/main/java/com/xuqm/sdk/bugcollect/internal/LogStorage.kt b/sdk-bugcollect/src/main/java/com/xuqm/sdk/bugcollect/internal/LogStorage.kt index b019e43..e332008 100644 --- a/sdk-bugcollect/src/main/java/com/xuqm/sdk/bugcollect/internal/LogStorage.kt +++ b/sdk-bugcollect/src/main/java/com/xuqm/sdk/bugcollect/internal/LogStorage.kt @@ -12,38 +12,9 @@ internal object LogStorage { File(context.filesDir, CRASH_DIR).also { it.mkdirs() } /** - * 同步写崩溃信息到文件系统(UncaughtExceptionHandler 中调用)。 - * 文件将在下次启动时由 [com.xuqm.sdk.bugcollect.LogQueue.uploadPendingCrashes] 上报。 - */ - fun saveCrash( - throwable: Throwable, - logApiUrl: String, - appKey: String, - userId: String?, - ) { - runCatching { - val dir = File( - // 使用系统属性获取 filesDir 替代 Context(在 UncaughtExceptionHandler 中 Context 可能不可用) - android.os.Environment.getDataDirectory().absolutePath + - "/data/${getPackageName()}/files/$CRASH_DIR" - ).also { it.mkdirs() } - val file = File(dir, "${System.currentTimeMillis()}.json") - val json = JSONObject().apply { - put("level", "fatal") - put("message", throwable.message ?: throwable.javaClass.name) - put("stack", throwable.stackTraceToString()) - put("exceptionType", throwable.javaClass.simpleName) - put("logApiUrl", logApiUrl) - put("appKey", appKey) - put("userId", userId ?: JSONObject.NULL) - put("timestamp", System.currentTimeMillis()) - } - file.writeText(json.toString()) - } - } - - /** - * 在 Application 中通过 Context 保存崩溃(更可靠)。 + * 同步写崩溃文件(在 UncaughtExceptionHandler 中调用)。 + * Application Context 在 handler 回调时仍然有效,直接用 context.filesDir 获取可靠路径。 + * 文件在下次启动时由 LogQueue.uploadPendingCrashes 上报后删除。 */ fun saveCrash( context: Context, @@ -68,10 +39,4 @@ internal object LogStorage { file.writeText(json.toString()) } } - - private fun getPackageName(): String = runCatching { - val clazz = Class.forName("android.app.ActivityThread") - val method = clazz.getMethod("currentPackageName") - method.invoke(null) as? String ?: "" - }.getOrDefault("") }