Android 性能測試實踐(一)

轉載地址: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

未完待續


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章