Android 效能資料採集(概要)

CharliChen發表於2017-01-24

CPU

adb shell dumpsys cpuinfo |grep packageName >/address/cpu.txt

大家看第一個應用CPU佔用率68%,這個過程是在使用者(user)中花61%的時間,並在核心空間(kernel)花費7.1%的時間。

或者:

adb shell top |grep packagename>/address/cpu.txt


記憶體

1. 記憶體耗用:

VSS - Virtual Set Size 虛擬耗用記憶體(包含共享庫佔用的記憶體)
RSS - Resident Set Size 實際使用實體記憶體(包含共享庫佔用的記憶體)
PSS - Proportional Set Size 實際使用的實體記憶體(比例分配共享庫佔用的記憶體)
USS - Unique Set Size 程式獨自佔用的實體記憶體(不包含共享庫佔用的記憶體)

1.空閒狀態下的應用記憶體消耗情況
2.中等規格狀態下的應用記憶體消耗情況
3.滿規格狀態下的應用記憶體消耗情況
4.應用記憶體峰值情況
5.應用記憶體洩露情況
6.應用是否常駐記憶體
7.壓力測試後的記憶體使用情況

2. 記憶體問題:

  • 記憶體抖動

大量的物件在短時間建立和釋放,頻繁觸發GC,造成UI卡頓; 避免在迴圈體中new物件 String 和StringBuffer例子 避免在FrameCallback.doFrame()方法中new物件 重用物件 e.g 字串拼接使用StringBuff

  • 記憶體洩露 OOM

程式中一些物件不再使用,但是一直被該物件的引用所持有,導致GC無法回收。
Activity洩露:Activity Drawable
Fragment洩露

3. 記憶體採集方式:

1.使用 android 本身提供的 ActivityManager.MemoryInfo() 方法獲得(此方法請百度或google)此類第三方工具有如網易的Emmagee、安測試、騰訊的GT等

private void GetMemory() {

    final ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);    

    ActivityManager.MemoryInfo info = new ActivityManager.MemoryInfo();   

    activityManager.getMemoryInfo(info);    

    Log.i(tag,"系統剩餘記憶體:"+(info.availMem >> 10)+"k");   

    Log.i(tag,"系統是否處於低記憶體執行:"+info.lowMemory);

    Log.i(tag,"當系統剩餘記憶體低於"+info.threshold+"時就看成低記憶體執行");
} 

availMem:表示系統剩餘記憶體

lowMemory:它是boolean值,表示系統是否處於低記憶體執行

hreshold:它表示當系統剩餘記憶體低於好多時就看成低記憶體執行

我用過以上三種最多,其實Top 也可以 還有很多方法都可以。

2.使用 android 提供的 adb shell dumpsys 命令來獲取

adb shell dumpsys meminfo |grep packagename >/address/mem.txt

3.使用 android 提供的 procrank
首先去google獲取procrank、procmem、libpagemap.so 三個檔案 ;

然後push檔案,執行

adb push procrank /system/xbin adb push procmem /system/xbin adb push libpagemap.so /system/lib

賦權

adb shell chmod 6755 /system/xbin/procrank adb shell chmod 6755 /system/xbin/procmem adb shell chmod 6755 /system/lib/libpagemap.so

在開啟工具記錄

adb shell procrank |grep packagename >/address/procrank.txt

對於記憶體的限制 是 dalvik heap不能超過最大限制,跟Native heap沒有關係。


流量

流量測試包括以下測試項:

  • 應用首次啟動流量提示
  • 應用後臺連續執行 2 小時的流量值
  • 應用高負荷執行的流量峰值
  • 應用中等負荷執行時的流量均值

1.
adb shell cat /proc/”+Pid+”/net/dev”

這邊的wlan0代表wifi 上傳下載量標識! 上傳下載量單位是位元組可以/1024換算成KB
這裡可以看到下載的位元組數 、資料包 和 傳送的位元組數 、資料包
小技巧:wlan0這些值如何初始化0 很簡單 你開啟手機飛航模式再關掉就清0了

2.
通過直接讀取android系統上的兩個檔案的內容:
Proc/uid_stat/{UID}/tcp_snd和tcp_rcv,其中UID是每個app安裝時分配的唯一編號用於識別該app,tcp_snd中的資料表示法術的資料累計大小,單位是位元組,tcp_rcv表示接收到的資料累計大小。

(1)首先獲取app的PID:
adb shell ps |grep packageName
(2)然後獲取app的UID
adb shell cat /proc/”+Pid+”/status
(3)獲取到應用的起始的接收及傳送的流量
adb shell cat /proc/uid_stat/+”UID”/tcp_rcv
adb shell cat /proc/uid_stat/+”UID”/tcp_snd
然後我們再操作應用,再次通過上述 2 條命令可以獲取到應用的結束的接收及傳送的流量,通過相減及得到應用的整體流量消耗


電量

功耗測試主要從以下幾個方面入手進行測試

測試手機安裝目標APK前後待機功耗無明顯差異
常見使用場景中能夠正常進入待機,待機電流在正常範圍內.
長時間連續使用應用無異常耗電現象

測試方法
第一種基於android提供的PowerManager.WakeLock來進行,
第二種比較複雜一點,功耗的計算=CPU消耗+Wake lock消耗+資料傳輸消耗+GPS消耗+Wi-Fi連線消耗,
第三種通過 adb shell dumpsys battery來獲取


啟動時長

Android效能測試-啟動時間:

首先我們來說說啟動時間。關於應用的啟動時間的測試,分為三類:

1) 首次啟動 –應用首次啟動所花費的時間
2) 非首次啟動 –應用非首次啟動所花費的時間
3) 應用介面切換–應用介面內切換所花費的時間

那麼如何來做啟動時間的測試呢,一般我們分為2類,一類為使用軟體來測試,可能大部分人都比較通曉使用android 提供的 DisplayManager 來獲取 activity 的啟動時間。通過日誌過濾關鍵字 Displayed 來過濾所有 activity 所列印的,記錄日誌通過。

相關文章