最近正好自己用python寫了一個小工具,獲取android的一些性能指標,看是否能在做UI自動化的同時驗證一下app的性能,封裝了一些提取參數(shù)的方法僅供參考,里面包含了這幾項,都是通過用adb命令來實現(xiàn),下面說以下整個工具的運作流程。

相關(guān)庫準備:

  1. wx-----------------wxpython用來產(chǎn)生圖形界面

  2. gevent-------------線程

  3. time---------------時間相關(guān)模塊

  4. re-----------------正則表達式操作

  5. multiprocessing----多進程

  6. os-----------------處理文件和目錄

  7. threading----------操作線程

如何腳本監(jiān)控android設(shè)備上指定app的cpu和內(nèi)存

第一步:獲取設(shè)備和app的基礎(chǔ)參數(shù)

1、檢查設(shè)備是否存在

def get_devices(self):
devices = []
result = subprocess.Popen("adb devices", shell=True, stdout=subprocess.PIPE,stderr=subprocess.PIPE).stdout.readlines()
if len(result) - 2 == 1:
for line in result[1:]:
devices.append(line.strip().decode())
return devices[0].split()[0]
else:
return 'No device found'

2、獲取packagename

def getpackagename(self):
pattern = re.compile(r"[a-zA-Z0-9.]+/.[a-zA-Z0-9.]+")
package = subprocess.Popen("adb shell dumpsys activity | findstr mFocusedActivity", shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE).stdout.read()
package = (str(package))
packagename = pattern.findall(package)[0].split('/')[0]
return packagename

3、獲取activity

def getactivity(self):
pattern = re.compile(r"[a-zA-Z0-9.]+/.[a-zA-Z0-9.]+")
package = subprocess.Popen("adb shell dumpsys activity | findstr mFocusedActivity", shell=True stdout=subprocess.PIPE, stderr=subprocess.PIPE).stdout.read()
package = (str(package))
activity = pattern.findall(package)[0].split('/')[1]
print(activity)
return activity

第二步:設(shè)置定時時間

設(shè)置定時時間,多長時間間隔獲取一次數(shù)據(jù),并將數(shù)據(jù)動態(tài)展示在圖形界面,也可以將數(shù)據(jù)存在Excle或做出圖形更直觀(打算后期實現(xiàn))

第三步:通過基礎(chǔ)參數(shù)拼接獲取其他信息

1、獲取內(nèi)存

mem_list = []

def mem(self):

cmd = 'adb -s ' + self.get_devices() + ' shell dumpsys meminfo ' + self.getpackagename()

men_s = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).stdout.readlines()

for info in men_s:

if len(info.split()) > 0 and info.split()[0].decode() == "TOTAL":

self.mem_list.append((int(info.split()[1].decode()) // 1024))

men_list = str(info.split()[1].decode())

return self.mem_list

2、獲取cpu

cpu_list = []

def getcpu(self):

cmd = 'adb -s ' + self.get_devices() + ' shell top -n 1| findstr ' + self.getpackagename()

top_info = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).stdout.readlines()

if len(top_info) >= 1:

self.cpu_list.append(int(top_info[0].split()[2][0:-1]))

return self.cpu_list

3、獲取電量

def get_battery(self):

battery_cmd = "adb shell dumpsys battery"

batterys = []

battery_s = subprocess.Popen(battery_cmd, shell=True, stdout=subprocess.PIPE,stderr=subprocess.PIPE).stdout.readlines()

battery= (battery_s[7].split())[1].decode()

return battery

4、獲取溫度

def get_temperature(self):

battery_cmd = "adb shell dumpsys battery"

battery_s = subprocess.Popen(battery_cmd, shell=True,stdout=subprocess.PIPE,

stderr=subprocess.PIPE).stdout.readlines()

temperature = str((int((battery_s[10].split())[1].decode())) * 0.1)

return temperature

5、啟動時間

def get_startime(self):

starttime_cmd = "adb shell am start -W -n XXXactivity"#XXXactivity可以從getactivity獲取

times = []

starttime_s = subprocess.Popen(starttime_cmd, shell=True, stdout=subprocess.PIPE,stderr=subprocess.PIPE).stdout.readlines()

if (starttime_s[1].split())[1].decode() == 'ok':

statrtime = (starttime_s[5].split())[1].decode()

return statrtime

else:

return '啟動計時失敗'

如何腳本監(jiān)控android設(shè)備上指定app的cpu和內(nèi)存

上面的部分python代碼縮進格式可能會有問題,引用的時候需要注意,現(xiàn)在已實現(xiàn)了提取數(shù)據(jù)和在圖形界面展示的部分,至于上面為什么會引入進程和線程多個模塊,是因為這塊還沒有考慮好要怎么實現(xiàn)。