您的位置:首页 > 编程语言 > Python开发

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

2017-03-27 09:49 2136 查看

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()


效果图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息