Files
MAG160C/docs/android_app/reverse_apk_features.md
T

9.0 KiB
Raw Blame History

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);参数滑杆:环境温度 -4080℃ / 发射率 01 / 窗口透过率 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. 反编译复现命令

$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