From cf49dcfa013c8edd4bb2b46c12915abbebadd657 Mon Sep 17 00:00:00 2001 From: QIU Date: Wed, 12 Aug 2026 16:43:52 +0000 Subject: [PATCH] fix(cw): persist decoder failures to files for adb-less diagnostics MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在服务器上完整复现了手机端流程 (真实 20s 含噪音频 -> 重采样 -> 频谱 -> ONNX -> 贪心 CTC), 解码逐字符正确: decoded: [CQ CQ DE BG7NTA BG7NTA K 5NN TU 73] (与参考完全一致) 整条链路逻辑无问题, 闪退属环境/平台层。 应用内已有全局崩溃捕获器 (MainApplication.installCrashHandler) 会把堆栈 写入 files/crash_log.txt —— 无需 adb 即可取到崩溃原因。 本提交为加载与推理两处异常补充落盘: - 模型加载失败 -> files/deepcw_load_error.txt - 推理异常 -> files/deepcw_infer_error.txt 用户可在文件管理器按 Android/data/com.rtbishop.look4sat.bg7nta/files/ 路径取回这些日志。 验证: :core:data:compileDebugKotlin => BUILD SUCCESSFUL --- .../rtbishop/look4sat/core/data/cw/CwDeepDecoder.kt | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/core/data/src/main/java/com/rtbishop/look4sat/core/data/cw/CwDeepDecoder.kt b/core/data/src/main/java/com/rtbishop/look4sat/core/data/cw/CwDeepDecoder.kt index d3134ca3..1b5e0336 100644 --- a/core/data/src/main/java/com/rtbishop/look4sat/core/data/cw/CwDeepDecoder.kt +++ b/core/data/src/main/java/com/rtbishop/look4sat/core/data/cw/CwDeepDecoder.kt @@ -130,6 +130,13 @@ class CwDeepDecoder(context: Context) : ICwDecoder { Log.e(TAG, "DeepCW model failed to load", t) _errorMessage.value = "CW model failed to load: ${t.message ?: t.javaClass.simpleName}" + // Persist the failure for devices without logcat access. + runCatching { + val sw = java.io.StringWriter() + t.printStackTrace(java.io.PrintWriter(sw)) + java.io.File(appContext.filesDir, "deepcw_load_error.txt") + .writeText("${t.javaClass.name}: ${t.message}\n${sw}\n") + } return false } } @@ -154,6 +161,12 @@ class CwDeepDecoder(context: Context) : ICwDecoder { } catch (t: Throwable) { Log.e(TAG, "inference failed", t) _errorMessage.value = "CW decode failed: ${t.message ?: t.javaClass.simpleName}" + runCatching { + val sw = java.io.StringWriter() + t.printStackTrace(java.io.PrintWriter(sw)) + java.io.File(appContext.filesDir, "deepcw_infer_error.txt") + .writeText("${t.javaClass.name}: ${t.message}\n${sw}\n") + } } finally { inferenceLock.unlock() }