refactor: sdk-log → sdk-bugcollect
- 目录/包名/类名/Gradle plugin 全部重命名 - XLog → BugCollect - logApiUrl/logEnabled → bugCollectApiUrl/bugCollectEnabled - assembleDebug 通过 Co-Authored-By: Claude <noreply@anthropic.com>
这个提交包含在:
父节点
89d11f73b8
当前提交
c8a482a5c0
4
Jenkinsfile
vendored
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 @@
|
||||
├── TokenStore(EncryptedSharedPreferences)
|
||||
├── FileSDK(上传 / 下载 / 打开文件)
|
||||
├── ServiceEndpointRegistry(各服务地址注册表)
|
||||
└── logApiUrl / logEnabled(从平台配置获取)
|
||||
└── bugCollectApiUrl / bugCollectEnabled(从平台配置获取)
|
||||
↓ implementation dep
|
||||
子模块
|
||||
├── sdk-update → APK 更新 / 版本检查
|
||||
@ -21,7 +21,7 @@
|
||||
├── sdk-im → IM(WebSocket/STOMP 实时通信)
|
||||
├── sdk-webview → WebView + JSBridge(Compose 组件)
|
||||
├── 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")
|
||||
|
||||
正在加载...
在新工单中引用
屏蔽一个用户