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_WEBVIEW', defaultValue: false, description: '发布 sdk-webview')
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 {
@ -41,7 +41,7 @@ pipeline {
'sdk-update': params.MOD_UPDATE,
'sdk-webview': params.MOD_WEBVIEW,
'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 }
if (resolved.isEmpty()) {

查看文件

@ -13,7 +13,7 @@
├── TokenStoreEncryptedSharedPreferences
├── FileSDK上传 / 下载 / 打开文件)
├── ServiceEndpointRegistry各服务地址注册表
└── logApiUrl / logEnabled从平台配置获取
└── bugCollectApiUrl / bugCollectEnabled从平台配置获取
↓ implementation dep
子模块
├── sdk-update → APK 更新 / 版本检查
@ -21,7 +21,7 @@
├── sdk-im → IMWebSocket/STOMP 实时通信)
├── sdk-webview → WebView + JSBridgeCompose 组件)
├── sdk-license → 证书授权
└── sdk-log → 日志 / Crash 捕获 / 漏斗分析(依赖 sdk-core
└── sdk-bugcollect → 日志 / Crash 捕获 / 漏斗分析(依赖 sdk-core
```
## 依赖关系
@ -34,7 +34,7 @@ sdk-core (核心,无 SDK 内部依赖)
├── sdk-im (依赖 sdk-core
├── sdk-webview (依赖 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_WEBVIEW_VERSION=1.1.1
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
android {
namespace = "com.xuqm.sdk.log"
namespace = "com.xuqm.sdk.bugcollect"
compileSdk = 36
defaultConfig { minSdk = 24 }
publishing { singleVariant("release") { withSourcesJar() } }
@ -17,8 +17,8 @@ android {
}
}
val sdkLogVersion: String by lazy {
(project.findProperty("SDK_LOG_VERSION") as? String)?.takeIf { it.isNotBlank() }
val sdkBugCollectVersion: String by lazy {
(project.findProperty("SDK_BUGCOLLECT_VERSION") as? String)?.takeIf { it.isNotBlank() }
?: (project.findProperty("PUBLISH_VERSION") as? String)?.takeIf { it.isNotBlank() }
?: "0.0.1-SNAPSHOT"
}
@ -29,8 +29,8 @@ afterEvaluate {
create<MavenPublication>("release") {
from(components["release"])
groupId = "com.xuqm"
artifactId = "sdk-log"
version = sdkLogVersion
artifactId = "sdk-bugcollect"
version = sdkBugCollectVersion
}
}
repositories {

查看文件

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

查看文件

@ -1,4 +1,4 @@
package com.xuqm.sdk.log
package com.xuqm.sdk.bugcollect
object Fingerprint {
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 {
private val funnels = mutableMapOf<String, List<String>>()

查看文件

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

查看文件

@ -1,4 +1,4 @@
package com.xuqm.sdk.log
package com.xuqm.sdk.bugcollect
data class LogEvent(
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 }

查看文件

@ -1,9 +1,9 @@
package com.xuqm.sdk.log
package com.xuqm.sdk.bugcollect
import android.content.Context
import android.util.Log
import com.xuqm.sdk.log.internal.LogUploader
import com.xuqm.sdk.log.internal.LogStorage
import com.xuqm.sdk.bugcollect.internal.LogUploader
import com.xuqm.sdk.bugcollect.internal.LogStorage
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob
@ -24,7 +24,7 @@ internal class LogQueue(
) {
companion object {
private const val TAG = "XLog"
private const val TAG = "BugCollect"
private const val MAX_QUEUE_SIZE = 500
private const val BATCH_SIZE = 30
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.gradle.AppExtension
import org.gradle.api.Plugin
import org.gradle.api.Project
class XuqmLogPlugin : Plugin<Project> {
class XuqmBugCollectPlugin : Plugin<Project> {
override fun apply(target: Project) {
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.file.RegularFileProperty

查看文件

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

查看文件

@ -1,8 +1,8 @@
package com.xuqm.sdk.log.internal
package com.xuqm.sdk.bugcollect.internal
import android.util.Log
import com.xuqm.sdk.log.IssueEvent
import com.xuqm.sdk.log.LogEvent
import com.xuqm.sdk.bugcollect.IssueEvent
import com.xuqm.sdk.bugcollect.LogEvent
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient
import okhttp3.Request
@ -13,7 +13,7 @@ import java.util.concurrent.TimeUnit
internal object LogUploader {
private const val TAG = "XLog"
private const val TAG = "BugCollect"
private val client = OkHttpClient.Builder()
.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.appKey` | 当前 appKey |
| `XuqmSDK.platformConfig` | 平台配置init 后可用) |
| `XuqmSDK.logApiUrl` | 日志服务地址(从平台配置获取) |
| `XuqmSDK.logEnabled` | 是否启用日志上报 |
| `XuqmSDK.bugCollectApiUrl` | Bug 收集服务地址(从平台配置获取) |
| `XuqmSDK.bugCollectEnabled` | 是否启用 Bug 收集上报 |
| `XuqmSDK.useLocalServiceEndpoints(ip)` | 切换本地联调环境 |
| `XuqmSDK.tokenStore` | Token 存储EncryptedSharedPreferences |

查看文件

@ -45,12 +45,12 @@ object XuqmSDK {
@Volatile var platformConfig: SdkPlatformConfig? = null
private set
/** 日志上报服务地址,由平台配置下发;未开通日志服务时为 null。 */
@Volatile var logApiUrl: String? = null
/** Bug 收集上报服务地址,由平台配置下发;未开通时为 null。 */
@Volatile var bugCollectApiUrl: String? = null
private set
/** 是否启用客户端日志上报。 */
@Volatile var logEnabled: Boolean = false
/** 是否启用客户端 Bug 收集上报。 */
@Volatile var bugCollectEnabled: Boolean = false
private set
private val pendingInitCallbacks = mutableListOf<() -> Unit>()
@ -205,12 +205,12 @@ object XuqmSDK {
fileBaseUrl = cfg.fileServiceUrl?.trimEnd('/')?.plus("/") ?: base,
)
)
logApiUrl = cfg.logApiUrl
logEnabled = cfg.logEnabled ?: false
bugCollectApiUrl = cfg.bugCollectApiUrl
bugCollectEnabled = cfg.bugCollectEnabled ?: false
Log.i(
TAG,
"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
import com.google.gson.annotations.SerializedName
import retrofit2.http.GET
import retrofit2.http.Query
@ -26,8 +27,8 @@ data class SdkPlatformConfig(
val imWsUrl: String? = null,
/** 文件服务地址 */
val fileServiceUrl: String? = null,
/** 日志上报服务地址(旧服务端不返回时为 null */
val logApiUrl: String? = null,
/** 是否启用客户端日志上报(旧服务端不返回时为 null,视为 false */
val logEnabled: Boolean? = null,
/** Bug 收集上报服务地址(旧服务端不返回时为 null */
@SerializedName("logApiUrl") val bugCollectApiUrl: String? = null,
/** 是否启用客户端 Bug 收集上报(旧服务端不返回时为 null,视为 false */
@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-webview")
include(":sdk-license")
include(":sdk-log")
include(":sdk-bugcollect")
include(":sample-app")