动手写个性能检测工具

676 阅读2分钟

前言

众所周知,Android adb 是一个功能强大的命令行工具,允许通过该工具直接与设备进行通信,能操控设备,也能获取设备当前的性能参数。

既然功能强大,能否通过 adb 工具扩展出一个性能检测工具呢?答案是可以的。当然性能检测和调优是一个永恒的话题,需要系统性全面的深入才能做好,以下以一个内存检测工具为例。

场景

很多时候,应用出现卡顿、掉帧、耗电过快等现象都与应用内存占用存在直接关系,如何检测应用的内存占用成了优化这些场景的第一步。 使用 adb 工具,采用定时抽样机制即可获取应用内存变化情况,再结合实际业务场景,即可逐步定位至应用的待调优部分。

架构设计

架构图

Image.png

  • PerformanceTool:检测入口
  • DeviceFinder:负责查找设备
  • Config:记录和提供各种配置
  • Monitor:负责各个性能参数检测,这里只实现了内存检测,即 MemoryMonitor
  • CmdExecutor:执行 adb 指令

方法设计

以 Monitor 为例

Image [2].png

核心可分为启动执行、收集数据、输出图表三大方法

代码实现

开发环境

python: python3、matplotlib、xlwt、xlrd、xlutils

IDE: VS Code

OS: Windows10

关键方法

内存 adb 指令

adb -s [deviceSerialNo] shell dumpsys meminfo  [packageName]

检测入口 PerformanceTool

分三步走

第一步:查找设备

第二步:启动内存检测脚本

第三步:生成 excel 文件,输出图表


from MemoryMonitor import MemoryMonitor
import DeviceFinder
import Config
import time
import os
def main():
    print("Detection Start")
    # 查找设备
    isFindDeviceSuccess = DeviceFinder.findDevice()
    if isFindDeviceSuccess ==  False :
        print("Detection End")
        return
    # 创建报告目录
    if os.path.exists(Config.reportPath) ==  False :
        os.makedirs(Config.reportPath)
    # 记录开始检测时间,单位:s
    startDetectionTime = time.time()
    # 执行内存检测程序
    memoryMonitor = MemoryMonitor()
    memoryMonitor.execute()
    # 检测结束,生成图表
    while time.time() - startDetectionTime <= Config.detectionTime * 60 :
        continue
    print("generateChart start...")
    memoryMonitor.generateChart()
    print("generateChart end")
    # 结束所有检测
    memoryMonitor.stop()
    print("Detection End")
main()

源码地址

点我

效果

通过配置 Config 文件,最终输出以下折线图

memory.png

原始文件也保存在对应的 excel 文件中

mobileperf

实际上,mobileperf 就是采用类似的方案:采样-记录数据-输出。检测的项目更全、更详细,包括CPU、fps帧率、内存、logcat等一系列性能参数的检测,同时还支持 monkey ,朝自动化检测迈了一大步。

mobileperf 地址点我

后记

性能优化的前提是有足够全面的、详细的数据提供分析,从现象入手,由表及里,一步步深入至待调优的部分。本文仅作抛砖引玉。