当前位置: 首页 > news >正文

pure-python-adb 插件体系深度解析:6大内置插件监控CPU、内存、电池与流量

pure-python-adb 插件体系深度解析:6大内置插件监控CPU、内存、电池与流量

【免费下载链接】pure-python-adbThis is pure-python implementation of the ADB client.项目地址: https://gitcode.com/gh_mirrors/pu/pure-python-adb

pure-python-adb(导入名ppadb)是一个纯 Python 实现的 ADB 客户端库,无需安装 Android SDK 即可在 Python 中操控设备。它的亮点在于一套开箱即用的内置插件体系:CPU 占用、内存消耗、电池电量、流量统计、输入模拟、屏幕参数六大能力全部以插件形式内置,一行方法调用即可完成监控。本文将带你完整看懂这套插件架构,并学会如何扩展自己的插件。

为什么不用 adb 命令行,而用纯 Python 客户端?

传统方式是用adb命令行工具连接 adb server:

命令行方式每次都要解析文本输出,写自动化脚本非常繁琐。而pure-python-adb直接以 Python 库的身份连接 adb server(默认127.0.0.1:5037),返回结构化对象——CPU 统计是对象、内存信息是对象、电量是整数,天然适合写监控脚本和自动化测试。

💡 核心体验:同样的监控逻辑,adb 命令需要写十几行 shell + 正则解析,用 ppadb 只需device.cpu_percent(1)一行。

插件体系如何工作:Device 类的多重继承

理解这套体系的关键在 ppadb/device.py:

class Device(Transport, Serial, Input, Utils, WM, Traffic, CPUStat, BatteryStats): pass

Device类通过多重继承同时混入了所有插件类,因此你拿到的每一个device对象都自动拥有全部插件的方法。所有插件都继承自同一个极简基类 Plugin,它只要求你实现shell(cmd, handler=None, timeout=None)方法——这意味着任何插件本质上就是"会执行 shell 命令并解析结果的一族方法"

6 个内置插件源码全部位于 ppadb/plugins/device/ 目录:

插件源码文件核心能力
🧮 CPUStatcpustat.pyCPU 占用率、核数、进程/线程 CPU
📊 Utilsutils.py内存占用、前台 Activity、PID/UID
🔋 BatteryStatsbatterystats.py电池电量、电池统计数据
📶 Traffictraffic.py按应用统计网络流量
🖱️ Inputinput.py模拟点击、滑动、按键、输入文字
📐 WMwm.py屏幕分辨率与密度

插件一:CPUStat——实时监控 CPU 使用率

CPUStat 通过读取/proc/stat计算整机 CPU 占用,是性能监控最常用的插件:

  • cpu_percent(interval=1):两次采样相减,返回整机 CPU 使用率百分比
  • cpu_count():返回 CPU 核心数量
  • get_pid_cpu(pid):返回指定进程的 CPU 统计(ProcessCPUStat 对象)
  • get_all_thread_cpu(pid):返回进程内每个线程的 CPU 统计

设计很精巧:TotalCPUStat对象支持+-运算符重载,采样相减后直接算出使用率,无需手动处理内核累计时间。

插件二:Utils——查询内存占用与前台 Activity

Utils 插件覆盖了日常调试的高频需求:

  • get_meminfo(package_name):返回应用的 MemInfo 对象,包含PSS、私有脏页、堆大小等 7 项内存指标
  • get_top_activity()/get_top_activities():获取当前屏幕最上层 Activity(包名 + Activity 名 + PID),自动化测试判断"是否跳转成功"就靠它
  • get_pid()/get_uid():自动兼容不同系统的ps命令差异
  • get_package_version_name():读取应用版本号

插件三:BatteryStats——电池电量与耗电量统计

BatteryStats 提供两个层次的数据:

  • get_battery_level():通过dumpsys battery一键获取当前电量百分比
  • get_batterystats():解析dumpsys batterystats -c输出,按区块(section)返回结构化的电池统计数据,区块模型定义在 batterystats_section.py

配合 scripts/batterystats_codegen.py 这个代码生成脚本,区块解析类可以自动生成,维护成本极低。

插件四:Traffic——精确到每个 App 的流量监控

Traffic 插件调用get_traffic(package_name)后,先查出应用的 UID,再从/proc/net/xt_qtaguid/stats读取计数,返回一组 TrafficState 对象,包含上下行字节数、包数,以及 TCP/UDP/其他的分项统计——做流量审计、排查偷跑流量时非常实用。

插件五:Input——模拟点击、滑动与按键

Input 封装了 Androidinput命令:

  • input_text(string):输入一段文字
  • input_tap(x, y)/input_swipe(x1, y1, x2, y2, duration):点击与滑动
  • input_keyevent(keycode):发送按键事件(支持长按)

配套的按键码常量表在 ppadb/keycode.py,无需死记 KEYCODE 编号。

插件六:WM——获取屏幕分辨率与密度

WM 插件只有两个方法,却是自动化"必配":wm_size()返回 Size 宽高对象,wm_density()返回屏幕密度倍数(160dpi 为 1.0)。做跨设备自动化时,先取分辨率再按比例换算坐标,就不用手写死坐标了。

快速上手:3 行代码开始设备监控

安装后连接设备,即可串联使用全部插件:

from ppadb.client import Client as AdbClient client = AdbClient() # 默认连接 127.0.0.1:5037 device = client.device("emulator-5554") print(device.cpu_percent(1)) # CPU 使用率(%) print(device.get_battery_level()) # 电池电量(%) print(device.get_meminfo("com.example.app")) # 应用内存信息 print(device.get_traffic("com.example.app")) # 应用流量统计 print(device.wm_size()) # 屏幕分辨率

完整示例可参考 example/screencap.py,插件行为覆盖见 test/test_plugins.py。

如何扩展:自己写一个插件

得益于插件基类只有shell()一个方法,扩展成本几乎为零:新建一个继承 Plugin 的类,把 shell 命令解析成方法,再混入Device即可。整个体系的设计哲学可以概括为一句话——插件 = shell 命令 + 结构化解析,这也是它简洁却强大的原因。

📌小结:pure-python-adb 的 6 大内置插件用多重继承方式把 CPU、内存、电池、流量、输入、屏幕六大监控能力整合进Device对象,让你不依赖 Android SDK 就能用纯 Python 完成设备状态监控与自动化操作,是自动化测试和监控脚本的理想选择。

【免费下载链接】pure-python-adbThis is pure-python implementation of the ADB client.项目地址: https://gitcode.com/gh_mirrors/pu/pure-python-adb

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

http://www.cnnetsun.cn/news/4250442.html

相关文章:

  • 为什么选择cleye而非commander和yargs?Node.js CLI库横评对比清单
  • 微服务拆分前先算清治理代价
  • Chirpy SDK 开发者指南:如何用几行代码管理评论项目
  • Flask-REST-JSONAPI 数据层深入剖析:SQLAlchemy CRUD 扩展与 pre/post 钩子的灵活玩法
  • 可复现自动驾驶RL实验的关键:gym-carla同步模式与固定时间步实战
  • GoNorth导出引擎深度解析:Scriban模板、占位符与Export Snippets原理揭秘
  • KISS-Matcher参数调优完全指南:voxel_size、robin_noise_bound等10个关键参数如何选
  • 汽车 IGBT 封装真空焊接设备实操教程与要点解析
  • 10分钟快速上手OK?:从安装到跑通第一个程序的完整教程
  • CatShare如何保护传输安全?ECDH密钥协商与AES-CTR会话加密全解析
  • Open-ClaudeCode Hooks 机制深度解析:7类事件钩子让你的 AI 工作流全自动化
  • Freight实时日志内幕:LogReporter与LogChunk双线程分块写入设计拆解
  • Zrythm 音频插件安装完整指南:从 LV2 效果器到 SFZ 音源
  • deVoid UI Framework 架构设计解析:一条铁律如何拯救你混乱的 UI 代码
  • OpenAI Codex实战:从环境配置到模型匹配的完整排查指南
  • HeyUI-Admin中如何快速配置vue-router:路由表、懒加载与路由元信息实战
  • Nix RFCs角色指南:RFC委员会、Shepherd团队与Shepherd Leader如何分工
  • 老系统重构要把新旧逻辑并行验证
  • make-sense:免费在线图片标注,从上传到导出只要 5 分钟
  • 逐行解析quick-portfolio的default.html布局:揭秘Jekyll模板的HTML实现原理
  • C++指针与数组的区别、浅拷贝与深拷贝一次讲透:内存管理完整指南
  • 快速清理 C 盘驱动仓库:用 Driver Store Explorer 一次性释放 10GB 空间
  • jpetstore-6 Spring MVC全链路解析:从DispatcherServlet到JSP视图渲染的完整指南
  • 开源项目维护与社区运营要点
  • 从跑通到出片:JoyAI-Echo 分钟级长视频生成完整上手指南
  • 【必收藏】从0到1掌握AI智能体:大模型的进化与应用实践
  • audioMotion.js频谱分析仪设置与预设完整指南:Sensitivity、Peaks、加权滤波器,调出最适合你的频谱响应
  • ifconfig.io porttest功能实战:一条curl命令测试服务器远程端口是否可达
  • PowerSync多框架实战对比:一套同步代码跑通React、Vue、Angular与Nuxt的差异详解
  • 遗留系统 Canvas 兼容策略:ExplorerCanvas 部署指南与向 HTML5 的平滑迁移路线