android: 统一APP工程骨架 + 官方渲染管线Kotlin移植(与C参考逐字节一致)
This commit is contained in:
@@ -0,0 +1,105 @@
|
||||
# MAG160C 官方 APP 逆向功能总表(2026-09-06)
|
||||
|
||||
> 用 jadx 1.5.1 反编译 4 个 APK,IDA(MCP)分析 pro 版 libcoresdk.so(v7a),
|
||||
> Ghidra 12.1.2 headless 分析普通版 libcxsdk.so。反编译工作副本在
|
||||
> `%TEMP%\opencode\apkwork\jadx_*`(临时目录,已删可重跑 jadx 命令见本文末尾)。
|
||||
|
||||
## 1. 四个 APP 身份
|
||||
|
||||
| 包名 | 版本 | 名称 | 原生库 | 定位 |
|
||||
|---|---|---|---|---|
|
||||
| cn.com.magnity.magnitycx | 1.1.4 (114) | MAG-Cx 普通版 | libcxsdk + FFmpeg (仅 armeabi) | USB 实时拍摄/录像 |
|
||||
| cn.com.magnity.magnitymx | 2.0.7 (27) | MAG-Mx 专业版 | libcoresdk(新版libusb) + libthermogroupsdk (仅 armeabi-v7a) | USB+网络设备、任务巡检、云 |
|
||||
| cn.com.magnity.thermoscope | 1.0.2 (2) | Thermo Scope | libthermogroupsdk (仅 armeabi-v7a) | MDT 热像文件离线分析+PDF 报告 |
|
||||
| cn.com.magnity.coresdksample | 1.0 | CoreSdkSample | libcoresdk (旧) | SDK 示例(无独立功能) |
|
||||
|
||||
- 全部 targetSdk 25(Android 7.1 时代);专业版/普通版 MainActivity 锁定 landscape。
|
||||
- USB:VID 0x833C。普通版 PID=1;专业版同时支持 PID=1(160Core/coresdk) 与 PID=2(Mx 网络机芯)。
|
||||
|
||||
## 2. 普通版 MAG-Cx 功能(jadx_normal/sources/cn/com/magnity/magnitycx)
|
||||
|
||||
**实时画面**:SurfaceView 软件渲染(lockCanvas→drawBitmap),IR 160×120→640×480 合成画布
|
||||
- 12 调色板(白热/黑热/铁虹/彩虹/琥珀/金秋/寒冬/热金属/喷射/红饱和/高对比/红热)DialogFragmentPalette.java
|
||||
- 中心点测温、全屏最高/最低温追踪(无/最高/最低/全部)、矩形 ROI(最值+均值,MAX_ROI_NUM=1)ImageViewer.java
|
||||
- PIP 可见光小窗(手机 Camera API 预览,可拖动/三档尺寸)ImageViewerVisible.java;无像素级融合
|
||||
- 数码变倍 1/2/4/8/16x(160C 仅 1/2/4 循环);双击=手动 FFC;Fling 切拍照/录像
|
||||
- 录像 MP4(FFmpeg avcodec-57 + libcxsdk doRecording,640×480,2048kbps/20fps)
|
||||
- 拍照 JPEG q100 640×480 含 OSD(十字/最值/水印/激光);仅 C3P 另存 .ddt 伴随文件
|
||||
- 横竖屏 OrientationEventListener 实时切 native 旋转角;来电自动断 USB;退后台 500ms deinit
|
||||
|
||||
**USB/协议**(UsbCommunication.java,端点 0x03/0x82/0x81/0x84,28B 帧头尾协议同 csdk)
|
||||
- 连接握手:GetParameter1/2 → GetCaliInfo → 无本地标定则 GetCaliFile 下载(others\{产品}.{SN}.{日期})
|
||||
- 启动:native startProcess(...) + StartTransferImg;ThreadImgRecv/Process 双线程;16 帧一次查开机时长并按时间表 FFC
|
||||
- 命令集 P2D_*(0x6BB6B6xx)与 D2P_*(0x5BB5B5xx),与 csdk/protocol_spec.md 完全一致
|
||||
|
||||
**设置项**:可见光尺寸、温度追踪目标、矩形测温开关、H/V 翻转、变倍、辐射率 4 档(1.00/0.90/0.80/0.70)、帧率高/低、移动光标
|
||||
**媒体库**:GridView+LRU、多选分享/删除、ViewPager 浏览、视频外部播放器
|
||||
**升级**:http://www.magnity.com.cn/APPs/UpgradeInfo(产品键 MAG-Cx)
|
||||
|
||||
## 3. 专业版 MAG-Mx 功能(jadx_pro/sources/cn/com/magnity/magnitymx)
|
||||
|
||||
**双设备模型**:CXDeviceModel(USB coresdk,PID1)+ DeviceModel(网络/云/USB-Mx thermogroup,PID2;命令口 33596、图像口 33597,云中继 121.43.190.114,账密 magnity/any123、admin/admin123)
|
||||
|
||||
**实时画面**(LiveFragment+MainActivity,竖直 LinearLayout)
|
||||
- 工具栏:任务面板、logo 点击=FFC、设置、调参条(tunebar)、PIP 切换(长按=可见光窗口调整)、最高温追踪、缩略图、ROI、拍照(长按=MGS 录像)、暂停、设备列表
|
||||
- tunebar 8 项:手动拉伸/等温线/发射率/调色板/温度报警/任务/红外基准图/扫码/码流
|
||||
- 12 调色板;发射率 35 种材料表+自定义(DialogFragmentEmissivity)
|
||||
- ROI:点/线/框,区域 ROI 弹名称+报警上下限(DialogFragmentRoiAlarmTempAddEdit);报警声+红色闪烁
|
||||
- 可见光 Camera2 融合(alpha 混合、拖动/双指缩放、拍照取 JPEG 写入 MDT);闪光灯
|
||||
- 图像增强:手动两点拉伸/自动拉伸(range5)/等温线;图像旋转 0/90/180/270
|
||||
- 参考图叠加(基准图 alpha 调整,拍照时 blendBitmap 融合)
|
||||
- 码流类型:温度流2/视频流4/混合流6(网络设备)
|
||||
- 拍照 = 640×480 JPG + saveDDT2Buffer + ROI + 可见光 + GPS(EXIF) → **MDT 容器** saveMDT,文件名 01-yyMMddHHmmss-<任务名/扫码结果>.jpg
|
||||
- **录像 = SDK .mgs 专有格式**(仅长按触发,视频流禁用);VideoEncoder MP4 通道是死代码
|
||||
- 拼接全景:仅 CX/USB 通道实现(startStitching)
|
||||
- 云台:WiFi SSID 含 HERO-RC → UDP 8484 协议遥控拍照/模式切换(UDPHelper)
|
||||
- 扫码:ZXing,结果作文件名标记
|
||||
- 音量键拍照;GPS 写 EXIF;云设备 10 分钟闲置断流
|
||||
|
||||
**任务巡检系统**(task/ + assets/tasks)
|
||||
- SqliteTaskParser:.sqlite 库(省-市-工区-电压-变电站五级 + task 树 + capture_status/order)
|
||||
- XmlTaskParser:旧 XML 任务;选库后侧滑两级树,点选→参考图叠加→拍照自动跳下一项
|
||||
- 任务库放 /sdcard/magnity/mx/tasks(首拷自 assets;云下载 v1/account/taskfiles/{taskId})
|
||||
|
||||
**媒体库**(media/):宫格、多选(上传/分享/删除/全选)、NetworkManager 上传队列、单张浏览、"设为参考图"、"分析"= 调起 ThermoScope(intent thermoscope://路径)、GPS 跳地图
|
||||
**云平台**:Retrofit REST(cloudapi.magnity.com.cn):login/logout/getDevices/upload(task_id)/taskfiles;本地 magnity_mx_files.db 记 MD5 上传状态;CloudSyncTask 云同步;MagnityNetworkService 前台服务上传
|
||||
**设置**:账户/相机(仅图像旋转)/语言(自动/简/繁/EN)/主题(占位)/检查更新(magnity.com.cn/APPs/mx)/关于
|
||||
**数据库**:Room cloud_device/local_device + SQLite magnity_mx_files.db
|
||||
|
||||
## 4. ThermoScope 功能(jadx_thermoscope/sources/cn/com/magnity/thermoscope)
|
||||
|
||||
- **MDT 容器格式**(types/):尾部 152B Tail{0x5BB5B57B + 5 段绝对偏移};段序 JPG 缩略图→DDT(136B头+38400B 原始 u16 帧)→VIS 可见光→LAB(每 ROI 256B:type/最值/均值/位置/坐标/色/发射率/报警上下限/名字)→TXT(编码 GB18030/GBK/UTF-8)→AUD;段间 4 字节对齐;支持裸 DDT
|
||||
- 媒体库:扫 DCIM/Magnity/*.jpg(内容实为 MDT),同目录打开模式,按文件名内嵌时间排序
|
||||
- 单张分析(SingleMediaActivity + ScopeSurfaceView 软件渲染):
|
||||
- 11 调色板切换(回写 DDT);参数滑杆:环境温度 -40~80℃ / 发射率 0~1 / 窗口透过率 0~1(native 重算+回写)
|
||||
- 点测温 Pt*(3x3 探针+发射率修正)、框测温 Rt*(min/max/ave+minPos/maxPos)、垂直滑动切红外/可见光
|
||||
- 双指缩放 1~4x、平移;max/min 追踪标记;色标条+6 刻度;保存 640×480 PNG 快照+水印
|
||||
- 相机信息(SN/分辨率/版本/时间/海拔/经纬度);文字备注;语音段透传
|
||||
- PDF 报告(PdfCreator,tejpratapsingh PDFUtil):标题、7×4 基本信息、热像图、9 级色标、整体+ROI 分析表、结果/建议、测试员;输出 DCIM/Magnity/reports/;ReportSettingActivity 15 项报告参数
|
||||
- RelayActivity:外部打开 .mdt/.ddt/.jpg/pdf 分发
|
||||
|
||||
## 5. SDK(cn/com/magnity/coresdk + sdk)
|
||||
|
||||
三代演进:coresdk(USB-only, PID1) → thermogroupsdk 基础版(thermoscope: +网络/云/PTZ/人脸) → 完整版(pro: +GetCameraInfoEx/ObjReco/visPlay_no_decode H.264)
|
||||
- 帧回调只发节拍(newFrame(camState,streamType)),数据用 getOutputImage()/getOutputTempImage(int[])/getTemperatureData(int[]) 拉取
|
||||
- 温度单位:毫度 int(×0.001℃);位图 ARGB_8888(IDA 证实 GetOutputImage |0xFF000000 直写、行倒序)
|
||||
- nativeCopyBitmap:格式/宽高/stride 校验后 qmemcpy
|
||||
- libcxsdk.so(普通版图像核心)导出 C++ API:CFunctions/CAccumulator/CSmoother(与 ARM64 libcoresdk 同族,JNI_OnLoad 动态注册)
|
||||
|
||||
## 6. 花屏(Android 16 上专业版)根因分析
|
||||
|
||||
可确认的事实:
|
||||
1. 专业版仅带 **armeabi-v7a 32 位库**(libcoresdk/libthermogroupsdk),无 arm64。
|
||||
2. targetSdk 25 + MainActivity 锁 landscape + 全部旧版 support/自定义 SurfaceView 渲染。
|
||||
3. 渲染链:native 位图(ARGB_8888,行倒序)→ Bitmap.createBitmap 拷贝 → lockCanvas/drawBitmap → unlockCanvasAndPost;SurfaceHolder 格式 -2(TRANSPARENT),与格式无关的 Canvas 软渲染。
|
||||
4. 现役 2025~2026 旗舰(多数已停 32 位支持或启用 16KB 页内核)上,32 位 v7a 库+4KB 对齐 ELF+legacy 渲染路径极易出现兼容层渲染异常(花屏/缩放模糊/偶发撕裂)。
|
||||
|
||||
结论:不是单一 bug,而是"32 位专属库 + targetSdk25 时代渲染栈"在 Android 16 设备上的整体不兼容。重写为 targetSdk 36 + arm64(16KB 对齐) + 现代渲染即可根治,无需逐条修旧代码。
|
||||
|
||||
## 7. 反编译复现命令
|
||||
|
||||
```powershell
|
||||
$w='C:\Users\ZXC\AppData\Local\Temp\opencode\apkwork'
|
||||
& 'C:\Tools\jadx\bin\jadx.bat' -d "$w\jadx_pro" --show-bad-code -j 8 "$w\orig\pro.apk"
|
||||
# Ghidra: & 'C:\Tools\ghidra_12.1.2_PUBLIC\support\analyzeHeadless.bat' C:\Tools\ghidra_proj Mag160C -import <lib> -scriptPath C:\Tools\ghidra_scripts_user -postScript DumpJni.java
|
||||
```
|
||||
@@ -0,0 +1,89 @@
|
||||
# MAG160C 安卓统一 APP — 会话状态与心跳锚点
|
||||
|
||||
> 本文件是本任务("整合 4 个官方 APP 重写为 Android 16 现代化 APP")的心跳锚点。
|
||||
> 每完成一个里程碑更新勾选;会话中断先读本文件 + `reverse_apk_features.md`,
|
||||
> 再按"下一步"继续。约定:不弹询问窗,按计划自主推进,重大分歧点才停下来问。
|
||||
|
||||
## 任务目标
|
||||
|
||||
1. 逆向 C:\Project\MAG160C\app 4 个官方 APP(普通版/专业版/ThermoScope/demo)→ 已完成
|
||||
2. 整合全部功能开发一款安卓 APP:适配 Android 16(API 36)、现代 UI、横竖屏、
|
||||
无流氓文件夹、干爽简洁 → **进行中**
|
||||
3. 背景问题:专业版在用户 Android 16 手机上花屏(根因见 reverse_apk_features.md §6)
|
||||
|
||||
## 已完成的里程碑
|
||||
|
||||
- [x] 工具链:jadx 1.5.1(C:\Tools\jadx)、Ghidra 12.1.2(C:\Tools)、IDA MCP 可用
|
||||
- [x] 4 APK 解包 + jadx 全量反编译(%TEMP%\opencode\apkwork\jadx_*)
|
||||
- [x] 普通版/专业版/ThermoScope/demo 功能清单 → docs/android_app/reverse_apk_features.md
|
||||
- [x] IDA:pro libcoresdk.so GetOutputImage/copyBitmap 位图格式证实(ARGB_8888)
|
||||
- [x] Ghidra:libcxsdk.so 导出 C++ API 清单(CFunctions 族,与 ARM64 coresdk 同源)
|
||||
- [x] 花屏根因分析(32 位专属库 + targetSdk25 legacy 渲染栈)
|
||||
|
||||
## 关键事实速查(开发时直接用)
|
||||
|
||||
- USB:VID 0x833C PID 1,EP 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.ddt(1.8MB,SN 160043865)
|
||||
- MDT 文件格式:reverse_apk_features.md §4(152B Tail + 5 段布局 + ROI 256B 记录)
|
||||
- 温度:毫度 int;MDT 解码走 ConvertResponse2Temperature + T2E(Revise) + CorrectTemperature
|
||||
|
||||
## 用户已确认的范围(2026-09-06)
|
||||
|
||||
- 云功能:预留 Retrofit 接口模块,默认关闭
|
||||
- 扫码打标 + 任务巡检(sqlite/xml) + 红外基准图叠加:v1 全部实现
|
||||
- **网络互连(用户新增需求)**:主机手机插 USB 热像仪,局域网内另一台手机
|
||||
远程实时预览——UDP 广播自动发现 + 手动添加内网 IP;自定义轻量协议
|
||||
(控制通道 JSON + 图像流),不走厂商 33596/33597 协议
|
||||
|
||||
## 当前阶段
|
||||
|
||||
**阶段 2/8 完成:纯Kotlin核心管线移植并逐字节验证(2026-09-06)**
|
||||
|
||||
## 已完成里程碑(本任务)
|
||||
|
||||
- [x] 阶段1:轻量工具链定案——NDK/CMake/zig 全部卸载(-2.4GB),纯 Kotlin 方案:
|
||||
渲染管线+温度算法+帧解析从 C 移植为 Kotlin,Gradle 8.14.3 + SDK 已有组件
|
||||
- [x] 阶段2:项目骨架(android/,AGP 8.11.1 + Kotlin 2.2.0 + Compose BOM,
|
||||
compileSdk/targetSdk 36,minSdk 26),最小APK可构建
|
||||
- [x] 阶段2:表数据自动生成 analysis/gen_kotlin_tables.py → OfficialTables.kt
|
||||
(palette256 ARGB / T2E 646 / T2E274 / E2T_ACC_Q10)
|
||||
- [x] 阶段2:核心移植 FrameStream / RenderPipeline / TempMath(毫度测温)
|
||||
- [x] 阶段2:PC端参考工具 analysis/render_offline.c(gcc 编译)+ 差分测试:
|
||||
**Kotlin 输出与C参考逐字节一致**(60帧序列,首渲染帧32,NUC/LUT/灰度/输出全同)
|
||||
- [x] 阶段2:FrameStream 分块重组测试 + 温度换算单调性测试全过
|
||||
|
||||
## 移植陷阱记录(教训)
|
||||
|
||||
- C 无符号32位回绕:乘积/减法必须 u32() 掩码(cdf*denom、0xffc0000-iv7*0x40000、
|
||||
(v-win_lo)*S 等)
|
||||
- lutRebuild 的 u12 基址是常量 iv7*0x10+0x10,**不是**链式 u21v;u21v 只用于曲线钳制比较
|
||||
- Kotlin ByteArray 存 255 = -1:lut[bfmax] != 0xFF 判断必须 (b.toInt() and 0xFF)
|
||||
- 暖机窗口内 FFC 状态机暂停(warm check 在 ffc_step 之前)——移植时保持顺序
|
||||
|
||||
## 下一步
|
||||
|
||||
阶段3:USB层(UsbManager + Kotlin bulk 传输 + 命令协议)+ 实时画面 UI + 拍照/录像。
|
||||
参考:analysis/protocol_spec.md;文件存储 → MediaStore(DCIM/MAG160C)。
|
||||
|
||||
## 开发计划(待确认后逐阶段执行)
|
||||
|
||||
- 阶段 1:环境(cmdline-tools/NDK r27+/gradle 8.x + 16KB 对齐配置 + AGP 8.x)
|
||||
- 阶段 2:新仓库 app-android(Kotlin + Compose M3 + NDK 移植 csdk 渲染/温度 C 代码 + Kotlin USB 层)
|
||||
- 阶段 3:实时画面(USB 流+官方管线+OSD+ROI+调色板+FFC+增强+PIP 可见光+拍照 MDT+MP4 录像)
|
||||
- 阶段 4:媒体库(MediaStore,DCIM/MAG160C,无流氓文件夹)
|
||||
- 阶段 5:MDT 离线分析(缩放/ROI/参数/PDF 报告/备注)
|
||||
- 阶段 6:设置/任务巡检/可选云(Retrofit opt-in)
|
||||
- 阶段 7:Android 16 专项适配验收(16KB 对齐/横竖屏/深色/预测性返回)
|
||||
- 阶段 8:打包安装到用户手机实测
|
||||
|
||||
## 心跳约定
|
||||
|
||||
- 每完成一个阶段:更新本文件勾选 + git commit(不 push)。
|
||||
- 中断恢复:读本文件 → 按"下一步"继续 → 环境检查命令:
|
||||
```powershell
|
||||
Test-Path C:\Users\ZXC\AppData\Local\Android\Sdk\ndk\<ver>
|
||||
Get-Command java; Get-Command gradle
|
||||
```
|
||||
Reference in New Issue
Block a user