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()