From aca0d009a8c516ff048284e8bfb31e17891b9a71 Mon Sep 17 00:00:00 2001 From: XuqmGroup Date: Thu, 18 Jun 2026 10:47:38 +0800 Subject: [PATCH] =?UTF-8?q?feat(bugcollect):=20=E4=BD=BF=E7=94=A8=20device?= =?UTF-8?q?Id=20=E4=BD=9C=E4=B8=BA=20userId=20=E5=85=9C=E5=BA=95=EF=BC=8C?= =?UTF-8?q?=E4=BF=9D=E9=9A=9C=E5=BD=B1=E5=93=8D=E8=AE=BE=E5=A4=87=E6=95=B0?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - XuqmSDK 新增 deviceId 属性:首次生成 UUID 存入 SharedPreferences,后续不变 - BugCollect 上报事件时 userId 改为 getUserId() ?: deviceId,未登录也能统计影响设备数 - BugCollectInitProvider 崩溃拦截同步使用 deviceId 兜底 Co-Authored-By: Claude Sonnet 4.6 --- .../java/com/xuqm/sdk/bugcollect/BugCollect.kt | 16 ++++++++-------- .../internal/BugCollectInitProvider.kt | 2 +- sdk-core/src/main/java/com/xuqm/sdk/XuqmSDK.kt | 16 ++++++++++++++++ 3 files changed, 25 insertions(+), 9 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 3e058d1..828b31c 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 @@ -45,7 +45,7 @@ object BugCollect { if (!isReady()) return queue().push(LogEvent( name = name, properties = properties, - appKey = XuqmSDK.appKey, userId = XuqmSDK.getUserId(), + appKey = XuqmSDK.appKey, userId = XuqmSDK.getUserId() ?: XuqmSDK.deviceId, platform = "android", release = appVersion(), environment = environment, sdk = IssueEvent.SdkInfo(SDK_NAME, SDK_VERSION), )) @@ -73,8 +73,8 @@ object BugCollect { breadcrumbs = crumbs, release = appVersion(), environment = environment, - userId = XuqmSDK.getUserId(), - user = IssueEvent.UserInfo(id = XuqmSDK.getUserId()), + userId = XuqmSDK.getUserId() ?: XuqmSDK.deviceId, + user = IssueEvent.UserInfo(id = XuqmSDK.getUserId() ?: XuqmSDK.deviceId), device = buildDeviceInfo(), tags = tags, )) @@ -100,8 +100,8 @@ object BugCollect { breadcrumbs = crumbs, release = appVersion(), environment = environment, - userId = XuqmSDK.getUserId(), - user = IssueEvent.UserInfo(id = XuqmSDK.getUserId()), + userId = XuqmSDK.getUserId() ?: XuqmSDK.deviceId, + user = IssueEvent.UserInfo(id = XuqmSDK.getUserId() ?: XuqmSDK.deviceId), device = buildDeviceInfo(), tags = tags, )) @@ -118,8 +118,8 @@ object BugCollect { exception = IssueEvent.ExceptionInfo(type = "Warning", value = message), release = appVersion(), environment = environment, - userId = XuqmSDK.getUserId(), - user = IssueEvent.UserInfo(id = XuqmSDK.getUserId()), + userId = XuqmSDK.getUserId() ?: XuqmSDK.deviceId, + user = IssueEvent.UserInfo(id = XuqmSDK.getUserId() ?: XuqmSDK.deviceId), tags = tags, )) } @@ -141,7 +141,7 @@ object BugCollect { CrashCapture.start( appContext = XuqmSDK.appContext, appKey = XuqmSDK.appKey, - getUserId = { XuqmSDK.getUserId() }, + getUserId = { XuqmSDK.getUserId() ?: XuqmSDK.deviceId }, ) queue().uploadPendingCrashes() } diff --git a/sdk-bugcollect/src/main/java/com/xuqm/sdk/bugcollect/internal/BugCollectInitProvider.kt b/sdk-bugcollect/src/main/java/com/xuqm/sdk/bugcollect/internal/BugCollectInitProvider.kt index 6b96682..005a10e 100644 --- a/sdk-bugcollect/src/main/java/com/xuqm/sdk/bugcollect/internal/BugCollectInitProvider.kt +++ b/sdk-bugcollect/src/main/java/com/xuqm/sdk/bugcollect/internal/BugCollectInitProvider.kt @@ -40,7 +40,7 @@ internal class BugCollectInitProvider : ContentProvider() { CrashCapture.start( appContext = ctx, appKey = XuqmSDK.appKey, - getUserId = { XuqmSDK.getUserId() }, + getUserId = { XuqmSDK.getUserId() ?: XuqmSDK.deviceId }, ) // ── Phase 2:远端配置就绪后上传 ───────────────────────────────────────── 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 996661b..308b5a3 100644 --- a/sdk-core/src/main/java/com/xuqm/sdk/XuqmSDK.kt +++ b/sdk-core/src/main/java/com/xuqm/sdk/XuqmSDK.kt @@ -43,6 +43,11 @@ object XuqmSDK { /** 初始化时使用的平台地址(同步可用,远端配置到达前即有值)。 */ val platformUrl: String get() = resolvedPlatformUrl + + /** 持久设备 ID(UUID,首次生成后永不变更)。未上报 userId 的场景可用此 ID 追踪影响设备数。 */ + @Volatile var deviceId: String = "" + private set + @Volatile private var loginSession: XuqmLoginSession? = null @Volatile private var userInfoValue: XuqmUserInfo? = null @Volatile var platformConfig: SdkPlatformConfig? = null @@ -121,6 +126,7 @@ object XuqmSDK { config = SDKConfig(appKey, logLevel) appContext = applicationContext tokenStore = TokenStore(applicationContext) + deviceId = resolveDeviceId(applicationContext) ApiClient.init(config, tokenStore) initializedAppKey = appKey initialized = true @@ -217,6 +223,16 @@ object XuqmSDK { ) } + private fun resolveDeviceId(context: Context): String { + val prefs = context.getSharedPreferences("xuqm_sdk_core", android.content.Context.MODE_PRIVATE) + val key = "device_id" + val stored = prefs.getString(key, null) + if (!stored.isNullOrBlank()) return stored + val generated = java.util.UUID.randomUUID().toString() + prefs.edit().putString(key, generated).apply() + return generated + } + private fun platformInitException(platformUrl: String, appKey: String, cause: Throwable): Throwable { val kind = if (platformUrl == DEFAULT_PLATFORM_URL) "公有平台" else "私有化平台 $platformUrl" return IllegalStateException(