当前位置 博文首页 > jamelee的专栏:使用python编程获取Android设备CPU及Meminfo,生
以下是python源码实现,可直接使用~
?
import uiautomator2 as u2
import time
import threading
import os
import matplotlib.pyplot as plt
import numpy as np
import random
#serial="***"
#d=u2.connect(serial)
sn="*"
initstr="python -m uiautomator2 init >"
snfilename="./initdevice.txt"
activityfilename="./activityfile.txt"
packagefilename="./packagefile.txt"
sysmonkeylog="./sysmonkey.txt"
activityfile=open(activityfilename,mode="w+")
packagefile=open(packagefilename,mode="w+")
activitylist=[]
packagenamelist=[]
totalRAM=[]
freeRAM=[]
usedRAM=[]
lostRAM=[]
sysUserCPU=[]
sysKernelCPU=[]
sysTotalCPU=[]
packagefilterstr="******" #用于过滤公司内部的package
drawtime=3600*5 #every 5H draw one time picture for RAM and CPU Analysis
appswitchtimes=1000 #run 1000times circle switch to get packagename from the device
monkeyseed=int(random.random()*10000+1) #each run for one seed
monkeytimes=1200 #each time 0.3s monkey time long for 0.3*monkeytimes
silencetime=0.3*monkeytimes #keep silence as long as monkey time
getinfotime=5 #every 5s get one time info data
def initconnect():
global sn
global d
cmdstr=initstr+snfilename
print(cmdstr)
os.system(cmdstr)
sn=open(snfilename,mode="r+").readline().split("=")[1].replace(")","").strip()
print(len(sn))
d=u2.connect(sn)
def runAppswitch():
os.system("adb shell monkey -s "+str(monkeyseed)+" --pct-touch 10 --pct-appswitch 90 --throttle 300 -v "+str(monkeytimes))
def getPackageinfo():
count=0
global alist
global plist
while count<monkeytimes:
cmdstr="dumpsys window | grep mCurrentFocus | grep "+packagefilterstr
out=d.shell(cmdstr)
if(str(out).find("output=''")==-1):
if(str(out).find("mCurrentFocus=null")==-1):
if(str(out).split("u0")[1].find("}")!=-1):
activityinfostr=str(out).split("u0")[1].split("}")[0].strip()+"\n"
if(activityinfostr.find("/")!=-1):
packagenameinfostr=activityinfostr.split("/")[0].strip()+"\n"
activitylist.append(activityinfostr)
packagenamelist.append(packagenameinfostr)
time.sleep(0.2)
count=count+1
alist=list(set(activitylist))
plist=list(set(packagenamelist))
alist.sort()
plist.sort()
print("===============================================")
print(alist)
print(plist)
activityfile.writelines(alist)
activityfile.flush()
packagefile.writelines(plist)
packagefile.flush()
print("===============================================")
def runAm():
count=0
while count<10:
for act in alist:
cmdstr="adb shell am start -n "+act.strip("\n")
os.system(cmdstr)
time.sleep(3)
count=count+1
def runPackage():
count=0
while count<10:
for pkg in plist:
d.app_start(pkg.strip("\n"))
time.sleep(3)
d.app_stop(pkg.strip("\n"))
count+=1
def runSys():
while True:
#=====Run App switch:start and close
timestr=time.asctime( time.localtime(time.time()) )
print(timestr+"======runAppswitch。。。")
count=0
while count<appswitchtimes:
for pkg in plist:
d.app_start(pkg.strip("\n"))
time.sleep(2)
d.app_stop(pkg.strip("\n"))
count+=1
timestr=time.asctime( time.localtime(time.time()) )
print(timestr+"======endAppswitch。。。")
#=====Run Sys:monkey and silence
timestr=time.asctime( time.localtime(time.time()) )
print(timestr+"======runSysSilence。。。")
time.sleep(silencetime) #keep silence for
time.sleep(10)
timestr=time.asctime( time.localtime(time.time()) )
print(timestr+"======runSysMonkey")
sysmonkeystr="adb shell monkey -s "+str(monkeyseed)+" --ignore-timeouts --ignore-crashes --ignore-security-exceptions --pct-touch 85 --pct-syskeys 7 --pct-majornav 5 --ignore-native-crashes --monitor-native-crashes --throttle 300 -v -v -v "+str(monkeytimes)+" >> "+sysmonkeylog #run sys monkey
os.system(sysmonkeystr) #run monkey 10m
print(time.asctime( time.localtime(time.time()) )+"======runSysMonkey ——> Finished")
#=====Run App:monkey and silence
i=0
while i<len(plist):
timestr=time.asctime( time.localtime(time.time()) )
print(timestr+"======runAPPSilence。。。"+plist[i].strip("\n"))
d.app_start(plist[i].strip("\n"))
time.sleep(silencetime) # App[i] Start Silence Time 10min
timestr=time.asctime( time.localtime(time.time()) )
print(timestr+"======runAPPMonkey。。。"+plist[i].strip("\n"))
cmdmonkey="adb shell monkey -p "+plist[i].strip("\n")+" -s "+str(monkeyseed)+" --throttle 300 --pct-touch 90 -v -v -v "+str(monkeytimes)+">> ./"+plist[i].strip("\n")+".monkey.txt" #Run app Monkey
os.system(cmdmonkey) #App[i] Start Monkey
time.sleep(10)
i+=1
#os.system("adb shell monkey -p cn.kuwo.kwmusiccar -s 120 --ignore-timeouts --ignore-crashes --ignore-security-exceptions --pct-touch 85 --pct-syskeys 7 --pct-majornav 5 --ignore-native-crashes --monitor-native-crashes --throttle 300 -v -v -v 1200 >>d:/8666log/sysmonkey.txt") #run monkey 5m
def getSysMeminfo():
while True:
timestr=time.asctime( time.localtime(time.time()) )
print(timestr+"getSysMeminfo。。。")
out=d.shell("dumpsys meminfo |grep RAM")
outstr=str(out)+"\n"
#ram_outfile.write(outstr)
#ram_outfile.flush()
totalRAM.append(round((int(outstr.split(":")[1][:10].replace(",",""))/1024)))
freeRAM.append(round((int(outstr.split(":")[2][:10].replace(",",""))/1024)))
usedRAM.append(round((int(outstr.split(":")[3][:10].replace(",",""))/1024)))
lostRAM.append(round((int(outstr.split(":")[4][:10].replace(",",""))/1024)))
#dataRAMstr="freeRAM:"+"{:6d}".format(freeRAM)+" usedRAM:"+"{:6d}".format(usedRAM)+" usedPssRAM:"+"{:6d}".format(usedPssRAM)+" freeCachekernelRAM:"+"{:6d}".format(freeCachekernelRAM)+"\n"
#dataOfRAM.write(dataRAMstr)
#dataOfRAM.flush()
#sysFreeRAM.append(freeRAM)
#sysUsedRAM.append(usedRAM)
#sysUsedPssRAM.append(usedPssRAM)
#sysFreeCachekernelRAM.append(freeCachekernelRAM)
time.sleep(getinfotime)
def getSysCPUinfo():
while True:
timestr=time.asctime( time.localtime(time.time()) )
print(timestr+"getSysCPUinfo。。。")
out=d.shell("dumpsys cpuinfo|grep TOTAL")
outstr=str(out)+"\n"
#cpu_outfile.write(outstr)
#cpu_outfile.flush()
totalCPU=outstr.split(":")[0][22:26].lstrip().rstrip().strip("%")
userCPU=outstr.split(":")[1].split("+")[0].split("u")[0].lstrip().rstrip().strip("%")
kernelCPU=outstr.split(":")[1].split("+")[1].split("k")[0].lstrip().rstrip().strip("%")
#iowaitCPU=outstr.split(":")[1].split("+")[2][:4]
#cpustr="TotalCPU:"+"%5s " %totalCPU+"User:"+"%5s " %userCPU+"kernelCPU:"+"%5s " %kernelCPU+"\n"
#dataOfCPU.write(cpustr)
#dataOfCPU.flush()
sysTotalCPU.append(float(totalCPU))
sysUserCPU.append(float(userCPU))
sysKernelCPU.append(float(kernelCPU))
time.sleep(getinfotime)
def drawSysinfo(): #作用:定時生成meminfo數據圖
while True:
time.sleep(drawtime)
plt.figure(figsize=(120,40))
plt.subplot(211)
plt.xlabel('Time of catch', fontsize=20) # x轴的label
plt.ylabel('Meminfo RAM', fontsize=20) # y轴的label 备注(plot所有的原件都可以加fontsize属性)
plt.title("Meminfo Analysis", fontsize=50) # 图的title
plt.plot(totalRAM[:],linestyle = "-", color = 'y',label="Total RAM| average: {} variance: {} median: {} "
.format('%.1f' % np.mean(totalRAM[:]),'%.1f' % np.var(totalRAM[:]),'%.1f' % np.median(totalRAM[:])))
plt.plot(freeRAM[:],linestyle = "-", color = 'g',label="Free RAM| average: {} variance: {} median: {} "
.format('%.1f' % np.mean(freeRAM[:]),'%.1f' % np.var(freeRAM[:]),'%.1f' % np.median(freeRAM[:])))
plt.plot(usedRAM[:],linestyle = "-", color = 'k',label="Used RAM| average: {} variance: {} median: {} "
.format('%.1f' % np.mean(usedRAM[:]),'%.1f' % np.var(usedRAM[:]),'%.1f' % np.median(usedRAM[:])))
plt.plot(lostRAM[:],linestyle = "-", color = 'r',label="Lost RAM| average: {} variance: {} median: {} "
.format('%.1f' % np.mean(lostRAM[:]),'%.1f' % np.var(lostRAM[:]),'%.1f' % np.median(lostRAM[:])))
plt.subplot(212)
plt.xlabel('Time of catch', fontsize=20) # x轴的label
plt.ylabel('CPU info', fontsize=20) # y轴的label 备注(plot所有的原件都可以加fontsize属性)
plt.title("CPU Analysis", fontsize=50)
plt.plot(sysTotalCPU[:],linestyle = "-", color = 'r')
plt.plot(sysUserCPU[:],linestyle = "-", color = 'g')
plt.plot(sysKernelCPU[:],linestyle = "-", color = 'b')
plt.draw()
figname=str(time.time())+".png"
plt.savefig(figname)
plt.pause(5)
plt.close()
#plt.show()
threads=[]
s1=threading.Thread(target=runAppswitch,args=())
s2=threading.Thread(target=getPackageinfo,args=())
s3=threading.Thread(target=getSysMeminfo,args=())
s4=threading.Thread(target=runSys,args=())
s5=threading.Thread(target=getSysCPUinfo,args=())
s6=threading.Thread(target=drawSysinfo,args=())
threads.append(s1)
threads.append(s2)
if __name__=='__main__':
initconnect()
s1.start()
s2.start()
#print(s1.isAlive())
#print(s2.isAlive())
#print("packageinfo get Finished!")
while True:
#print("==================wait to start AM==================")
if s2.isAlive()!=True:
s4.start()
s3.start()
s5.start()
s6.start()
break
time.sleep(5)
?
cs