如何快速從adb shell dump裡抓取資料

2021-09-24 05:45:31 字數 1808 閱讀 7772

最近在研究比較通用的adb效能測試,自己參考網上的許許多多**,寫了各種抓cpu\記憶體\fps等資料的方法。

方法寫好以後,放到真機上跑了一下,發現功能是實現了,但**的效能很有問題:

以下面這段**為例:

def get_totalmemory(self):

command = adb + " -s {} shell dumpsys meminfo ".format(self.get_mdevice())

print(command)

memory=os.popen(command)

res = memory.read()

totalram=0

for line in res.splitlines():

line=line.strip()

list = line.split(":")

if list[0]=="total ram":

if self.get_androidversion()== 5 or self.get_androidversion()== 6:

totalram = format(int(list[1].split(" ")[1])/1024,".2f")

elif self.get_androidversion()== 7 or self.get_androidversion()== 8:

totalram = format(int(list[1].split("k")[0].replace(",",""))/1024,".2f")

break

return totalram

這段是抓裝置總記憶體的。總體思路是先拼接adb shell命令,獲得當前裝置的meminfo資料,然後呼叫os.popen()執行該命令,然後再遍歷執行結果,解析字串,找到「total ram」一項字段,然後根據不同的安卓版本,切割字串,獲得最終的記憶體值。

執行結果如下:

可以看到,執行**花費了5、6秒鐘。

通過逐行打點計時,定位到問題在這麼一段**:

res=memory.read()這行花費了3.7秒以上。

通過查閱資料,發現python使用read()/readline()/readlines()三個方法來讀取內容。

具體見

我反覆地除錯這3個方法,結果並沒有什麼區別。均需要花費3、4秒時間才能解析adb dump資料。

一籌莫展之際,我突然想到,我為什麼要去read這個dump檔案呢?我直接從dump裡面查值不就好了麼?

修改**如下

去除掉read()的操作,同時也去掉了相應的splitlines()操作,直接在dump返回值裡進行for迴圈。

**效率瞬間提高了好幾倍。

兩台裝置均在1秒內就返回了所需要的adb dump資訊。

注:62001使用安卓7的os,執行時間穩定在0.8-1.0秒,

62025使用安卓5的os,執行時間穩定在0.4-0.5秒。

這樣,使通過adb dump進行實時資訊的記錄成為可能。

如何從SLB故障中快速恢復

3月14日17 32 19 10時段,阿里雲杭州區可用區e的大量slb出現服務不可用的問題,疑似健康檢查系統出現故障,所有後端節點不論是否監控都一律都被標記為 異常 導致tcp slb的服務connection failed,http slb出現502錯誤。小博無線線上業務系統完全基於阿里雲搭建,在...

快速排序 從右邊開始

先給出快速排序的 void quicksort vector nums,int left,int right nums left nums i nums i temp quicksort nums,left,i 1 quicksort nums,i 1,right 以nums left 作為基數te...

從調包到工程實戰,如何快速掌握機器學習技能

基礎技能是必備的 一方面是因為機器學習本身的體系十分龐大,當然只是教sklearn調個模型顯然不是在認真講機器學習。學習路徑的設計 知識點難易度的把握,案例的選取,內容的深入程度 等細節都做了大量延伸和重點打磨。既要易於理解,也要兼顧深度 掌握那部分核心技能,並在實際的案例中輸出結果 比如系統的微積...