Files
MAG160C/docs/android_app/reverse_apk_features.md

106 lines
9.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# MAG160C 官方 APP 逆向功能总表(2026-09-06
> 用 jadx 1.5.1 反编译 4 个 APKIDAMCP)分析 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 25Android 7.1 时代);专业版/普通版 MainActivity 锁定 landscape。
- USBVID 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=1ImageViewer.java
- PIP 可见光小窗(手机 Camera API 预览,可拖动/三档尺寸)ImageViewerVisible.java;无像素级融合
- 数码变倍 1/2/4/8/16x160C 仅 1/2/4 循环);双击=手动 FFCFling 切拍照/录像
- 录像 MP4FFmpeg avcodec-57 + libcxsdk doRecording640×4802048kbps/20fps
- 拍照 JPEG q100 640×480 含 OSD(十字/最值/水印/激光);仅 C3P 另存 .ddt 伴随文件
- 横竖屏 OrientationEventListener 实时切 native 旋转角;来电自动断 USB;退后台 500ms deinit
**USB/协议**UsbCommunication.java,端点 0x03/0x82/0x81/0x8428B 帧头尾协议同 csdk
- 连接握手:GetParameter1/2 → GetCaliInfo → 无本地标定则 GetCaliFile 下载(others\{产品}.{SN}.{日期}
- 启动:native startProcess(...) + StartTransferImgThreadImgRecv/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
**双设备模型**CXDeviceModelUSB coresdkPID1+ DeviceModel(网络/云/USB-Mx thermogroupPID2;命令口 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 上传队列、单张浏览、"设为参考图"、"分析"= 调起 ThermoScopeintent thermoscope://路径)、GPS 跳地图
**云平台**Retrofit RESTcloudapi.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 256Btype/最值/均值/位置/坐标/色/发射率/报警上下限/名字)→TXT(编码 GB18030/GBK/UTF-8)→AUD;段间 4 字节对齐;支持裸 DDT
- 媒体库:扫 DCIM/Magnity/*.jpg(内容实为 MDT),同目录打开模式,按文件名内嵌时间排序
- 单张分析(SingleMediaActivity + ScopeSurfaceView 软件渲染):
- 11 调色板切换(回写 DDT);参数滑杆:环境温度 -40~80℃ / 发射率 0~1 / 窗口透过率 0~1native 重算+回写)
- 点测温 Pt*(3x3 探针+发射率修正)、框测温 Rt*min/max/ave+minPos/maxPos)、垂直滑动切红外/可见光
- 双指缩放 1~4x、平移;max/min 追踪标记;色标条+6 刻度;保存 640×480 PNG 快照+水印
- 相机信息(SN/分辨率/版本/时间/海拔/经纬度);文字备注;语音段透传
- PDF 报告(PdfCreatortejpratapsingh PDFUtil):标题、7×4 基本信息、热像图、9 级色标、整体+ROI 分析表、结果/建议、测试员;输出 DCIM/Magnity/reports/ReportSettingActivity 15 项报告参数
- RelayActivity:外部打开 .mdt/.ddt/.jpg/pdf 分发
## 5. SDKcn/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_8888IDA 证实 GetOutputImage |0xFF000000 直写、行倒序)
- nativeCopyBitmap:格式/宽高/stride 校验后 qmemcpy
- libcxsdk.so(普通版图像核心)导出 C++ APICFunctions/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 → unlockCanvasAndPostSurfaceHolder 格式 -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
```