Android 性能測試實踐(一)

前言: java

前段時間花了兩週的時間作了一個基於Android 客戶端的性能測試如今分享給你們,但願對你們有所幫助! android

Look-Look shell

1,既然是基於Android客戶端的性能測試那就與後臺的一些API、數據接口要區分開來~!
2,Android的性能測試能其實包括不少不少的測試項好比:資源消耗,內存泄露,電量功耗,啓動耗時,渲染等等.... app

怎麼去作?
1,採集數據 :採集的數據包括:內存、cpu、電量功耗、hprof(內存泄露分析文件)、響應時間等等。。。。
2,設計場景 :搞定數據的採集後配合一些固定的場景來收集一些數據(最好多取幾回並且每次配合不一樣的設備看平均值)做爲最後的對比分析
3,結果分析 :拿到數據後分析哪些模塊的數據異常再去Check code定位問題的緣由 ide

好吧下面慢慢跟你們詳細的說吧! 工具

先寫下內存篇 性能

內存的採集: 測試

Android的內存的採集這邊介紹三種方式: spa

1,經過Dumpsys 來取值 設計

adb shell dumpsys meminfo

這裏能夠看到當前全部進程的內存信息!

若是你要看詳細的內存:

adb shell  dumpsys  meminfo  pakagename or Pid

看其中的Size 能夠發現 Native Heap 和Dalvik Heap 佔據了Heap Size
dalvik就是咱們日常說的java堆,咱們建立的對象是在這裏面分配的。
對於內存的限制 這裏糾正一下:是 dalvik heap不能超過最大限制,跟Native heap沒有關係!
最大限制查看:

#查看單個應用程序最大內存限制 adb shell getprop|grep heapgrowthlimit

獲得結果:

|[dalvik.vm.heapgrowthlimit]: [96m]

這個96M是單個程序限制最大內存,而meminfo 裏面的dalvik heap size 的最大值若果超出了96m 那就極可能會發生OOM
dalvik.vm.heapgrowthlimit和dalvik.vm.heapsize都是java虛擬機的最大內存限制,應用若是不想在dalvik heap達到heapgrowthlimit限制的時候出現OOM,須要在Manifest中的application標籤中聲明android:largeHeap=「true」,聲明後應用dalvik heap 達到heapsize的時候纔會出現OOM!

注:設備的不同 最大內存限制也可能不同

如今大多數手機 的android程序內存通常限制在96M以上甚至更高,也可能更低。

3,用/system/xbin/procrank工具 來取值很直觀

adb shell procrank

VSS – Virtual Set Size 虛擬耗用內存(包含共享庫佔用的內存)
RSS – Resident Set Size 實際使用物理內存(包含共享庫佔用的內存)
PSS – Proportional Set Size 實際使用的物理內存(比例分配共享庫佔用的內存)
USS – Unique Set Size 進程獨自佔用的物理內存(不包含共享庫佔用的內存)

USS 是針對某個進程開始有可疑內存泄露的狀況, 是一個程序啓動了會產生的虛擬內存,一旦這個程序進程殺掉就會釋放!

3,使用ActivityManager的getMemoryInfo(ActivityManager.MemoryInfo outInfo)(這個方法是寫一個簡單的app去監控的時候用到的,輕便簡單)

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 也能夠 還有不少方法均可以。

adb shell top

內存拿到後怎麼去用呢?

這裏我用的方法是用java封裝Adb shell dumpsys meminfo再用字符串截取 打印的方式

public static String GetMemory(String packageName) throws IOException, InterruptedException { String str3=null; Runtime runtime = Runtime.getRuntime(); Process proc = runtime.exec("adb shell dumpsys meminfo "+packageName); try { if (proc.waitFor() != 0) { System.err.println("exit value = " + proc.exitValue()); } BufferedReader in = new BufferedReader(new InputStreamReader( proc.getInputStream())); StringBuffer stringBuffer = new StringBuffer(); String line = null; while ((line = in.readLine()) != null) { stringBuffer.append(line+" "); } String str1=stringBuffer.toString(); String str2=str1.substring(str1.indexOf("Objects")-60,str1.indexOf("Objects")); str3=str2.substring(0,10); str3.trim(); } catch (InterruptedException e) { System.err.println(e); }finally{ try { proc.destroy(); } catch (Exception e2) { } } return str3 ; } }

截取好以後呢 能夠跟 其餘的一些系統資源值拼在一塊兒打印出來:

拿到這些值以後能夠配合手工或自動化來作數據收集,你會看到有些步驟內存佔用很高或者Cpu消耗也會較高,這樣你就能夠去check一下 關於這個步驟相關 的Code

相關文章
相關標籤/搜索