From 3ded960383b1c19451568349d0eb327238a326ef Mon Sep 17 00:00:00 2001 From: XuqmGroup Date: Thu, 18 Jun 2026 18:56:37 +0800 Subject: [PATCH] =?UTF-8?q?fix(bugcollect):=20captureError=20=E5=9C=A8=20S?= =?UTF-8?q?DK=20=E6=9C=AA=E5=B0=B1=E7=BB=AA=E6=97=B6=E6=9A=82=E5=AD=98?= =?UTF-8?q?=E4=BA=8B=E4=BB=B6=EF=BC=8C=E5=B0=B1=E7=BB=AA=E5=90=8E=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=20flush?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加 pendingErrors 队列,SDK 未初始化时 captureError 不再丢弃事件 - startCrashCapture 完成后自动 flush 暂存事件到上传队列 --- .../com/xuqm/sdk/bugcollect/BugCollect.kt | 26 ++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) 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 828b31c..242c971 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 @@ -16,6 +16,9 @@ object BugCollect { private val breadcrumbBuffer: LinkedList = LinkedList() private val breadcrumbLock = Any() + // SDK 未就绪时暂存的错误事件,就绪后自动 flush + private val pendingErrors = LinkedList() + private val pendingErrorsLock = Any() private const val MAX_BREADCRUMBS = 50 private const val SDK_NAME = "bugcollect.android" private const val SDK_VERSION = "1.1.0" @@ -53,14 +56,13 @@ object BugCollect { } fun captureError(error: Throwable, tags: Map = emptyMap(), fingerprint: String? = null) { - if (!isReady()) return val crumbs = synchronized(breadcrumbLock) { breadcrumbBuffer.toList() } val fp = fingerprint ?: Fingerprint.compute( error.javaClass.simpleName, error.message ?: error.javaClass.name, error.stackTraceToString(), ) - queue().push(IssueEvent( + val event = IssueEvent( level = "error", platform = "android", fingerprint = fp, @@ -77,7 +79,13 @@ object BugCollect { user = IssueEvent.UserInfo(id = XuqmSDK.getUserId() ?: XuqmSDK.deviceId), device = buildDeviceInfo(), tags = tags, - )) + ) + if (!isReady()) { + synchronized(pendingErrorsLock) { pendingErrors.add(event) } + return + } + flushPendingErrors() + queue().push(event) } fun captureCrash(error: Throwable, tags: Map = emptyMap()) { @@ -143,9 +151,21 @@ object BugCollect { appKey = XuqmSDK.appKey, getUserId = { XuqmSDK.getUserId() ?: XuqmSDK.deviceId }, ) + flushPendingErrors() queue().uploadPendingCrashes() } + /** 将 SDK 未就绪时暂存的错误事件 flush 到队列。 */ + private fun flushPendingErrors() { + val events = synchronized(pendingErrorsLock) { + if (pendingErrors.isEmpty()) return + val list = pendingErrors.toList() + pendingErrors.clear() + list + } + events.forEach { queue().push(it) } + } + /** 上传上次崩溃落盘的文件(远端配置就绪后由 BugCollectInitProvider 自动调用)。 */ fun uploadPendingCrashes() { if (isReady()) queue().uploadPendingCrashes()