当前位置 博文首页 > sinat_34824619的博客:Python 如何获取Android应用内存使用和CP

    sinat_34824619的博客:Python 如何获取Android应用内存使用和CP

    作者:[db:作者] 时间:2021-08-12 18:03

    Python 如何获取Android应用内存使用和CPU占用信息,并且时时展示曲线图形。

    最近测试公司产品时发现进入聊天界面后再退出,内存占用没有减小。考虑到其他测试人员没有产品源代码查看权限,又不懂怎么使用Android Studio ,如果需要测试某些地方的内存和CPU占用情况,可能需要另外的辅助工具,一边测试一边查看内存和CPU占用情况,能够快速的找到某些操作会导致内存增加了而且没有释放掉。在下才疏学浅,不知道是否还有其他更牛逼的工具(如果你知道有可以告诉我,跪求教育可怜),于是自己动手写。好吧 !废话不多说,开始正题。

    想要获取 某个应用内存和CPU占用信息,使用两个adb命令就行

    内存 :adb shell dumpsys meminfo 包名
    CPU占用:adb shell top -m 100 -n 1 -s cpu

    当我们在终端输入 adb shell dumpsys meminfo 包名 ,我们知道图中圈出来的数字是我们的内存使用总和,就是我们要的数据
    这里写图片描述
    那我们想要实时的展示这个数据,就要实时的去获取,那就简单了,我们先写方法,然后按照一点时间差去执行这两个命令就好了。

    def getTotalPss():
        lines = os.popen("adb shell dumpsys meminfo com.hellotalk ").readlines() #逐行读取
        total = "TOTAL"
        for line in lines:
            if re.findall(total, line): # 找到TOTAL 这一行
                lis = line.split(" ")  #将这一行,按空格分割成一个list
                while '' in lis:       # 将list中的空元素删除
                    lis.remove('')
                return lis[1] #返回总共内存使用

    cpu占有率也是同样的道理

    def getCpu():
        li = os.popen("adb shell top -m 100 -n 1 -s cpu").readlines()
        name = "com.hellotalk"
        for line in li:
            if re.findall(name,line):
                cuplist = line.split(" ")
                if cuplist[-1].strip() == 'com.hellotalk':
                    while '' in cuplist:       # 将list中的空元素删除
                        cuplist.remove('')
                    return float(cuplist[2].strip('%')) #去掉百分号,返回一个float

    写完两个方法后,就开始 写获取数据了,为了能时时展示曲线图,这里我们要用到 matplotlib 这个库,我借鉴了下网络上一些写法,修改了下
    比较简单,代码如下:

    from matplotlib import pyplot as plt
    from matplotlib import animation
    
    fig = plt.figure()
    ax1 = fig.add_subplot(2,1,1,xlim=(0, 100), ylim=(0, 350))
    ax2 = fig.add_subplot(2,1,2,xlim=(0, 100), ylim=(0, 100))
    line, = ax1.plot([], [], lw=2)
    line2, = ax2.plot([], [], lw=2)
    x = []
    y= []
    y2 = []
    def init():
        line.set_data([], [])
        line.set_data([], [])
        return line,line2
    def getx():
        t = "0"
        return t
    
    def animate(i):
        x.append(int(getx())+i)
        y.append(int(getTotalPss())/1024) #每执行一次去获取一次值加入绘制的data中
        y2.append(getCpu())
        print x,y
        line.set_data(x,y)
        line2.set_data(x,y2)
        return line,line2
    
    anim1 = animation.FuncAnimation(fig, animate, init_func=init,  frames=1000, interval=30)
    plt.show()

    效果图:
    这里写图片描述

    cs