轉載地址:http://testerhome.com/topics/2572
前言:
前段時間花了兩週的時間做了一個基於Android 客戶端的性能測試現在分享給大家,希望對大家有所幫助!
Look-Look
1,既然是基於Android客戶端的性能測試那就與後臺的一些API、數據接口要區分開來~!
2,Android的性能測試能其實包括很多很多的測試項比如:資源消耗,內存泄露,電量功耗,啓動耗時,渲染等等....
怎麼去做?
1,採集數據 :採集的數據包括:內存、cpu、電量功耗、hprof(內存泄露分析文件)、響應時間等等。。。。
2,設計場景 :搞定數據的採集後配合一些固定的場景來收集一些數據(**最好**多取幾次而且每次配合不同的設備看平均值)作爲最後的對比分析
3,結果分析 :拿到數據後分析哪些模塊的數據異常再去Check code定位問題的原因
好吧下面慢慢跟大家詳細的說吧!
先寫下內存篇
內存的採集:
Android的內存的採集這邊介紹三種方式:
1,通過Dumpsys 來取值
adb shell dumpsys meminfo
這裏可以看到當前所有進程的內存信息!
如果你要看詳細的內存:
adb shell dumpsys meminfo pakagename or Pid
看其中的Size 可以發現 Native Heap(本機堆內存) 和Dalvik Heap 佔據了Heap Size
ative和dalvik,dalvik就是我們平常說的java堆,我們創建的對象是在這裏面分配的。
bitmap是直接在native上分配的,對於內存的限制是 native+dalvik 不能超過最大限制。
android程序內存一般限制在16M,當然也有24M的。
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
未完待續