Files
MAG160C/docs/android_app/session_state.md
T

6.0 KiB
Raw Blame History

MAG160C 安卓统一 APP — 会话状态与心跳锚点

本文件是本任务("整合 4 个官方 APP 重写为 Android 16 现代化 APP")的心跳锚点。 每完成一个里程碑更新勾选;会话中断先读本文件 + reverse_apk_features.md 再按"下一步"继续。约定:不弹询问窗,按计划自主推进,重大分歧点才停下来问。

任务目标

  1. 逆向 C:\Project\MAG160C\app 4 个官方 APP(普通版/专业版/ThermoScope/demo)→ 已完成
  2. 整合全部功能开发一款安卓 APP:适配 Android 16API 36)、现代 UI、横竖屏、 无流氓文件夹、干爽简洁 → 进行中
  3. 背景问题:专业版在用户 Android 16 手机上花屏(根因见 reverse_apk_features.md §6

已完成的里程碑

  • 工具链:jadx 1.5.1C:\Tools\jadx)、Ghidra 12.1.2C:\Tools)、IDA MCP 可用
  • 4 APK 解包 + jadx 全量反编译(%TEMP%\opencode\apkwork\jadx_*
  • 普通版/专业版/ThermoScope/demo 功能清单 → docs/android_app/reverse_apk_features.md
  • IDApro libcoresdk.so GetOutputImage/copyBitmap 位图格式证实(ARGB_8888
  • Ghidralibcxsdk.so 导出 C++ API 清单(CFunctions 族,与 ARM64 coresdk 同源)
  • 花屏根因分析(32 位专属库 + targetSdk25 legacy 渲染栈)

关键事实速查(开发时直接用)

  • USBVID 0x833C PID 1EP 0x03/0x82/0x81/0x84,帧 28B 头+38400B+尾,15fps
  • 协议/渲染/温度算法全部已逆向:analysis/protocol_spec.md + csdk/(逐像素验证过的官方管线)
  • csdk 的 mag160c_render 无平台依赖:USB 帧 → 320×240 RGB24 + 探针测温(毫度)
  • DDT 标定文件:可从设备经 0x6BB6B66D/E 下载(官方 prepareProcessImage 同款),仓库有 build-artifacts/mag160c_official.ddt1.8MBSN 160043865
  • MDT 文件格式:reverse_apk_features.md §4152B Tail + 5 段布局 + ROI 256B 记录)
  • 温度:毫度 intMDT 解码走 ConvertResponse2Temperature + T2E(Revise) + CorrectTemperature

用户已确认的范围(2026-09-06)

  • 云功能:预留 Retrofit 接口模块,默认关闭
  • 扫码打标 + 任务巡检(sqlite/xml) + 红外基准图叠加:v1 全部实现
  • 网络互连(用户新增需求):主机手机插 USB 热像仪,局域网内另一台手机 远程实时预览——UDP 广播自动发现 + 手动添加内网 IP;自定义轻量协议 (控制通道 JSON + 图像流),不走厂商 33596/33597 协议

当前阶段

阶段 2/8 完成:纯Kotlin核心管线移植并逐字节验证(2026-09-06)

已完成里程碑(本任务)

  • 阶段1:轻量工具链定案——NDK/CMake/zig 全部卸载(-2.4GB),纯 Kotlin 方案: 渲染管线+温度算法+帧解析从 C 移植为 KotlinGradle 8.14.3 + SDK 已有组件
  • 阶段2:项目骨架(android/AGP 8.11.1 + Kotlin 2.2.0 + Compose BOM compileSdk/targetSdk 36minSdk 26),最小APK可构建
  • 阶段2:表数据自动生成 analysis/gen_kotlin_tables.py → OfficialTables.kt palette256 ARGB / T2E 646 / T2E274 / E2T_ACC_Q10
  • 阶段2:核心移植 FrameStream / RenderPipeline / TempMath(毫度测温)
  • 阶段2PC端参考工具 analysis/render_offline.cgcc 编译)+ 差分测试: Kotlin 输出与C参考逐字节一致(60帧序列,首渲染帧32,NUC/LUT/灰度/输出全同)
  • 阶段2FrameStream 分块重组测试 + 温度换算单调性测试全过

移植陷阱记录(教训)

  • C 无符号32位回绕:乘积/减法必须 u32() 掩码(cdfdenom、0xffc0000-iv70x40000、 (v-win_lo)*S 等)
  • lutRebuild 的 u12 基址是常量 iv7*0x10+0x10不是链式 u21v;u21v 只用于曲线钳制比较
  • Kotlin ByteArray 存 255 = -1lut[bfmax] != 0xFF 判断必须 (b.toInt() and 0xFF)
  • 暖机窗口内 FFC 状态机暂停(warm check 在 ffc_step 之前)——移植时保持顺序

下一步

阶段3b:拍照(MDT容器→MediaStore+ MP4录像(MediaCodec+ 可见光PIP。 随后阶段4媒体库、阶段5离线分析、阶段6设置/任务、阶段7验收、阶段8装机。

阶段3a 完成(2026-09-06 晚)

  • USB传输层 usb/UsbTransport.ktVID 0x833C 枚举/权限/claim/EP查找)
  • 命令协议 usb/MagProtocol.kt4B命令+FFC 8B0x5BB5B55B 信息块解析)
  • 直播会话 usb/IrSession.kt66b/66c/66f → FFC(0)x2 → 300ms → START(73) 读线程→FrameStream→RenderPipeline→帧回调;STOP(74);手动FFC
  • 官方12调色板 core/Palettes.kt(铁虹=官方提取表,其余为标准曲线近似)
  • UI骨架:底部导航4区(实时/相册/分析/设置,横屏自动切侧栏 NavigationRail
  • 实时画面 ui/live/SurfaceView+软件Canvas渲染(letterbox+数码变倍+OSD 中心温/最高最低温标记),ViewModel驱动,慢速测温定时器
  • DDT标定文件打包进 assets/mag160c.ddt
  • 全APK assembleDebug 成功(11.7MB,无material-icons膨胀)
  • 待实机验证USB流(需插设备)

开发计划(待确认后逐阶段执行)

  • 阶段 1:环境(cmdline-tools/NDK r27+/gradle 8.x + 16KB 对齐配置 + AGP 8.x
  • 阶段 2:新仓库 app-androidKotlin + Compose M3 + NDK 移植 csdk 渲染/温度 C 代码 + Kotlin USB 层)
  • 阶段 3:实时画面(USB 流+官方管线+OSD+ROI+调色板+FFC+增强+PIP 可见光+拍照 MDT+MP4 录像)
  • 阶段 4:媒体库(MediaStoreDCIM/MAG160C,无流氓文件夹)
  • 阶段 5:MDT 离线分析(缩放/ROI/参数/PDF 报告/备注)
  • 阶段 6:设置/任务巡检/可选云(Retrofit opt-in
  • 阶段 7Android 16 专项适配验收(16KB 对齐/横竖屏/深色/预测性返回)
  • 阶段 8:打包安装到用户手机实测

心跳约定

  • 每完成一个阶段:更新本文件勾选 + git commit(不 push)。
  • 中断恢复:读本文件 → 按"下一步"继续 → 环境检查命令:
    Test-Path C:\Users\ZXC\AppData\Local\Android\Sdk\ndk\<ver>
    Get-Command java; Get-Command gradle