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 45ee491..70cab38 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 @@ -131,11 +131,15 @@ object BugCollect { fun startCrashCapture() { if (crashCaptureStarted) return - val bugCollectApiUrl = XuqmSDK.bugCollectApiUrl ?: return + if (!XuqmSDK.isInitialized()) return + // bugCollectApiUrl 由远端配置下发,启动时可能尚未到达。 + // 用 platformUrl 推导兜底地址:崩溃文件里会保存此 URL,下次启动时用它上报。 + val logApiUrl = XuqmSDK.bugCollectApiUrl + ?: (XuqmSDK.platformUrl.trimEnd('/') + "/api/bugcollect/") crashCaptureStarted = true CrashCapture.start( appContext = XuqmSDK.appContext, - logApiUrl = bugCollectApiUrl, + logApiUrl = logApiUrl, appKey = XuqmSDK.appKey, getUserId = { XuqmSDK.getUserId() }, ) diff --git a/sdk-bugcollect/src/main/java/com/xuqm/sdk/bugcollect/LogQueue.kt b/sdk-bugcollect/src/main/java/com/xuqm/sdk/bugcollect/LogQueue.kt index a13d386..2ab2a39 100644 --- a/sdk-bugcollect/src/main/java/com/xuqm/sdk/bugcollect/LogQueue.kt +++ b/sdk-bugcollect/src/main/java/com/xuqm/sdk/bugcollect/LogQueue.kt @@ -94,7 +94,9 @@ internal class LogQueue( userId = obj.optNullableString("userId"), user = IssueEvent.UserInfo(id = obj.optNullableString("userId")), ) - LogUploader.uploadIssue(logApiUrl, event) + // 优先使用崩溃文件里保存的 URL(崩溃时可能远端配置未到达) + val uploadUrl = obj.optString("logApiUrl").takeIf { it.isNotBlank() } ?: logApiUrl + LogUploader.uploadIssue(uploadUrl, event) file.delete() }.onFailure { e -> Log.e(TAG, "Failed to upload crash: ${file.name}", e) diff --git a/sdk-core/src/main/java/com/xuqm/sdk/XuqmSDK.kt b/sdk-core/src/main/java/com/xuqm/sdk/XuqmSDK.kt index 5f62659..996661b 100644 --- a/sdk-core/src/main/java/com/xuqm/sdk/XuqmSDK.kt +++ b/sdk-core/src/main/java/com/xuqm/sdk/XuqmSDK.kt @@ -40,6 +40,9 @@ object XuqmSDK { private var initialized = false @Volatile private var initializedAppKey: String? = null @Volatile private var resolvedPlatformUrl: String = DEFAULT_PLATFORM_URL + + /** 初始化时使用的平台地址(同步可用,远端配置到达前即有值)。 */ + val platformUrl: String get() = resolvedPlatformUrl @Volatile private var loginSession: XuqmLoginSession? = null @Volatile private var userInfoValue: XuqmUserInfo? = null @Volatile var platformConfig: SdkPlatformConfig? = null diff --git a/sdk-core/src/main/java/com/xuqm/sdk/internal/XuqmInitializerProvider.kt b/sdk-core/src/main/java/com/xuqm/sdk/internal/XuqmInitializerProvider.kt index 819af2d..f17b8c9 100644 --- a/sdk-core/src/main/java/com/xuqm/sdk/internal/XuqmInitializerProvider.kt +++ b/sdk-core/src/main/java/com/xuqm/sdk/internal/XuqmInitializerProvider.kt @@ -19,12 +19,26 @@ class XuqmInitializerProvider : ContentProvider() { if (!XuqmSDK.isInitialized()) { XuqmSDK.autoInitialize(ctx) } + // 在 SDK 初始化后立即启动崩溃捕获,确保任何后续崩溃都能被落盘。 + // startCrashCapture 内部使用 platformUrl 兜底,无需等远端配置到达。 + startCrashCaptureIfAvailable() }.onFailure { e -> Log.w("XuqmSDK", "Auto-initialization skipped: ${e.message}") } return true } + private fun startCrashCaptureIfAvailable() { + runCatching { + val bugCollect = Class.forName("com.xuqm.sdk.bugcollect.BugCollect") + val companion = bugCollect.getField("INSTANCE").get(null) + val method = bugCollect.getMethod("startCrashCapture") + method.invoke(companion) + }.onFailure { + // sdk-bugcollect 未依赖时跳过,不影响其他功能 + } + } + override fun query(uri: Uri, projection: Array?, selection: String?, selectionArgs: Array?, sortOrder: String?): Cursor? = null override fun getType(uri: Uri): String? = null override fun insert(uri: Uri, values: ContentValues?): Uri? = null