Python获取android设备cpu和内存占用情况
作者:初吻--给了奶嘴 发布时间:2023-02-25 20:46:47
标签:Python,android,设备,内存占用
功能:获取android设备中某一个app的cpu和内存
环境:python和adb
使用方法:使用adb连接android设备,打开将要测试的app,执行cpu/内存代码
cpu获取代码如下:(输入参数为脚本执行时间)
# coding:utf-8
'''
获取系统total cpu
'''
import os, csv
import time
import csv
import numpy as np
from matplotlib import pyplot as plt
cpu_list = []
time_list = []
app_list = []
lines = []
package_name = []
# 读取进程名称(包名)
def get_applist():
global package_name
with open('config/director.txt', encoding='utf-8', mode='r') as f:
lines_all = f.readlines()
for appname in lines_all:
package_name1 = appname
appname_new = appname[0:15]
package_name.append(package_name1)
lines.append(appname_new)
for line in lines:
app_list.append(line.strip())
# 获取cpu数值
def get_cpu():
global filename
with open(filename, encoding="utf-8", mode="r") as f:
lines = f.readlines()
for appname in app_list:
for lis in lines:
# 适配低版本手机
if appname in lis and '%' in lis:
now = time.strftime("%H:%M:%S", time.localtime())
time_list.append(now)
cpu_1 = lis.split('%')[0]
cpu_2 = cpu_1.split(' ')
# print(cpu_2)
cpu = cpu_2[len(cpu_2) - 1]
print(cpu, now)
cpu_list.append(cpu)
break
# 适配高版本手机
elif appname in lis:
now = time.strftime("%H:%M:%S", time.localtime())
time_list.append(now)
cpu1 = lis.split(' ')
# print(cpu1)
cpu2 = list(set(cpu1))
cpu2.sort(key=cpu1.index)
cpu_h = cpu2[len(cpu2) - 4]
print(cpu_h, now)
cpu_list.append(cpu_h)
break
else:
pass
# csv头部
def write_head():
headers = ['name:']
headers.append(app_list[0])
headers.append('init_cpu')
with open('log_su/cpuinfo.csv', 'w+', newline='') as csvfile:
writer = csv.DictWriter(csvfile, fieldnames=headers)
writer.writeheader()
# 将数值写入csv,用于绘图时读取
def write_report():
# headers = ['name', 'aaa', 'init_cpu']
with open('log_su/cpuinfo.csv', 'a+', newline='') as csvfile:
writer = csv.writer(csvfile)
for key in cpu_list:
writer.writerow([' ', ' ', key])
# 绘制折线图,生成测试报告
def mapping():
filename = 'log_su/cpuinfo.csv'
with open(filename) as f:
reader = csv.reader(f)
header_row = next(reader)
highs = []
for row in reader:
high = row[2]
highs.append(high)
# print(highs)
wights = time_list
highs_float = list(map(float, highs))
# print(f"****{highs}")
print(f"CPU值:{highs_float}")
# 输出平均值
total = 0
for value in highs_float:
total += value
average = round(total/len(highs_float), 2)
print(f"CPU平均值:{average}")
#输出最低值和最高值
highs_hl = sorted(highs_float)
print(f"CPU最低值:{highs_hl[0]}")
print(f"CPU最高值:{highs_hl[len(highs_hl)-1]}")
# 根据数据绘制图形
plt.figure(figsize=(11, 4), dpi=600)
# 生成网格
# plt.grid()
plt.grid(axis="y")
# 折线图
if package_name[0] == 'com.oneapp.max.security.pro.cn':
plt.plot(wights, highs_float, "c-", linewidth=1, label="PPP")
elif package_name[0] == 'com.oneapp.max.cn':
plt.plot(wights, highs_float, "c-", linewidth=1, label="Opt1.6.1")
elif package_name[0] == 'com.boost.clean.coin.cn':
plt.plot(wights, highs_float, "c-", linewidth=1, label="Fastclear")
elif package_name[0] == 'com.walk.sports.cn':
plt.plot(wights, highs_float, "c-", linewidth=1, label="Walk")
elif package_name[0] == 'com.diamond.coin.cn':
plt.plot(wights, highs_float, "c-", linewidth=1, label="Amber")
elif package_name[0] == 'com.oneapp.max.cleaner.booster.cn':
plt.plot(wights, highs_float, "c-", linewidth=1, label="Space")
else:
plt.plot(wights, highs_float, "c-", linewidth=1, label=package_name[0])
# 坐标轴范围
# plt.ylim(300, 400)
# plt.xlim(0, 10)
plt.xlabel('time(H:Min:S)', fontsize=16)
plt.ylabel("cpu_realtime(%)", fontsize=16)
plt.title("cpu real time line chart", fontsize=24)
plt.legend()
# 横坐标显示间隔
if len(wights) <= 15:
pass
else:
t = int(len(wights) / 15)
plt.xticks(range(0, len(wights), t))
# 纵坐标显示间隔
# plt.yticks(range(100, 300, 10))
# 旋转日期
plt.gcf().autofmt_xdate()
# 展示每个坐标
# for a, b in zip(wights, highs_float):
# plt.text(a, b, (a, b), ha='center', va='bottom', fontsize=8)
# plt.show()
time_now = time.strftime("%m%d-%H:%M:%S", time.localtime())
path = "report/" + time_now
plt.savefig(path)
# 自动识别当前需检测的
def name_app():
cmd = 'adb shell dumpsys window | grep mCurrentFocus > log_su/name_info.csv'
os.system(cmd)
with open('log_su/name_info.csv', encoding='utf-8', mode='r') as f:
lines = f.readlines()
for line in lines:
if 'mCurrentFocus' in line:
name1 = line.split('/')[0].split(' ')
name = name1[len(name1) - 1]
with open('config/director.txt', encoding='utf-8', mode='w') as f_name:
text = name
f_name.write(text)
print(f"将要监测的包名为:{text}")
#控制监测时间
def time_control():
global filename
while True:
end_time = time.time()
if (end_time - start_time)/60 >= tol_time: #分钟
# if end_time - start_time >= tol_time: # 秒
break
time.sleep(1)
adb = "adb shell top -n 1 > log_su/adb_info.csv"
d = os.system(adb)
filename = "log_su/adb_info.csv"
get_cpu()
if __name__ == "__main__":
name_app()
tol_time = int(input("请输入脚本执行时间(分钟):"))
start_time = time.time()
get_applist()
write_head()
time_control()
write_report()
mapping()
会在.py文件同级目录下生成3个文件夹,config、log_su、report,其中运行结果在report中
结果以是生成折线图,看起来直观,如下:
这里我解释下,cpu占比是adb获取的实时占比,但是满值并不一定是100%,比如这张图,用的是一个八核的手机,所以CPU满值是800%
内存获取代码如下:(输入参数为脚本执行时间)
# coding:utf-8
'''
获取系统total memory
'''
import os, csv
import time
import csv
import numpy as np
from matplotlib import pyplot as plt
mem_dict = {}
time_list = []
app_list = []
package_name = []
t = 0
def get_applist():
global package_name
with open('config/director.txt', encoding='utf-8', mode='r') as f:
lines = f.readlines()
for line in lines:
package_name1 = line
package_name.append(package_name1)
app_list.append(line.strip())
def get_mem():
global filename
with open(filename, encoding="utf-8", mode="r") as f:
lines = f.readlines()
start_flag = False
for appname in app_list:
for line in lines:
if "Total PSS by OOM adjustment" in line:
break
if appname in line and 'pid' in line and 'kB' in line:
mem_v = line.strip().split(':')[0].replace('kB', '').replace(',', '')
line_name = line.split(':')[1].split('(')[0].strip()
if line_name in appname:
mem_v = round(float(mem_v) / 1024, 2)
mem_dict[appname] = mem_v
now_v = time.strftime("%H:%M:%S", time.localtime())
# now_int = int(now_v)
time_list.append(now_v)
print(mem_v, now_v)
break
elif appname in line and 'pid' in line and 'K' in line:
mem_v = line.strip().split(':')[0].replace('K', '').replace(',', '')
line_name = line.split(':')[1].split('(')[0].strip()
if line_name in appname:
mem_v = round(float(mem_v) / 1024, 2)
mem_dict[appname] = mem_v
now_v = time.strftime("%H:%M:%S", time.localtime())
# now_int = int(now_v)
time_list.append(now_v)
print(mem_v, now_v)
break
def write_head():
headers = ['name:']
headers.append(app_list[0])
headers.append('init_mem')
with open('log_su/meminfo.csv', 'w+', newline='') as csvfile:
writer = csv.DictWriter(csvfile, fieldnames=headers)
writer.writeheader()
def write_report():
headers = ['name','aaa', 'init_mem']
with open('log_su/meminfo.csv', 'a+', newline='') as csvfile:
writer = csv.DictWriter(csvfile, fieldnames=headers)
for key in mem_dict:
writer.writerow({'init_mem': mem_dict[key]})
def mapping():
filename = 'log_su/meminfo.csv'
with open(filename) as f:
reader = csv.reader(f)
header_row = next(reader)
highs = []
for row in reader:
high = row[2]
highs.append(high)
# print(highs)
wights = time_list
highs_float = list(map(float, highs))
print(f"内存值:{highs_float}")
# 输出平均值
total = 0
for value in highs_float:
total += value
average = round(total / len(highs_float), 2)
print(f"内存平均值:{average}")
# 输出最低值和最高值
highs_hl = sorted(highs_float)
print(f"内存最低值:{highs_hl[0]}")
print(f"内存最高值:{highs_hl[len(highs_hl) - 1]}")
# 根据数据绘制图形
plt.figure(figsize=(11, 4), dpi=600)
# 生成网格
# plt.grid()
plt.grid(axis="y")
if package_name[0] == 'com.oneapp.max.security.pro.cn':
plt.plot(wights, highs_float, "c-", linewidth=1, label="PPP")
elif package_name[0] == 'com.oneapp.max.cn':
plt.plot(wights, highs_float, "c-", linewidth=1, label="Opt")
elif package_name[0] == 'com.boost.clean.coin.cn':
plt.plot(wights, highs_float, "c-", linewidth=1, label="fastclear")
elif package_name[0] == 'com.walk.sports.cn':
plt.plot(wights, highs_float, "c-", linewidth=1, label="Walk")
elif package_name[0] == 'com.diamond.coin.cn':
plt.plot(wights, highs_float, "c-", linewidth=1, label="Amber")
elif package_name[0] == 'com.oneapp.max.cleaner.booster.cn':
plt.plot(wights, highs_float, "c-", linewidth=1, label="Space")
else:
plt.plot(wights, highs_float, "c-", linewidth=1, label=package_name[0])
# 坐标轴范围
# plt.ylim(300, 400)
# plt.xlim(0, 10)
plt.xlabel('time(H:Min:S)', fontsize=16)
plt.ylabel("Number (Mb)", fontsize=16)
plt.title("meminfo", fontsize=24)
plt.legend()
# 横坐标显示间隔
if len(wights) <= 15:
pass
else:
t = int(len(wights) / 15)
plt.xticks(range(0, len(wights), t))
# 坐标刻度
# my_y_ticks = np.arange(300, 400, 10)
# my_x_ticks = np.arange(1, 10, 1)
# plt.xticks(my_x_ticks)
# plt.yticks(my_y_ticks)
# plt.yticks(range(100, 300, 10))
#旋转日期
plt.gcf().autofmt_xdate()
# 展示每个坐标
# for a, b in zip(wights, highs_float):
# plt.text(a, b, (a, b), ha='center', va='bottom', fontsize=8)
# plt.show()
time_now = time.strftime("%m%d-%H:%M:%S", time.localtime())
path = "report/" + time_now
plt.savefig(path)
def name_app():
cmd = 'adb shell dumpsys window | grep mCurrentFocus > log_su/name_info.csv'
os.system(cmd)
with open('log_su/name_info.csv', encoding='utf-8', mode='r') as f:
lines = f.readlines()
for line in lines:
if 'mCurrentFocus' in line:
name1 = line.split('/')[0].split(' ')
name = name1[len(name1) - 1]
with open('config/director.txt', encoding='utf-8', mode='w') as f_name:
text = name
f_name.write(text)
print(f"将要监测的包名为:{text}")
def time_control():
global filename
while True:
end_time = time.time()
if (end_time - start_time)/60 >= tol_time: #分钟
# if end_time - start_time >= tol_time: #秒
break
# time.sleep(2)
# filename = str(input("请输入文件名:"))
adb = "adb shell dumpsys meminfo > log_su/adb_info.csv"
d = os.system(adb)
filename = "log_su/adb_info.csv"
get_mem()
write_report()
if __name__ == "__main__":
name_app()
tol_time = int(input("请输入脚本执行时间(分钟):"))
start_time = time.time()
get_applist()
write_head()
time_control()
mapping()
会在.py文件同级目录下生成3个文件夹,config、log_su、report,其中运行结果在report中
生成的内存结果图如下:
来源:https://blog.csdn.net/su869__/article/details/109646582


猜你喜欢
- 1.决定大小写是否敏感的参数在 MySQL 中,数据库与 data 目录中的目录相对应。数据库中的每个表都对应于数据库目录中的至少一个文件(
- 本文介绍了Python实现快速傅里叶变换的方法(FFT),分享给大家,具体如下:这里做一下记录,关于FFT就不做介绍了,直接贴上代码,有详细
- 在使用Tensor时,我们首先要掌握如何使用Tensor来定义不同数据类型的变量。Tensor时张量
- 本文实例为大家分享了Vue实现简单跑马灯特效的具体代码,供大家参考,具体内容如下效果:点击按钮让文字动起来,点击停止按钮让文字停止知识点:s
- 一、聚合函数聚合函数:又叫组函数,用来对表中的数据进行统计和计算,结合group by分组使用,用于统计和计算分组数据常用聚合函数count
- 本文实例讲述了Bootstrap实现前端登录页面带验证码功能。分享给大家供大家参考,具体如下:Bootstrap有自定义的验证码样式,在前端
- 在python中有很多字符串连接方式,今天就在这里具体总结一下:①.最原始的字符串连接方式:str1 + str2②.python 新字符串
- 一、对列表(list)进行排序推荐的排序方式是使用内建的sort()方法,速度最快而且属于稳定排序>>> a = [1,9
- 首先上一段程序:import numpy as nplist_a = list(range(10))print("list_a:
- 简单低级的爬虫速度快,伪装度低,如果没有反爬机制,它们可以很快的抓取大量数据,甚至因为请求过多,造成服务器不能正常工作。而伪装度高的爬虫爬取
- 用Flask处理图片非常容易,这一篇学习一下图片的上传、下载及展示。还是以实例代码演示为主。首先,实现一个简单的上传(过程中未做任何处理,只
- 自定义数据集在训练深度学习模型之前,样本集的制作非常重要。在pytorch中,提供了一些接口和类,方便我们定义自己的数据集合,下面完整的试验
- 在JAVASCRIPT中LEFT函数的等价函数:function left(mainStr,lngLen) {if&nb
- 本文实例为大家分享了python人民币大小写转换的具体代码,供大家参考,具体内容如下大家应该都知道,银行打印账单有时候会跟上人民币的阿拉伯数
- CAPTCHA,全称为“Completely Automated Public Turing test to tell Computers
- 下面把sqlserver中cross apply和outer apply关键字具体介绍展示如下:1.CROSS APPLY 和OUTER A
- <!--#include file="config.asp" -->&nbs
- 在批评Python的讨论中,常常说起Python多线程是多么的难用。还有人对 global interpreter lock(也被亲切的称为
- 科学设计你的网站网页:来自 Eye-Tracking研究的23节必修课 ——Christina Laun在网络设计领域关于Eye-
- 这几天正在追剧,原名《大秦帝国之天下》的《大秦赋》,看着看着又想把前几部刷一遍了,但第一部《裂变》自己没有高清资源,搜了一波发现yout