一、实现逻辑:先编写一个shell脚本,然后给脚本推送到设备的:/sdcard/test 目录下 在执行shell脚本来循环获取CPU和内存的数据,获取完数据之后,在使用adb pull给数据文件推出来,然后使用python读取文件,读取的条件是根军包名进行检索的
shell脚本:
#!/system/bin/sh
#
declare n=0
while ((n<=300))
do
echo count=$n
let n++
#himm 0xf840e530 0x1
date >> /sdcard/test/meminfo_carplay.log
echo
dumpsys meminfo com.thunder.carplay >> //sdcard/test/meminfo_carplay.log
date >> /sdcard/test/meminfo_meida.log
echo
dumpsys meminfo com.thunder.carplay:media >> //sdcard/test/meminfo_meida.log
date >> /sdcard/test/top.log
echo
top -b -d 1 -n 1 >> //sdcard/test/top.log
done
获取CPU的命令是通过:top -b -d 1 -n 1
获取内存的命令是通过:dumpsys meminfo com.thunder.carplay:media
二、下边是python脚本获取数据生成折线图
from multiprocessing import Process
from threading import Thread
import xlwt
import xlsxwriter
import os
# from fpsTestOne import parseFPS
path1 = os.path.dirname(__file__)
print(path1)
def cpu_mem_02():
workbook = xlwt.Workbook()
worksheet = workbook.add_sheet('MyWorksheet', cell_overwrite_ok=True)
path_top_file = path1 + "\\test\\top.log"
path_meminfo_carplay_file = path1 + "\\test\\meminfo_carplay.log"
path_meminfo_meida_file = path1 + "\\test\\meminfo_meida.log"
file0 = open(path_top_file) # 打开top.log文件
file1 = open(path_meminfo_carplay_file) # 打开meminfo_carplay.log
file2 = open(path_meminfo_meida_file) # 打开meminfo_meida.log
carplay_cpu_value_list = [] # 定义列表用于存储从文件中获取的特定数据
carplayMedia_cpu_value_list = [] # carplayMedia_cpu_value
carplay_meminfo_list = [] # carplay_meminfo
carplayMedia_meminfo_list = [] # carplayMedia_meminfo
cpu_str_time = [] # cpu 时间
carplay_mem_str_time = [] # 内存时间
carplaymedia_mem_str_time = []
for line in file0.readlines():
# 如果此行不为空
if line.split():
line_split = line.split()
if len(line_split) > 5:
if line_split[4] == "SST":
cpu_str_time.append(line_split[3]) # 获取文件中top值存入的时间
if len(line_split) > 11:
if line_split[11] == 'com.thunder.carplay':
carplay_cpu_value_list.append(float(line_split[8])) # 获取文件中top中carplay进程的cpu
if line_split[11] == 'com.thunder.carplay:media':
carplayMedia_cpu_value_list.append(float(line_split[8])) # 获取文件中top中carplay:media进程的cpu
file0.close()
for line in file1.readlines():
# 如果此行不为空
if line.split():
line_split = line.split()
if len(line_split) > 5:
if line_split[4] == "SST":
carplay_mem_str_time.append(line_split[3]) # 获取文件中meminfo中carplay进程的时间
if len(line_split) == 9:
carplay_meminfo_list.append(round(float(line_split[1]) / 1024, 2)) # 获取文件中memnifo中carplay:media进程的内存信息
file1.close()
for line in file2.readlines():
# 如果此行不为空
if line.split():
line_split = line.split()
if len(line_split) > 5:
if line_split[4] == "SST":
carplaymedia_mem_str_time.append(line_split[3])
if len(line_split) == 9:
carplayMedia_meminfo_list.append(
round(float(line_split[1]) / 1024, 2)) # 获取文件中memnifo中carplay:media进程的内存信息
file2.close()
worksheet.write(0, 0, "carpaly_cpu") # 写入列名
worksheet.write(0, 1, "carpaly_max_cpu")
worksheet.write(0, 2, "carpaly_min_cpu")
worksheet.write(0, 3, "carpaly_avg_cpu")
worksheet.write(0, 4, "carpaly_cpu_time")
worksheet.write(0, 5, "carpalymedia_cpu")
worksheet.write(0, 6, "carpalymedia_max_cpu")
worksheet.write(0, 7, "carpalymedia_min_cpu")
worksheet.write(0, 8, "carpalymedia_avg_cpu")
worksheet.write(0, 9, "carpalymedia_cpu_time")
worksheet.write(0, 10, "carpaly_meminfo")
worksheet.write(0, 11, "carpaly_max_meminfo")
worksheet.write(0, 12, "carpaly_min_meminfo")
worksheet.write(0, 13, "carpaly_avg_meminfo")
worksheet.write(0, 14, "carpaly_mem_time")
worksheet.write(0, 15, "carpalyMedia_meminfo")
worksheet.write(0, 16, "carpalyMedia_max_meminfo")
worksheet.write(0, 17, "carpalyMedia_min_meminfo")
worksheet.write(0, 18, "carpalyMedia_avg_meminfo")
worksheet.write(0, 19, "carpalyMedia_mem_time")
for i in range(len(carplay_cpu_value_list)):
worksheet.write(i + 1, 0, label=float(carplay_cpu_value_list[i]))
worksheet.write(i + 1, 4, label=cpu_str_time[i]) # 往excel中写入cpu数据
print("..........", carplay_cpu_value_list)
max_value = max(carplay_cpu_value_list) # 求cpu 最大值
min_value = min(carplay_cpu_value_list) # 求cpu 最小值
avg = (sum(carplay_cpu_value_list)) / len(carplay_cpu_value_list) # 求cpu平均值
worksheet.write(1, 1, max_value)
worksheet.write(1, 2, min_value)
worksheet.write(1, 3, round(avg, 2))
if len(carplayMedia_cpu_value_list) > 0:
for x in range(len(carplayMedia_cpu_value_list)):
worksheet.write(x + 1, 5, label=float(carplayMedia_cpu_value_list[x]))
worksheet.write(x + 1, 9, label=cpu_str_time[x])
max_value = max(carplayMedia_cpu_value_list)
min_value = min(carplayMedia_cpu_value_list)
avg = (sum(carplayMedia_cpu_value_list)) / len(carplayMedia_cpu_value_list)
worksheet.write(1, 6, max_value)
worksheet.write(1, 7, min_value)
worksheet.write(1, 8, round(avg, 2))
for m in range(len(carplay_meminfo_list)):
worksheet.write(m + 1, 10, label=round((carplay_meminfo_list[m]), 2))
worksheet.write(m + 1, 14, label=carplay_mem_str_time[m])
file1.close()
max_value = max(carplay_meminfo_list)
min_value = min(carplay_meminfo_list)
avg = (sum(carplay_meminfo_list)) / len(carplay_meminfo_list)
worksheet.write(1, 11, round(max_value, 2))
worksheet.write(1, 12, round(min_value, 2))
worksheet.write(1, 13, round(avg, 2))
for j in range(len(carplayMedia_meminfo_list)):
worksheet.write(j + 1, 15, label=round((carplayMedia_meminfo_list[j]), 2))
worksheet.write(j + 1, 19, label=carplaymedia_mem_str_time[j])
file2.close()
max_value = max(carplayMedia_meminfo_list)
min_value = min(carplayMedia_meminfo_list)
avg = (sum(carplayMedia_meminfo_list)) / len(carplayMedia_meminfo_list)
worksheet.write(1, 16, round(max_value, 2))
worksheet.write(1, 17, round(min_value, 2))
worksheet.write(1, 18, round(avg, 2))
# 保存
workbook.save('carplay_Excel_test内存cpu统计.xls') # 保存至excel文件
shengczxt(carplay_cpu_value_list, cpu_str_time, carplayMedia_cpu_value_list, carplay_meminfo_list,
carplay_mem_str_time, carplayMedia_meminfo_list) # 生成折线图
def exe_data():
# 默认统计25次,如需更改需要修改top_count_car.sh中的循环次数n<=24
path_top_count_car = path1 + "/top_count_car.sh"
# 将top_count_car.sh传到指定目录并执行
command1 = "adb shell mkdir /sdcard/test & adb push %s /sdcard/test & adb shell chmod 777 /sdcard/test/top_count_car.sh & adb shell sh /sdcard/test/top_count_car.sh" % path_top_count_car
os.system(command1)
# pull文件至本地对应目录下
command2 = "adb pull /sdcard/test %s & adb shell rm -rf /sdcard/test/*" % path1
os.system(command2)
cpu_mem_02()
def shengczxt(list1, list2, list3, list4, list5, list6=None):
workbook = xlsxwriter.Workbook('new_excel_内存cpu折线图.xlsx') # 创建新的excel
worksheet = workbook.add_worksheet('carpaly') # 创建新的sheet
headings1 = ['carplaycpu占比', 'com.thunder.carplay的cpu'] # 创建表头
headings2 = ['carplay_media占比', 'com.thunder.carplay:media的CPU'] # 创建表头
headings3 = ['carplaymeminfo', 'com.thunder.carplay的meminfo'] # 创建表头
headings4 = ['carplay_media_meminfo', 'com.thunder.carplay:media的meminfo'] # 创建表头
# 将列表放置在data
data = [list1,
list2,
list3,
list4,
list5,
list6]
print(data)
print("**********************************")
# 统计到第几行数据,根据所传的列表长度决定
row_num1 = str(len(list1) + 1)
row_num2 = str(len(list2) + 1)
row_num3 = str(len(list3) + 1)
row_num4 = str(len(list4) + 1)
row_num5 = str(len(list5) + 1)
row_num6 = str(len(list6) + 1)
# 添加表头
worksheet.write_row('A1', headings1)
worksheet.write_row('P1', headings2)
worksheet.write_row('S1', headings3)
worksheet.write_row('U1', headings4)
# 将数据插入到表格中
worksheet.write_column('A2', data[0])
worksheet.write_column('B2', data[1])
worksheet.write_column('P2', data[2])
worksheet.write_column('Q2', data[1])
worksheet.write_column('S2', data[3])
worksheet.write_column('T2', data[4])
worksheet.write_column('U2', data[5])
worksheet.write_column('V2', data[4])
chart_col1 = workbook.add_chart({'type': 'line'}) # 新建图表格式 line为折线图
chart_col2 = workbook.add_chart({'type': 'line'}) # 新建图表格式 line为折线图
chart_col1.add_series( # 给图表设置格式,填充内容
{
'name': '=carpaly!$B$1',
'categories': "carpaly!$B$2:$B$" + row_num1,
'values': '=carpaly!$A$2:$A$' + row_num2,
'line': {'color': 'red'},
}
)
chart_col1.add_series( # 给图表设置格式,填充内容
{
'name': '=carpaly!$Q$1',
'categories': "carpaly!$Q$2:$Q$" + row_num3,
'values': '=carpaly!$P$2:$P$' + row_num2,
'line': {'color': 'blue'},
}
)
chart_col2.add_series( # 给图表设置格式,填充内容
{
'name': '=carpaly!$T$1',
'categories': "carpaly!$T$2:$T$" + row_num4,
'values': '=carpaly!$S$2:$S$' + row_num5,
'line': {'color': 'red'},
}
)
chart_col2.add_series( # 给图表设置格式,填充内容
{
'name': '=carpaly!$V$1',
'categories': "carpaly!$V$2:$V$" + row_num4,
'values': '=carpaly!$U$2:$U$' + row_num6,
'line': {'color': 'blue'},
}
)
chart_col1.set_title({'name': 'Cpu'}) # 设置标题
chart_col1.set_x_axis({'name': "运行时间"})
chart_col1.set_y_axis({'name': '%'}) # 设置图表表头及坐标轴
chart_col2.set_title({'name': 'Meminfo'}) # 设置标题
chart_col2.set_x_axis({'name': "运行时间"})
chart_col2.set_y_axis({'name': 'MB'}) # 设置图表表头及坐标轴
chart_col1.set_style(1) ##设置样式
chart_col2.set_style(1)
worksheet.insert_chart('D10', chart_col1, {'x_offset': 25, 'y_offset': 10}) # 放置图表位置
worksheet.insert_chart('X10', chart_col2, {'x_offset': 25, 'y_offset': 10}) # 放置图表位置
workbook.close()
if __name__ == '__main__':
# 多线程执行,即收集cpu\内存数据又收集fps
# Thread(target=exe_data).start() #收集数据并生成cpu折线图
# Thread(target=parseFPS("com.thunder.carplay",count=10)).start()#生成fps折线图
exe_data()
三、具体的样式见附件