ADBLab
项目概览 项目地址点击直接跳转
ADBLab 是一款基于 PySide6 的 Android 设备管理、自动化测试与性能诊断桌面工具。项目将常用 ADB、scrcpy、logcat、dumpsys、gfxinfo、meminfo 等能力封装为图形界面,适合日常设备调试、应用管理、投屏控制、Monkey 压测、文件操作和性能巡检。

| 项目 | 当前状态 |
|---|---|
| 应用版本 | 3.0.0,来源于 utils/app_metadata.py |
| 开发语言 | Python,建议使用 Python 3.11 |
| GUI 框架 | PySide6 / Qt 6 |
| 主要平台 | Windows 10/11 |
| 内置工具 | scrcpy-win64-v3.3.1/,包含 adb.exe 与 scrcpy.exe |
| 作者 | Frankie Hu (Copyright © 2026) |
快速启动
bash
pip install -r requirements.txt
python main.py
当前功能
设备与基础操作
- IP/USB 设备连接、断开、刷新、重启和多选批量操作。
- 设备信息读取:品牌、型号、Android 版本、SDK、CPU、分辨率、内存、存储、网络信息等。
- ADB Server 重启、TCP/IP 模式、端口 forward/reverse、系统 reboot 模式切换。
- 左侧设备列表持续扫描 USB 设备,支持历史设备与连接记录。
应用管理与测试
- 获取当前前台包名,支持 focus 优先检测和 activity/window 回退。
- 安装、卸载、清数据、强停、重启、禁用、启用、disable-user。
- 本地 APK 解析,读取包名、版本、权限、架构等信息。
- Monkey 压力测试:事件占比、事件数、throttle、flags、随机种子、按设备中止。
- Bugreport、ANR 拉取、logcat 导出/清理、meminfo、cpuinfo、gfxinfo、top、wakelock、netstats 等诊断入口。
- 临时邮箱能力:通过
core/mail/调用 AMZ123 API 获取邮箱与验证码。
Remote 投屏控制
- 内置 scrcpy v3.3.1,支持流畅/均衡/画质/低延迟预设。
- 自定义分辨率、FPS、码率、codec、buffer、方向锁定、录制文件。
- 支持全屏、置顶、显示触摸、保持唤醒、关闭设备屏幕、无窗口、无音频。
models/remote/提供原生无界面服务层:ScrcpyService:scrcpy 路径解析、版本检测、预检、编码器检测、启动/停止、FPS 解析。RemoteControlService:按键、D-Pad、滑动、通知栏、旋转等 ADB 控制。control_mapping.py:keycode 和手势坐标计算。scrcpy_args.py:集中构建 scrcpy 参数。
- Remote 保留 ADBLab 自有 PySide6 UI,不嵌入 guiscrcpy 的 Qt UI/launcher 栈。
文件浏览器
- 浏览设备文件系统,支持路径栏、后退/前进/上级导航、搜索过滤。
- 拉取、推送、删除、重命名、新建文件/文件夹、复制/剪切/粘贴。
- 文本和图片查看,脚本执行,APK 直接安装,文件属性查看。
- chmod 权限弹窗与 root 模式。
models/file_explorer_service.py是无 Qt 依赖的纯逻辑层,负责路径处理、shell quoting、ls -la解析、权限模式和文件名安全校验。
性能监控
- 工具栏提供
Performance入口,必须先选中设备;弹窗标题会带上当前设备名称。 gui/dialogs/performance_launcher.py提供 MobilePerf 启动弹窗,支持获取当前前台包名、配置采样频率/时长/Monkey/dumpheap/异常关键字、启动/停止采集、打开结果目录和跳转 Perfetto。- MobilePerf 结果目录会追加设备名称,方便区分多设备保存文件。
- MobilePerf 日志使用纯文本批量追加,保留工具原始输出,不再额外叠加 ADBLab 时间和等级前缀,避免长时间运行导致主界面卡顿。
mobileperf/保持独立移植目录;ADBLab 通过models/mobileperf/runner.py生成临时配置并启动子进程,不直接修改mobileperf/config.conf。- 原 Perfetto 跳转已移动到 Performance 弹窗内的
Open Perfetto按钮。 gui/dialogs/performance_monitor.py提供单设备性能弹窗,gui/dialogs/performance_timeline.py提供原生时间线图。gui/performance_web/提供可选 Web 仪表盘资源:index.html、style.css、app.js。models/performance/提供采集、解析、会话、报告和 worker 层:- 启动耗时:
am start -S -W与 logcatDisplayed/Fully drawn解析。 - 帧率与卡顿:
dumpsys gfxinfo <package> framestats统计。 - 内存:
dumpsys meminfo的 PSS、Java Heap、Native Heap、Graphics、Views、Activities 等字段。 - CPU:读取
/proc/<pid>/stat与/proc/stat做进程 CPU delta。 - 设备信息:getprop、cpuinfo、meminfo、SurfaceFlinger、root 状态等。
- 报告:生成 summary、metrics、文本报告和趋势分析所需数据。
- 启动耗时:
弹窗与工具
- 主窗口工具栏提供置顶按钮,状态保存到
AppSettings["always_on_top"];Windows 运行时切换使用原生窗口置顶,不重建主界面。 - 应用管理器:表格/网格视图、搜索过滤、批量操作、备份/恢复、权限管理、JSON 预设。
- 实时 Logcat:等级、包名、Tag 过滤,语法高亮,导出文本。
- 截图查看器:多图导航、缩放、复制、另存为、打开目录、删除。
- Monkey、Remote、MobilePerf 弹窗和面板响应全局主题、字体、图标刷新和深浅色切换。
- 设置弹窗:主题、字体、窗口尺寸、面板宽度、保存目录、日志行数、危险操作确认、持续扫描等。
项目结构
text
ADBLab/
├── main.py # 程序入口,设置 Windows AppUserModelID、主题和主窗口
├── requirements.txt # 运行与打包依赖
├── pyproject.toml # black / ruff 配置,目标语法 py310
├── ADBLab.spec # PyInstaller 打包配置
├── README.md
├── icon.ico
├── mobileperf/ # MobilePerf 移植内核,保持独立目录
├── .github/workflows/
│ ├── Build-exe.yaml # 构建 exe 并发布 GitHub Release
│ └── Auto-Clean.yaml # 清理旧 workflow runs / releases
│
├── core/ # 核心基础设施
│ ├── adb_bridge.py # 轻量 ADB 桥接
│ ├── log_service.py # 线程安全日志服务,跨线程 flush 回到 owner thread
│ ├── settings_manager.py # 应用设置单例,JSON 原子写入
│ └── mail/ # 临时邮箱 API 与异步任务
│
├── controllers/ # Controller 层,多个 mixin 组合成 ADBController
│ ├── __init__.py
│ ├── _base.py # model、signals、handler_map 分发
│ ├── _device.py # 设备连接与设备信息
│ ├── _app.py # 应用管理、Monkey、日志、Bugreport
│ ├── _system.py # 系统命令、广播、Activity、输入法、模拟器
│ ├── _media.py # 截图、录屏、性能基础项、电池
│ ├── _input.py # 文本输入、点击、滑动、keyevent、settings
│ └── _file.py # 文件、端口、content query
│
├── models/ # Model 与服务层
│ ├── adb_model.py # @async_command 与 ADBModelCore
│ ├── adb_device.py # 设备操作
│ ├── adb_app.py # 应用操作
│ ├── adb_testing.py # Monkey、Bugreport、ANR、日志
│ ├── adb_advanced.py # 录屏、输入、性能基础项、logcat
│ ├── adb_network.py # 网络 ADB mixin
│ ├── adb_system.py # 系统 ADB mixin
│ ├── app_manager_worker.py # 应用管理器 worker
│ ├── file_explorer_worker.py # 文件浏览器 QThread worker
│ ├── file_explorer_service.py # 文件浏览器纯逻辑服务
│ ├── device_store.py # YAML 设备信息持久化
│ ├── base/
│ │ ├── command_runner.py # 短生命周期命令统一入口
│ │ ├── process_runner.py # 长生命周期进程统一管理
│ │ └── focus_detector.py # 前台包名检测
│ ├── remote/ # Remote / scrcpy 无界面服务层
│ ├── mobileperf/ # MobilePerf runner、临时配置与日志/结果管理
│ └── performance/ # 性能监控服务、解析、会话、报告、workers
│
├── gui/ # PySide6 视图层
│ ├── main_frame.py # 主窗口、工具栏、QSplitter、信号接线
│ ├── panels/ # 右侧 Apps/System/Remote 面板与左侧设备/日志面板
│ ├── dialogs/ # About、App Manager、File Explorer、Logcat、Performance、Screenshot、Settings
│ ├── performance_web/ # 性能监控 Web 仪表盘静态资源
│ ├── styles/ # 主题、QSS、字体、图标加载
│ └── widgets/ # 自定义控件
│
├── utils/
│ ├── app_metadata.py # 应用版本单一事实来源
│ ├── resource_path.py # 开发/打包资源路径解析
│ ├── adb_resolver.py # 内置 ADB 路径解析
│ └── batch_tracker.py # 多设备批量进度追踪
│
├── tests/
│ ├── test_model_execution.py
│ ├── test_remote_services.py
│ ├── test_file_explorer_service.py
│ └── test_performance_services.py
│
├── resources/ # 设置、历史、预览图、二维码、图标、Bugreport 转换器
└── scrcpy-win64-v3.3.1/ # Windows 版 adb/scrcpy 运行时
架构说明
MVC + 信号/槽
text
用户操作 Panel/Dialog
→ 发出 Qt signal
→ ADBController 或弹窗本地 worker 接收
→ Model / Service 通过 CommandRunner 或 ProcessRunner 执行
→ Worker / Model 发回结果
→ Controller / Dialog 更新日志、状态和界面
核心原则:
- UI 只负责交互、状态展示和信号连接。
- 短命令统一走
CommandRunner.run()。 - 长生命周期任务统一走
ProcessRunner.start()/ProcessRunner.spawn()。 - UI 层不能直接调用
subprocess.run()、subprocess.Popen()或os.startfile()。 - Remote、File Explorer、Performance 的复杂逻辑都放入无 Qt 或低 Qt 耦合的服务层,便于单测和复用。
线程模型
- 主线程:Qt 事件循环和 UI 渲染。
- 普通异步 ADB 命令:
@async_command包装成 QRunnable,交给QThreadPool。 - 弹窗级任务:App Manager、File Explorer、Performance 使用专用 QThread/worker。
- 长进程:Monkey、Logcat、scrcpy、性能采样等由
ProcessRunner管理进程生命周期。 - 日志:
LogService批量缓冲刷新,并通过 Qt 信号把跨线程 flush 调回 owner thread。
当前服务拆分
| 服务层 | 文件 | 说明 |
|---|---|---|
| 命令执行 | models/base/command_runner.py |
ADB 与短命令统一执行入口,规范输出与 timeout |
| 进程执行 | models/base/process_runner.py |
管理长生命周期进程,支持 stop、spawn、stop_all |
| Remote | models/remote/ |
scrcpy 参数、预检、启动、FPS、按键与手势控制 |
| File Explorer | models/file_explorer_service.py |
shell quoting、路径、权限、文件列表解析 |
| MobilePerf | models/mobileperf/ + mobileperf/ |
临时 config、子进程启动/停止、日志批量回传、结果目录定位 |
| Performance | models/performance/ |
指标采集、解析、报告、会话、时间线数据 |
| 设置 | core/settings_manager.py |
应用配置 JSON 原子写入和自动保存 |
| 日志 | core/log_service.py |
线程安全日志缓冲与 UI 刷新 |
依赖
requirements.txt 当前内容:
| 包 | 版本 | 用途 |
|---|---|---|
| PySide6 / PySide6_Addons / PySide6_Essentials | 6.8.1.1 | Qt 6 GUI |
| PyYAML | 6.0.2 | YAML 解析 |
| ruamel.yaml / ruamel.yaml.clib / ruamel.base | latest / 1.0.0 | YAML 读写 |
| Requests | 2.32.5 | HTTP 请求,临时邮箱 API |
| Pillow | 未固定 | 图片相关处理 |
| pyinstaller | 未固定 | Windows exe 打包 |
系统侧依赖:
- Windows 10/11。
- ADB:已内置在
scrcpy-win64-v3.3.1/。 - scrcpy:已内置 Windows 版
scrcpy.exe。 - aapt:用于本地 APK 解析,需外部提供。
- Java JRE:用于运行
resources/chkbugreport-0.5-215.jar。
测试与验证
当前测试目录覆盖:
tests/test_model_execution.py:命令/进程执行层与 ADB model 行为。tests/test_remote_services.py:Remote scrcpy 参数、预检、按键/手势映射。tests/test_file_explorer_service.py:文件浏览器路径、quoting、ls解析、权限模式。tests/test_performance_services.py:性能指标解析、采样、报告、dashboard 数据。- MobilePerf/Performance 入口、置顶切换、Monkey/Remote 字体主题刷新等 UI 行为集中在
tests/test_model_execution.py中做轻量回归。
建议改动后至少执行:
bash
py -3.11 -m compileall mobileperf models gui tests
py -3.11 -m pytest tests -q
git diff --check
文档或中文内容改动后,建议使用 UTF-8 读回确认,避免 Windows 终端编码显示误判:
bash
python -c "from pathlib import Path; print(Path('README.md').read_text(encoding='utf-8')[:120])"