天天看點

android應用記憶體占用測試(每隔一秒列印procrank的資訊)

1.記憶體占用

    對于智能手機而言,記憶體大小是固定的;是以,如果單個app的記憶體占用越小,手機上可以安裝運作的app就越多;或者說app的記憶體占用越小,在手機上運作就會越流暢。是以說,記憶體占用的大小,也是考量app性能的一個重要名額

2.原理說明

對于一個app,我們可以關注它在3種狀态下的記憶體占用情況:

空負荷————app已經在背景運作,但是使用者沒有使用;

中負荷————app在前台運作,使用者進行了少量操作;

滿負荷————使用者持續頻繁大量操作,app接近飽和狀态運作。

然而,除了第一種情況,其它兩種的主觀性很強,不是很容易區分。正常産品測試的時候,隻要驗證背景運作(5~10分鐘為宜)和使用者持續頻繁大量操作(10~15分鐘為宜)這兩種情況下就可以了。

這樣一來,就變成了如何持續統計并記錄app所占記憶體的問題。Procrank工具可以實作這個功能。

3.procrank的安裝

1)下載下傳procrank壓縮包,下載下傳位址:http://download.csdn.net/download/yincheng886337/9433538

2)解壓,将procrank檔案push到手機的  /system/xbin目錄下;   

     指令:adb push procrank /system/xbin

     将procmem檔案push到手機的  /system/xbin目錄下;

     指令:adb push procmem /system/xbin

     将libpagemap.so檔案push到手機的  /system/lib目錄下;

     指令:adb push libpagemap.so /system/lib

3)進入adb shell,擷取root權限,分别給procrank、procmem、libpagemap.so三個檔案777權限,如下:

     chmod 777 /system/xbin/procrank

     chmod 777 /system/xbin/procmem

     chmod 777 /system/lib/libpagemap.so

     如果push不進三個檔案或者修改不了三個檔案的權限,那重新挂載一下system,再修改三個檔案的權限,如下:

     mount   -o  remount,rw    /system 

4.  procrank各項值解析

     進入adb shell,擷取root權限,輸入指令:procrank即可,如下圖:

android應用記憶體占用測試(每隔一秒列印procrank的資訊)

     VSS - Virtual Set Size 虛拟耗用記憶體(包含共享庫占用的記憶體)

     RSS - Resident Set Size 實際使用實體記憶體(包含共享庫占用的記憶體)

     PSS - Proportional Set Size 實際使用的實體記憶體(比例配置設定共享庫占用的記憶體)

     USS - Unique Set Size 程序獨自占用的實體記憶體(不包含共享庫占用的記憶體)

     VSS和USS對檢視某一程序自身的記憶體狀況沒什麼作用,因為他們包含了共享庫的記憶體使用,而往往共享庫的資源占用比重是很大的,這樣就稀釋了對Process自身建立記憶體波動。

     我們一般觀察Uss來反映一個程序的記憶體使用情況,Uss 的大小代表了隻屬于本程序正在使用的記憶體大小,這些記憶體在此程序被殺掉之後,會被完整的回收掉。

     USS是一個非常有用的數字,因為它揭示了運作一個特定程序的真實的記憶體增量大小,如果程序被終止,USS就是實際被返還給系統的記憶體大小。USS 是針對某個程序開始有可疑記憶體洩露的情況,進行檢測的最佳數字。

   懷疑某個程式有記憶體洩露可以檢視USS值是否一直有增加。

android應用記憶體占用測試(每隔一秒列印procrank的資訊)
android應用記憶體占用測試(每隔一秒列印procrank的資訊)

5. 寫腳本每隔一秒自動列印procrank的資訊

1)首先建立一個cmd.txt檔案,寫入需要執行的adb shell 指令,如:

android應用記憶體占用測試(每隔一秒列印procrank的資訊)

2)寫python腳本,如下:

import os,sys,time
for i in range(500):
    os.popen("adb shell <cmd.txt")   #運作cmd.txt中的指令
    step1=os.popen("adb  pull /data/test/t1.txt F:/100python/log102101.txt")   #把生成的t1.txt檔案下載下傳到本地
    fo = open("log102101.txt", \'r+\')
    input = fo.read()
    fo2 = open("mem.txt", \'r+\')
    fo2.seek(0, os.SEEK_END)    #定位到mem.txt檔案尾部
    fo2.write(input)    #寫入t1.txt的内容
    fo.close()
    fo2.close()
    time.sleep(1)   #休息一秒,再進入下一個循環,也就是每隔一秒列印一次procrank的資訊
print "ok"    #運作完畢的标志      

 注:cmd.txt檔案,python腳本,mem.txt都存放在同一目錄下

3)運作monkey,同時執行寫好的腳本

    生成的mem.txt檔案如下:

android應用記憶體占用測試(每隔一秒列印procrank的資訊)

 附monkey指令:

adb shell monkey -p com.waboon.test --ignore-crashes --ignore-timeouts --ignore-native-crashes --pct-touch 30 -v -v -v --throttle 200 1000

4)mem.txt檔案中第五列的值是USS,将mem.txt檔案用notepad打開,再選擇第五列的值複制到excel中生成圖表,如下:

android應用記憶體占用測試(每隔一秒列印procrank的資訊)

5)分析USS的值,檢視是否有記憶體洩露。

遇到的問題:運作procrank時提示:

error: only position independent executables (PIE) are supported.

解決方法:下載下傳bypass-pie.zip

下載下傳連結: http://pan.baidu.com/s/1i35O8Wd

解壓,把裡面的linker檔案替換手機 /system/bin裡的linker檔案