refactor: sdk-log → sdk-bugcollect

- 目录/包名/类名/Gradle plugin 全部重命名
- XLog → BugCollect
- logApiUrl/logEnabled → bugCollectApiUrl/bugCollectEnabled
- assembleDebug 通过

Co-Authored-By: Claude <noreply@anthropic.com>
这个提交包含在:
XuqmGroup 2026-06-16 17:39:23 +08:00
父节点 89d11f73b8
当前提交 c8a482a5c0
共有 23 个文件被更改,包括 53 次插入52 次删除

4
Jenkinsfile vendored
查看文件

@ -17,7 +17,7 @@ pipeline {
booleanParam(name: 'MOD_UPDATE', defaultValue: false, description: '发布 sdk-update') booleanParam(name: 'MOD_UPDATE', defaultValue: false, description: '发布 sdk-update')
booleanParam(name: 'MOD_WEBVIEW', defaultValue: false, description: '发布 sdk-webview') booleanParam(name: 'MOD_WEBVIEW', defaultValue: false, description: '发布 sdk-webview')
booleanParam(name: 'MOD_LICENSE', defaultValue: false, description: '发布 sdk-license') booleanParam(name: 'MOD_LICENSE', defaultValue: false, description: '发布 sdk-license')
booleanParam(name: 'MOD_LOG', defaultValue: false, description: '发布 sdk-log') booleanParam(name: 'MOD_BUGCOLLECT', defaultValue: false, description: '发布 sdk-bugcollect')
} }
environment { environment {
@ -41,7 +41,7 @@ pipeline {
'sdk-update': params.MOD_UPDATE, 'sdk-update': params.MOD_UPDATE,
'sdk-webview': params.MOD_WEBVIEW, 'sdk-webview': params.MOD_WEBVIEW,
'sdk-license': params.MOD_LICENSE, 'sdk-license': params.MOD_LICENSE,
'sdk-log': params.MOD_LOG, 'sdk-bugcollect': params.MOD_BUGCOLLECT,
] ]
def resolved = moduleChecks.findAll { k, v -> v }.collect { k, v -> k } def resolved = moduleChecks.findAll { k, v -> v }.collect { k, v -> k }
if (resolved.isEmpty()) { if (resolved.isEmpty()) {

查看文件

@ -13,7 +13,7 @@
├── TokenStoreEncryptedSharedPreferences ├── TokenStoreEncryptedSharedPreferences
├── FileSDK上传 / 下载 / 打开文件) ├── FileSDK上传 / 下载 / 打开文件)
├── ServiceEndpointRegistry各服务地址注册表 ├── ServiceEndpointRegistry各服务地址注册表
└── logApiUrl / logEnabled从平台配置获取 └── bugCollectApiUrl / bugCollectEnabled从平台配置获取
↓ implementation dep ↓ implementation dep
子模块 子模块
├── sdk-update → APK 更新 / 版本检查 ├── sdk-update → APK 更新 / 版本检查
@ -21,7 +21,7 @@
├── sdk-im → IMWebSocket/STOMP 实时通信) ├── sdk-im → IMWebSocket/STOMP 实时通信)
├── sdk-webview → WebView + JSBridgeCompose 组件) ├── sdk-webview → WebView + JSBridgeCompose 组件)
├── sdk-license → 证书授权 ├── sdk-license → 证书授权
└── sdk-log → 日志 / Crash 捕获 / 漏斗分析(依赖 sdk-core └── sdk-bugcollect → 日志 / Crash 捕获 / 漏斗分析(依赖 sdk-core
``` ```
## 依赖关系 ## 依赖关系
@ -34,7 +34,7 @@ sdk-core (核心,无 SDK 内部依赖)
├── sdk-im (依赖 sdk-core ├── sdk-im (依赖 sdk-core
├── sdk-webview (依赖 sdk-core ├── sdk-webview (依赖 sdk-core
├── sdk-license (依赖 sdk-core ├── sdk-license (依赖 sdk-core
└── sdk-log (依赖 sdk-core └── sdk-bugcollect(依赖 sdk-core
``` ```
## 用户状态分发 ## 用户状态分发

查看文件

@ -9,4 +9,4 @@ SDK_PUSH_VERSION=1.1.0
SDK_UPDATE_VERSION=1.1.3 SDK_UPDATE_VERSION=1.1.3
SDK_WEBVIEW_VERSION=1.1.1 SDK_WEBVIEW_VERSION=1.1.1
SDK_LICENSE_VERSION=1.1.0 SDK_LICENSE_VERSION=1.1.0
SDK_LOG_VERSION=1.0.0-SNAPSHOT SDK_BUGCOLLECT_VERSION=1.0.0-SNAPSHOT

查看文件

@ -6,7 +6,7 @@ plugins {
group = rootProject.group group = rootProject.group
android { android {
namespace = "com.xuqm.sdk.log" namespace = "com.xuqm.sdk.bugcollect"
compileSdk = 36 compileSdk = 36
defaultConfig { minSdk = 24 } defaultConfig { minSdk = 24 }
publishing { singleVariant("release") { withSourcesJar() } } publishing { singleVariant("release") { withSourcesJar() } }
@ -17,8 +17,8 @@ android {
} }
} }
val sdkLogVersion: String by lazy { val sdkBugCollectVersion: String by lazy {
(project.findProperty("SDK_LOG_VERSION") as? String)?.takeIf { it.isNotBlank() } (project.findProperty("SDK_BUGCOLLECT_VERSION") as? String)?.takeIf { it.isNotBlank() }
?: (project.findProperty("PUBLISH_VERSION") as? String)?.takeIf { it.isNotBlank() } ?: (project.findProperty("PUBLISH_VERSION") as? String)?.takeIf { it.isNotBlank() }
?: "0.0.1-SNAPSHOT" ?: "0.0.1-SNAPSHOT"
} }
@ -29,8 +29,8 @@ afterEvaluate {
create<MavenPublication>("release") { create<MavenPublication>("release") {
from(components["release"]) from(components["release"])
groupId = "com.xuqm" groupId = "com.xuqm"
artifactId = "sdk-log" artifactId = "sdk-bugcollect"
version = sdkLogVersion version = sdkBugCollectVersion
} }
} }
repositories { repositories {

查看文件

@ -1,8 +1,8 @@
package com.xuqm.sdk.log package com.xuqm.sdk.bugcollect
import com.xuqm.sdk.XuqmSDK import com.xuqm.sdk.XuqmSDK
object XLog { object BugCollect {
private var logLevel: LogLevel = LogLevel.WARN private var logLevel: LogLevel = LogLevel.WARN
private var environment: String = "production" private var environment: String = "production"
@ -47,10 +47,10 @@ object XLog {
fun startCrashCapture() { fun startCrashCapture() {
if (crashCaptureStarted) return if (crashCaptureStarted) return
val logApiUrl = XuqmSDK.logApiUrl ?: return val bugCollectApiUrl = XuqmSDK.bugCollectApiUrl ?: return
crashCaptureStarted = true crashCaptureStarted = true
CrashCapture.start( CrashCapture.start(
logApiUrl = logApiUrl, logApiUrl = bugCollectApiUrl,
appKey = XuqmSDK.appKey, appKey = XuqmSDK.appKey,
getUserId = { XuqmSDK.getUserId() }, getUserId = { XuqmSDK.getUserId() },
) )
@ -61,12 +61,12 @@ object XLog {
FunnelTracker.define(id, steps) FunnelTracker.define(id, steps)
} }
private fun isReady() = XuqmSDK.isInitialized() && XuqmSDK.logEnabled private fun isReady() = XuqmSDK.isInitialized() && XuqmSDK.bugCollectEnabled
private fun queue(): LogQueue { private fun queue(): LogQueue {
return queue ?: synchronized(this) { return queue ?: synchronized(this) {
queue ?: LogQueue( queue ?: LogQueue(
logApiUrl = XuqmSDK.logApiUrl ?: "", logApiUrl = XuqmSDK.bugCollectApiUrl ?: "",
appKey = XuqmSDK.appKey, appKey = XuqmSDK.appKey,
appContext = XuqmSDK.appContext, appContext = XuqmSDK.appContext,
).also { queue = it } ).also { queue = it }

查看文件

@ -1,6 +1,6 @@
package com.xuqm.sdk.log package com.xuqm.sdk.bugcollect
import com.xuqm.sdk.log.internal.LogStorage import com.xuqm.sdk.bugcollect.internal.LogStorage
internal object CrashCapture { internal object CrashCapture {
fun start(logApiUrl: String, appKey: String, getUserId: () -> String?) { fun start(logApiUrl: String, appKey: String, getUserId: () -> String?) {

查看文件

@ -1,4 +1,4 @@
package com.xuqm.sdk.log package com.xuqm.sdk.bugcollect
object Fingerprint { object Fingerprint {
fun compute(type: String, message: String, stack: String): String { fun compute(type: String, message: String, stack: String): String {

查看文件

@ -1,4 +1,4 @@
package com.xuqm.sdk.log package com.xuqm.sdk.bugcollect
object FunnelTracker { object FunnelTracker {
private val funnels = mutableMapOf<String, List<String>>() private val funnels = mutableMapOf<String, List<String>>()

查看文件

@ -1,4 +1,4 @@
package com.xuqm.sdk.log package com.xuqm.sdk.bugcollect
data class IssueEvent( data class IssueEvent(
val type: String, val type: String,

查看文件

@ -1,4 +1,4 @@
package com.xuqm.sdk.log package com.xuqm.sdk.bugcollect
data class LogEvent( data class LogEvent(
val name: String, val name: String,

查看文件

@ -1,3 +1,3 @@
package com.xuqm.sdk.log package com.xuqm.sdk.bugcollect
enum class LogLevel { DEBUG, INFO, WARN, ERROR, NONE } enum class LogLevel { DEBUG, INFO, WARN, ERROR, NONE }

查看文件

@ -1,9 +1,9 @@
package com.xuqm.sdk.log package com.xuqm.sdk.bugcollect
import android.content.Context import android.content.Context
import android.util.Log import android.util.Log
import com.xuqm.sdk.log.internal.LogUploader import com.xuqm.sdk.bugcollect.internal.LogUploader
import com.xuqm.sdk.log.internal.LogStorage import com.xuqm.sdk.bugcollect.internal.LogStorage
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.SupervisorJob
@ -24,7 +24,7 @@ internal class LogQueue(
) { ) {
companion object { companion object {
private const val TAG = "XLog" private const val TAG = "BugCollect"
private const val MAX_QUEUE_SIZE = 500 private const val MAX_QUEUE_SIZE = 500
private const val BATCH_SIZE = 30 private const val BATCH_SIZE = 30
private const val FLUSH_INTERVAL_MS = 10_000L private const val FLUSH_INTERVAL_MS = 10_000L

查看文件

@ -1,11 +1,11 @@
package com.xuqm.sdk.log.gradle package com.xuqm.sdk.bugcollect.gradle
import com.android.build.api.variant.ApplicationVariant import com.android.build.api.variant.ApplicationVariant
import com.android.build.gradle.AppExtension import com.android.build.gradle.AppExtension
import org.gradle.api.Plugin import org.gradle.api.Plugin
import org.gradle.api.Project import org.gradle.api.Project
class XuqmLogPlugin : Plugin<Project> { class XuqmBugCollectPlugin : Plugin<Project> {
override fun apply(target: Project) { override fun apply(target: Project) {
val android = target.extensions.findByType(AppExtension::class.java) ?: return val android = target.extensions.findByType(AppExtension::class.java) ?: return

查看文件

@ -1,4 +1,4 @@
package com.xuqm.sdk.log.gradle package com.xuqm.sdk.bugcollect.gradle
import org.gradle.api.DefaultTask import org.gradle.api.DefaultTask
import org.gradle.api.file.RegularFileProperty import org.gradle.api.file.RegularFileProperty

查看文件

@ -1,4 +1,4 @@
package com.xuqm.sdk.log.internal package com.xuqm.sdk.bugcollect.internal
import android.content.Context import android.content.Context
import org.json.JSONObject import org.json.JSONObject
@ -13,7 +13,7 @@ internal object LogStorage {
/** /**
* 同步写崩溃信息到文件系统UncaughtExceptionHandler 中调用 * 同步写崩溃信息到文件系统UncaughtExceptionHandler 中调用
* 文件将在下次启动时由 [com.xuqm.sdk.log.LogQueue.uploadPendingCrashes] 上报 * 文件将在下次启动时由 [com.xuqm.sdk.bugcollect.LogQueue.uploadPendingCrashes] 上报
*/ */
fun saveCrash( fun saveCrash(
throwable: Throwable, throwable: Throwable,

查看文件

@ -1,8 +1,8 @@
package com.xuqm.sdk.log.internal package com.xuqm.sdk.bugcollect.internal
import android.util.Log import android.util.Log
import com.xuqm.sdk.log.IssueEvent import com.xuqm.sdk.bugcollect.IssueEvent
import com.xuqm.sdk.log.LogEvent import com.xuqm.sdk.bugcollect.LogEvent
import okhttp3.MediaType.Companion.toMediaType import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
@ -13,7 +13,7 @@ import java.util.concurrent.TimeUnit
internal object LogUploader { internal object LogUploader {
private const val TAG = "XLog" private const val TAG = "BugCollect"
private val client = OkHttpClient.Builder() private val client = OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS) .connectTimeout(10, TimeUnit.SECONDS)

查看文件

@ -0,0 +1 @@
implementation-class=com.xuqm.sdk.bugcollect.gradle.XuqmBugCollectPlugin

查看文件

@ -41,8 +41,8 @@ XuqmSDK.initialize(context, appKey = "xxx", platformUrl = "https://xxx")
| `XuqmSDK.getUserInfo()` | 获取当前用户信息 | | `XuqmSDK.getUserInfo()` | 获取当前用户信息 |
| `XuqmSDK.appKey` | 当前 appKey | | `XuqmSDK.appKey` | 当前 appKey |
| `XuqmSDK.platformConfig` | 平台配置init 后可用) | | `XuqmSDK.platformConfig` | 平台配置init 后可用) |
| `XuqmSDK.logApiUrl` | 日志服务地址(从平台配置获取) | | `XuqmSDK.bugCollectApiUrl` | Bug 收集服务地址(从平台配置获取) |
| `XuqmSDK.logEnabled` | 是否启用日志上报 | | `XuqmSDK.bugCollectEnabled` | 是否启用 Bug 收集上报 |
| `XuqmSDK.useLocalServiceEndpoints(ip)` | 切换本地联调环境 | | `XuqmSDK.useLocalServiceEndpoints(ip)` | 切换本地联调环境 |
| `XuqmSDK.tokenStore` | Token 存储EncryptedSharedPreferences | | `XuqmSDK.tokenStore` | Token 存储EncryptedSharedPreferences |

查看文件

@ -45,12 +45,12 @@ object XuqmSDK {
@Volatile var platformConfig: SdkPlatformConfig? = null @Volatile var platformConfig: SdkPlatformConfig? = null
private set private set
/** 日志上报服务地址,由平台配置下发;未开通日志服务时为 null。 */ /** Bug 收集上报服务地址,由平台配置下发;未开通时为 null。 */
@Volatile var logApiUrl: String? = null @Volatile var bugCollectApiUrl: String? = null
private set private set
/** 是否启用客户端日志上报。 */ /** 是否启用客户端 Bug 收集上报。 */
@Volatile var logEnabled: Boolean = false @Volatile var bugCollectEnabled: Boolean = false
private set private set
private val pendingInitCallbacks = mutableListOf<() -> Unit>() private val pendingInitCallbacks = mutableListOf<() -> Unit>()
@ -205,12 +205,12 @@ object XuqmSDK {
fileBaseUrl = cfg.fileServiceUrl?.trimEnd('/')?.plus("/") ?: base, fileBaseUrl = cfg.fileServiceUrl?.trimEnd('/')?.plus("/") ?: base,
) )
) )
logApiUrl = cfg.logApiUrl bugCollectApiUrl = cfg.bugCollectApiUrl
logEnabled = cfg.logEnabled ?: false bugCollectEnabled = cfg.bugCollectEnabled ?: false
Log.i( Log.i(
TAG, TAG,
"Platform config applied [${if (platformUrl == DEFAULT_PLATFORM_URL) "public" else "private"}]:" + "Platform config applied [${if (platformUrl == DEFAULT_PLATFORM_URL) "public" else "private"}]:" +
" apiBase=$apiBase imWsUrl=${cfg.imWsUrl} logEnabled=$logEnabled" " apiBase=$apiBase imWsUrl=${cfg.imWsUrl} bugCollectEnabled=$bugCollectEnabled"
) )
} }

查看文件

@ -1,5 +1,6 @@
package com.xuqm.sdk.network package com.xuqm.sdk.network
import com.google.gson.annotations.SerializedName
import retrofit2.http.GET import retrofit2.http.GET
import retrofit2.http.Query import retrofit2.http.Query
@ -26,8 +27,8 @@ data class SdkPlatformConfig(
val imWsUrl: String? = null, val imWsUrl: String? = null,
/** 文件服务地址 */ /** 文件服务地址 */
val fileServiceUrl: String? = null, val fileServiceUrl: String? = null,
/** 日志上报服务地址(旧服务端不返回时为 null */ /** Bug 收集上报服务地址(旧服务端不返回时为 null */
val logApiUrl: String? = null, @SerializedName("logApiUrl") val bugCollectApiUrl: String? = null,
/** 是否启用客户端日志上报(旧服务端不返回时为 null,视为 false */ /** 是否启用客户端 Bug 收集上报(旧服务端不返回时为 null,视为 false */
val logEnabled: Boolean? = null, @SerializedName("logEnabled") val bugCollectEnabled: Boolean? = null,
) )

查看文件

@ -1 +0,0 @@
implementation-class=com.xuqm.sdk.log.gradle.XuqmLogPlugin

查看文件

@ -26,5 +26,5 @@ include(":sdk-push")
include(":sdk-update") include(":sdk-update")
include(":sdk-webview") include(":sdk-webview")
include(":sdk-license") include(":sdk-license")
include(":sdk-log") include(":sdk-bugcollect")
include(":sample-app") include(":sample-app")