Python获取android设备cpu和内存占用情况

功能:获取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中

生成的内存结果图如下:

到此这篇关于Python获取android设备cpu和内存占用情况的文章就介绍到这了,更多相关Python获取android设备内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

以上是 Python获取android设备cpu和内存占用情况 的全部内容, 来源链接: utcz.com/z/343987.html

回到顶部