当前位置 博文首页 > jamelee的专栏:使用python编程获取Android设备CPU及Meminfo,生

    jamelee的专栏:使用python编程获取Android设备CPU及Meminfo,生

    作者:[db:作者] 时间:2021-08-12 18:04

    以下是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