diff --git a/README.md b/README.md index 779c6f2..c73dea6 100644 --- a/README.md +++ b/README.md @@ -100,6 +100,7 @@ val sdk = DuooomiBleSDK( apiKey = "YOUR_API_KEY", brand = "YOUR_BRAND", // 设备品牌名,所有 RPC 必带 scanNamePrefix = "Duooomi-" // 扫描时按广播名前缀过滤 + // logLevel = BleLogLevel.OFF // 日志等级,默认 OFF(完全静默),排查时改 DEBUG ) ) ``` @@ -115,6 +116,26 @@ val sdk = DuooomiBleSDK( | `cdnHost` | | 默认 `https://cdn.bowong.cc/` | | `aniWidth` / `aniHeight` / `aniFps` | | ANI 转换参数,默认 `360 / 360 / "24"` | | `frameIntervalMs` | | 协议帧之间发送间隔(ms),默认 `35`,合法 `[0, 500]`;越界仅 warn,使用点 `coerceIn`。调高用于排查接收端丢帧 | +| `logLevel` | | 日志等级(`BleLogLevel.OFF/ERROR/WARN/INFO/DEBUG`),默认 `OFF`。详见下文 | + +### 5. 日志(BleLogLevel) + +SDK 内部所有日志统一走 `BleLog` → `android.util.Log`,分级 `OFF / ERROR / WARN / INFO / DEBUG`。集成方通过 `config.logLevel` 控制输出: + +```kotlin +// 对外发布:什么都不传,默认完全静默 +DuooomiBleSDK(context, DuooomiBleConfig(apiKey = "...", brand = "...", scanNamePrefix = "...")) + +// 本地排查:开 DEBUG 看到所有 BLE 帧、RPC opId、传输进度等 +DuooomiBleSDK(context, DuooomiBleConfig( + apiKey = "...", brand = "...", scanNamePrefix = "...", + logLevel = BleLogLevel.DEBUG +)) +``` + +- 等级单调:`WARN` 输出 warn + error;`INFO` 输出 info + warn + error;以此类推。 +- 日志按 category 分桶:`SDK / Scan / Connect / BLE / RPC / Command / Transfer / Firmware / Protocol / Decode / Config`,Logcat 按 tag `DuooomiBleSDK` + `[]` 过滤。 +- **Release 包剥离 `Log.d/i`**:Android 平台没有 iOS `#if DEBUG` 那样的编译期消除,默认 `OFF` 已足够静默;如需彻底剥离 `android.util.Log` 调用,可在宿主 ProGuard/R8 配置中加 `-assumenosideeffects class android.util.Log { public static *** d(...); public static *** i(...); }`。 ## API 参考 diff --git a/sdk/src/main/kotlin/com/duooomi/ble/DuooomiBleConfig.kt b/sdk/src/main/kotlin/com/duooomi/ble/DuooomiBleConfig.kt index 021d9c5..0cac2f7 100644 --- a/sdk/src/main/kotlin/com/duooomi/ble/DuooomiBleConfig.kt +++ b/sdk/src/main/kotlin/com/duooomi/ble/DuooomiBleConfig.kt @@ -1,6 +1,6 @@ package com.duooomi.ble -import com.duooomi.ble.utils.BleLog +import com.duooomi.ble.utils.BleLogLevel /** * SDK 全局配置,在初始化时一次性传入。 @@ -26,14 +26,12 @@ data class DuooomiBleConfig( * 协议帧之间的发送间隔(毫秒)。合法区间 `[0, 500]`,越界仅 warn,使用点会 clamp。 * 集成方一般无需调整;调高用于排查接收端丢帧/拥塞。默认 35。 */ - val frameIntervalMs: Int = 35 + val frameIntervalMs: Int = 35, + /** + * SDK 日志等级。默认 [BleLogLevel.OFF],对外发布完全静默;排查时改 [BleLogLevel.WARN] 或 [BleLogLevel.DEBUG]。 + */ + val logLevel: BleLogLevel = BleLogLevel.OFF ) { - init { - if (frameIntervalMs !in 0..500) { - BleLog.w("frameIntervalMs=$frameIntervalMs out of [0,500], will clamp at use site", "Config") - } - } - val normalizedCdnHost: String get() = if (cdnHost.endsWith("/")) cdnHost else "$cdnHost/" } diff --git a/sdk/src/main/kotlin/com/duooomi/ble/DuooomiBleSDK.kt b/sdk/src/main/kotlin/com/duooomi/ble/DuooomiBleSDK.kt index 173fe85..9dce5a5 100644 --- a/sdk/src/main/kotlin/com/duooomi/ble/DuooomiBleSDK.kt +++ b/sdk/src/main/kotlin/com/duooomi/ble/DuooomiBleSDK.kt @@ -97,7 +97,11 @@ class DuooomiBleSDK(context: Context, val config: DuooomiBleConfig) { private var flushJob: Job? = null init { - BleLog.i("SDK initialized (apiHost=${config.apiHost}, brand=${config.brand})", "SDK") + BleLog.level = config.logLevel + BleLog.i("SDK initialized (apiHost=${config.apiHost}, brand=${config.brand}, logLevel=${config.logLevel})", "SDK") + if (config.frameIntervalMs !in 0..500) { + BleLog.w("frameIntervalMs=${config.frameIntervalMs} out of [0,500], will clamp at use site", "Config") + } setupDisconnectHandler() protocolService.rawJsonEmitter = { evt -> _rawJsonEvents.tryEmit(evt) } // 启动时把持久化记录回放到 StateFlow diff --git a/sdk/src/main/kotlin/com/duooomi/ble/utils/BleLogger.kt b/sdk/src/main/kotlin/com/duooomi/ble/utils/BleLogger.kt index 63ea336..c56ca0d 100644 --- a/sdk/src/main/kotlin/com/duooomi/ble/utils/BleLogger.kt +++ b/sdk/src/main/kotlin/com/duooomi/ble/utils/BleLogger.kt @@ -2,22 +2,46 @@ package com.duooomi.ble.utils import android.util.Log +/** + * SDK 日志等级。集成方通过 [com.duooomi.ble.DuooomiBleConfig.logLevel] 设定。 + * 默认 [OFF],对外发布完全静默;排查时改 [WARN] 或 [DEBUG]。 + */ +enum class BleLogLevel(internal val priority: Int) { + OFF(0), + ERROR(1), + WARN(2), + INFO(3), + DEBUG(4) +} + internal object BleLog { private const val TAG = "DuooomiBleSDK" + /** 由 [com.duooomi.ble.DuooomiBleSDK] init 块写入;默认 [BleLogLevel.OFF]。 */ + @Volatile + var level: BleLogLevel = BleLogLevel.OFF + fun d(message: String, category: String = "General") { - Log.d(TAG, "[$category] $message") + if (level.priority >= BleLogLevel.DEBUG.priority) { + Log.d(TAG, "[$category] $message") + } } fun i(message: String, category: String = "General") { - Log.i(TAG, "[$category] $message") + if (level.priority >= BleLogLevel.INFO.priority) { + Log.i(TAG, "[$category] $message") + } } fun w(message: String, category: String = "General") { - Log.w(TAG, "[$category] $message") + if (level.priority >= BleLogLevel.WARN.priority) { + Log.w(TAG, "[$category] $message") + } } fun e(message: String, category: String = "General") { - Log.e(TAG, "[$category] $message") + if (level.priority >= BleLogLevel.ERROR.priority) { + Log.e(TAG, "[$category] $message") + } } }