Android 應用性能調試

 

Android* 應用性能調試

提交新文章

http://software.intel.com/zh-cn/articles/performance-debugging-of-android-applications/?cid=sw:prccsdn2072

  2011年10月12日 09:00
 


概述

創造愉快用戶體驗的關鍵是開發響應快捷的應用。藉助Android* 軟件開發套件(SDK)提供的組件,性能問題調試任務因爲簡單易用的性能分析工具而變得更簡單了。在這篇文章中,我們將認識一些不同的工具,它們可排除故障和調試性能問題或小幅度提升已完成應用的性能。我們不會說得太細,只會概括介紹如何針對您的應用使用這些工具。

我們將在Eclipse 中展示這些工具;您可以根據“ADT Plugin for Eclipse* (面向 Eclipse 的 ADT 插件)”一文中的說明來安裝ADT插件。

DDMS

DDMS是一款Google* 提供的應用,可作爲獨立的工具運行,也可通過ADT Eclipse* 插件集成到Eclipse* 中。它提供了強大的特性集合,能幫助您快速瞭解應用的運行狀況。

線程更新

DDMS中的線程監控和評測瀏覽對於管理大量線程的應用很有用。要啓用,點擊 Update Threads(更新線程)圖標即可開始。



圖 1

這使下面的窗口會顯示面向選中VM進程的所有線程的名稱和其他細節。



圖 2

utime和stime代表了線程在瞬間運行用戶代碼(utime)和系統代碼(STIME)所花的總時間。一瞬間的時間是由系統定義的,但通常爲10毫秒。星號表示守護線程;native狀態表示線程正執行原生代碼。仔細觀察上述樣本數據,很明顯,除了應用主線程花了大量時間外,運行GC也花了挺多的時間。仔細觀察應用如何處理對象創建可能有助於提高性能。

堆工具

堆查看

點擊Update Heap(更新堆)按鈕,獲得有關選定虛擬機中堆分配的信息。



圖 3



圖 4

點擊"Cause GC"開始.堆的詳細信息被顯示出來,並附有針對特定分配類型的分配大小圖示。如果您有分配泄漏,這可能是一個很好的檢查點,通過觀看Heap Size(堆大小)的總體趨勢,確保在應用運行期間它不會一直變大。

Allocation Tracker(分配跟蹤器)

Allocation Tracker(分配跟蹤器)視圖中顯示了有關分配的更深層細節。點擊“Start Tracking(開始跟蹤)”,在應用中執行某個操作,然後點擊“Get Allocations(獲得分配)”。



圖 5

所示列表按分配排序,首先顯示最新的分配。選中它可看到一個關於分配如何創建的堆棧軌跡(stack trace)。

仔細查看分配細節,下面的代碼看起來有改進的空間:

dataStr += String.format(" Std. Dev.: %.3f, %.3f, %.3f\n", devX, devY, devZ);

上例可簡單重構爲下面的代碼,節省構造臨時char[]的開銷。.

dataStrBuilder.append(String.format(" Std. Dev.: %.3f, %.3f, %.3f\n", devX, devY, devZ));

Method Profiling(方法分析)

Method Profiling(方法分析)是DDMS的一款工具,對於快速概覽應用中時間的消耗分佈非常有用,也可用於時間關鍵型函數的詳細查看。



圖 6

在應用運行並執行某個有趣的任務時,如果您想獲得更多有關該任務的性能數據,點擊“Start Method Profiling(開始方法分析)”。分析器只收集少量數據(沒見過超過2或3秒),所以,幾分鐘後再次單擊該圖標以停止收集。從DDMS中激活方法分析器可使工具自動使用內部存儲來存儲分析結果,當捕捉完成後,將它們發送回主機,作進一步分析。

IDE將自動啓動Traceview窗口,幫助您在IDE(圖7)中分析結果。



圖 7

解析結果是最有趣的部分。單擊底部窗格中的方法調用可創建一個層級結構,爲您顯示目前的方法——先是調用該方法的母方法,然後是從選定方法中調用的子方法。

在本例被測應用中,我選中了onSensorChanged方法。當您註冊接收來自傳感器類型的通知時,這種方法便是通過SensorManager API調用的方法。這裏的調用方法是handleMessage,它來自操作系統,所以由此開始我的實現方法是一個不錯的選擇。子方法根據 “總計”所花的時間百分比排序。這裏的“總計”表示在該方法及該方法調用的所有子方法內所花費的時間。因此,對於onSensorChanged調用,超過70%的時間花在了calcStandardDeviation和averageSamples上。我期望該調用多花一些時間來計算標準偏差,而不是僅僅將樣本平均。所以利用這則新信息,我能更加深入地查看我的實施並發現代碼優化點。

想詳細瞭解Traceview,請參考“利用Traceview與dmtracedump進行分析(Profiling with Traceview and dmtracedump)”。

分析API

爲獲得有着更高精度的的方法分析細節,調用可在代碼中進行以啓動和停止分析。您需要在設備中加載一個SD卡來使用此方法。在下面的例子中,我們添加hook(鉤子)以更好地瞭解傳感器處理代碼:

  1. private static boolean doOnce = true;   
  2.   
  3. @Override   
  4. public void onSensorChanged(SensorEvent event) {   
  5.        
  6.     if ( doOnce ) {   
  7.         android.os.Debug.startMethodTracing();   
  8.     }   
  9.        
  10.     Code under test…   
  11.   
  12.     if ( doOnce ){   
  13.         android.os.Debug.stopMethodTracing();   
  14.         doOnce = false;   
  15.     }   
  16. }  
	private static boolean doOnce = true;
	
	@Override
	public void onSensorChanged(SensorEvent event) {
		
		if ( doOnce ) {
			android.os.Debug.startMethodTracing();
		}
		
		Code under test…

		if ( doOnce ){
			android.os.Debug.stopMethodTracing();
			doOnce = false;
		}
	}
跟蹤文件默認爲:/ mnt / sdcard/dmtrace.trace,可通過下面的命令從設備中提取出來:

adb pull /mnt/sdcard/dmtrace.trace.

運行獨立的Traceview工具:“traceview C:\dmtrace.trace”,會打開一個用戶界面,類似於嵌入到Eclipse中的用戶界面。

佈局用戶界面工具

layoutopt(佈局選擇)

每當要調用某應用結束時,我就希望在活動的用戶界面佈局中獲得簡單的性能增益。 layoutopt這一工具會分析您的佈局文件,並指出潛在的性能問題。在這篇博客和參考文件會談到該問題,讓我們快速瀏覽該如何使用這一工具吧。命令行用法如下:

layoutopt.bat C:\Projects\workspace\DeviceInformation\res

注:我把Android* SDK工具目錄放在我的路徑中。它看起來也像一款工具,只在您詳細說明要分析目錄的完整路徑時纔可用。

輸出示例:

C:\Projects\workspace\DeviceInformation\res\drawable\btn_notification_ic_example.xml
C:\Projects\workspace\DeviceInformation\res\drawable\picture_frame.xml
C:\Projects\workspace\DeviceInformation\res\layout\action_bar_custom.xml
23:23 This TextView layout or its LinearLayout parent is useless
C:\Projects\workspace\DeviceInformation\res\layout\content_applicationinfo_main.xml
16:19 This LinearLayout layout or its LinearLayout parent is useless
C:\Projects\workspace\DeviceInformation\res\layout\content_benchmark_main.xml
C:\Projects\workspace\DeviceInformation\res\layout\content_main.xml
C:\Projects\workspace\DeviceInformation\res\layout\content_sensorinfo_main.xml
17:20 This LinearLayout layout or its LinearLayout parent is useless
X:Y是與問題對應的XML標記的開始行和結束行。上面指出的多餘佈局增加了活動的整體加載時間,可用於方便地提升您的活動加載速度。

Hierarchy Viewer(層級查看器)

性能問題調試中另一款有用工具就是Hierarchy Viewer (層級查看器)工具。此應用只能連接到Android* 操作系統的開發人員版本中,所以在不用開發設備情況下,使用它的最簡單的方法就是利用模擬器。通過命令行運行該工具:

hierarchyviewer

結論

希望我已爲您的應用性能提升需要提供了一些新的工具與知識。除了使用這些工具來發現您在哪些方面可以獲得增益外,很多性能改進可在代碼級別實現。您可以在“Designing for Performance”(性能設計)一文中更多瞭解有關常見性能編碼技術。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章