Android Debug Tool Pro — PyQt6 项目迁移复杂度分析

分析日期:2026-06-23 项目路径:/home/zbc/pangu/GeneralAndroid/main/hideapi/tool_new/


一、代码规模总览

指标数值
Python 文件总数~35 个核心文件
总代码行数~25,300 行
最大单文件 gui_manager.py6,339 行(上帝类)
第二大文件 trace_page.py4,495 行
样式文件 styles/14 个文件,约 3,000 行
自定义控件类约 20 个
QThread 子类8 个
Mixin 页面类6 个

二、PyQt6 特性使用清单

基础控件(大量使用)

  • 布局:QVBoxLayout, QHBoxLayout, QGridLayout, QStackedWidget, QSplitter
  • 标准控件:QPushButton, QLabel, QLineEdit, QComboBox, QTextEdit, QCheckBox, QGroupBox, QScrollArea, QTabWidget, QListWidget, QTableWidget, QTreeWidget, QProgressBar, QSpinBox
  • 对话框:QDialog, QFileDialog, QMessageBox, QInputDialog, QMenu

中级特性(中等使用)

特性使用量说明
pyqtSignal20+ 个自定义信号8 个 QThread 子类中定义,是核心通信机制
QSS 样式表14 个文件基于集中色板 _colors.py,使用 setProperty("class", ...) 语义化样式
拖拽支持3 处APK 安装、目录选择、Trace 文件输入
eventFilter1 处图片预览窗口的鼠标拖拽平移
QTimer5+ 处设备轮询(1500ms)、录屏计时、AI聊天节流、延迟刷新

高级特性(少量使用)

特性文件说明
QPainter 自定义绘制video_trimmer.pySpinnerOverlay(旋转动画)、RangeSlider(双端滑块)、CrossfadeLabel(交叉淡入)
QPropertyAnimationai_chat_widgets.py”思考中” 脉冲点动画
QSocketNotifier + PTYgui_manager.py内嵌 Linux 终端(仅 Linux)
ANSI 转义码解析gui_manager.pyTerminalTextEdit 手动解析颜色代码
QTextDocument.findgui_manager.py日志搜索高亮(支持正则)

三、自定义控件清单

控件文件复杂度迁移难度
TerminalTextEditgui_manager.py高 — PTY 交互 + ANSI 解析★★★★★
RangeSlidervideo_trimmer.py高 — 双端拖拽 + QPainter★★★★★
ImagePreviewDialoggui_manager.py高 — 缩放/拖拽/播放/交叉淡入★★★★☆
SpinnerOverlayvideo_trimmer.py中 — QPainter 旋转弧线★★★★☆
CrossfadeLabelvideo_trimmer.py中 — QPainter 双图混合★★★★☆
VideoTrimDialogvideo_trimmer.py高 — 完整视频裁剪 UI★★★★☆
MultiImagePreviewDialoggui_manager.py中 — 网格对比 + 同步缩放★★★☆☆
VideoFrameViewervideo_trimmer.py中 — 帧序列浏览器★★★☆☆
AssistantBubbleai_chat_widgets.py中 — 流式渲染 + Markdown★★★☆☆
ThinkingIndicatorai_chat_widgets.py中 — 脉冲动画★★★☆☆
_DropLineEdit / _DropComboBoxtrace_page.py中 — 拖拽 + 右键菜单★★★☆☆
ToolCallWidgetai_chat_widgets.py低 — 状态卡片★★☆☆☆
_ChatInputEditai_chat_page.py低 — Enter 提交★☆☆☆☆

四、线程/异步模型

模式使用位置数量
QThread + pyqtSignalAdbWorker, TraceWorker, V2PWorker, ClaudeStreamWorker, UpdateWorker 等8 个子类
QTimer设备轮询、录屏计时、AI节流渲染、自动更新5+ 处
QSocketNotifierPTY 终端输出监听1 处
subprocess.Popen (QThread 内)AdbWorker 逐行读取 stdout核心流程
threading.Threadtrace_page.py极少

关键点

  • 没有使用 asyncio
  • 没有使用 QRunnable / QThreadPool
  • 整个异步模型完全基于 QThread + pyqtSignal
  • 信号/槽是贯穿全应用的核心通信机制

五、架构耦合度分析

好的解耦设计

  • functions/ 下业务模块是纯数据模块,返回 (button_text, command, tooltip) 三元组,不依赖 UI
  • COMMAND_REGISTRY 提供函数名到命令生成器的纯映射
  • AdbController 是纯工具类(subprocess 封装)
  • 样式完全分离在 styles/ 目录,通过 apply_xxx_style(widget) 注入

耦合较紧的部分

  • gui_manager.py 上帝类(6,339 行):UI 构建 + 命令调度 + 设备管理 + 文件操作 + HTTP 服务器 + PTY 终端 + 日志搜索 + 录屏管理
  • 6 个 Mixin 混入 AndroidToolWindow,通过 self 直接访问主窗口所有属性
  • 命令执行流 prepare_and_run()run_background()AdbWorker(QThread)result_signal 与 QThread 深度绑定

六、平台特定代码

功能文件平台限制
PTY 内嵌终端gui_manager.py仅 Linux(pty.openpty + QSocketNotifier
桌面快捷方式gui_manager.py仅 Linux(.desktop 文件)
libxcb-cursor.somain_gui.py仅 Linux(X11 cursor)
跨平台二进制platform_bin.py已做好三平台适配 ✅
构建脚本build_ci.py已区分三平台 ✅

七、迁移工作量估算

按目标框架

目标框架预计时间代码重写比例说明
PySide61-2 天~5%API 99% 兼容,仅 import 和信号语法微调
另一个 Python GUI3-5 周~65%需重写所有 UI 和线程模型
Electron + React6-10 周~80%需全部重写为 JS/TS,仅命令逻辑可参考
Tauri + Vue6-10 周~80%同上,额外需学 Rust
Flutter8-12 周~85%完全不同的语言和框架

可直接复用的部分

  • functions/ 目录下约 4,000 行业务逻辑(命令定义、按钮配置、注册表)
  • config.py / config_paths.py / device_info.py(纯数据配置)
  • platform_bin.py(跨平台路径解析)
  • 如果迁移到 Web 方案,以上逻辑需要移植但思路可完全复用

需要完全重写的部分

  • QSS 主题系统(14 文件)→ 目标框架样式系统
  • QThread 异步模型(8 个子类)→ 目标框架线程/异步模型
  • QPainter 自定义绘制(3 个控件)→ Canvas/SVG/自绘 API
  • gui_manager.py 上帝类 → 需先重构再迁移

八、建议

  1. 如果不切换框架:优先将 PyQt6 → PySide6(解决许可问题,工作量极小)
  2. 如果决定迁移:先重构 gui_manager.py 上帝类(拆分为独立页面模块),再开始迁移
  3. 无论如何functions/ 目录的纯数据架构是正确的设计,应该在新框架中保持这种解耦