標籤:android效能最佳化 android效能分析 oom memory android最佳化
Android效能最佳化是Android開發中經常遇見的一個問題,接下來將對Android效能最佳化方面的知識點做一個簡單的梳理和總結,將從工具和代碼兩方面進行梳理。所謂工欲善其事必先利其器,本文首先來看一下Android效能最佳化有哪些得力的工具。
TraceViewtraceview是Android SDK中內建的一個工具,可以對應用中方法調用耗時進行統計分析,是Android效能最佳化和分析時一個很重要的工具。traceview位於SDK下的tools目錄中,使用時可以在cmd視窗運行traceview命令,也可以在ddms中使用,我個人比較偏向於後一種方式,比較方便易操作,不需要修改代碼。
使用方法:
- 方法一:在相應進行traceview分析的開始位置和結束位置分別調用startMethodTracing和stopMethodTracing方法,可見下面的範例程式碼:
public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Debug.startMethodTracing();}@Overrideprotected void onDestroy() {super.onDestroy();Debug.stopMethodTracing();}}
在結束後會產生".trace"檔案,然後 通過命令traceview *.trace對資料檔案進行分析。startMethodTracing共有6個重載的方法,在調用時可以根據需要進行調用。如果採用不帶參數的方法,產生的“.trace"檔案預設將存放到外置儲存空間根目錄下(/sdcard/),名為”dmtrace.trace",為了方便這裡建議自訂trace的名稱(startMethodTracing(String traceName))。
- 方法二:traceview也可以在ddms中直接使用,即在ddms中在選中某個要進行監控的進程後,點擊的小表徵圖開始監控,在監控結束時再次點擊小表徵圖,ddms會自動開啟traceview視圖:
這兩種使用方式,各有優缺點:第一種監控過程比較精確,但需要修改代碼;第二種監控使用方便,不需要修改代碼,但步入第一種精確。我個人在使用時一般比較偏向第二種使用方式。
視圖解讀:下面的視圖是我在ddms中監控com.tencent.mobileqq進程(隨便選的一個)產生的。可以看出整個traceview視圖分為上下兩大部分,上半部分被稱為
時間軸面板(Timeline Panel),下半部分被稱為
分析面板(Profile Panel)。
介面上方的尺子代表了MethodTracing的時間段(從Debug.startMethodTracing()到Debug.stopMethodTracing()的時間)。每個線程的函數執行時間圖處於和線程名同一行的右側。注1:線寬度代表執行該函數本身操作所用的時間。注2:函數所調用的子函數時間軸夾雜在該函數本身操作所用的時間軸之間。注3:時間軸的高度不知道有什麼意義。注4:函數本身是嵌套的。注5:每行下面粗的線段標註了Profile Panel中被選中函數調用所消耗的時間段。每個線段對應一次函數的運行。
Exclusive time是該函數本身基本操作(不包括子函數調用)的時間。Inclusive time是該函數調用所用的時間(包括子函數調用)的時間。列1:"Name"表示函數名。雙擊函數名,可以看到在上半介面是時間軸面圖(Timeline Panel)看他的所消耗的時間段。(用粗的線段標註)。雙擊函數名左邊的"+"展開後可以看到,該函數的"parents"和"children"列2:"incl%"表示函數的Inclusive time在整個MethodTracing時間裡占的百分比。列3:"Inclusive"表示Inclusive time。列4:"Excl%"表示函數的Exclusive time在整個MethodTracing時間裡占的百分比。列5:"Exclusive"表示Exclusive time。列6:"Calls+RecurCalls/Total"表示對函數的調用次數(包括遞迴調用)。2的nativeFinished()那列為"14+0"表示14次非遞迴調用,0次遞迴調用.列7:新的版本(比如2.1)還有"time/calls"表示平均的調用時間(即Inclusive time/ total calls)。3。來自google文檔的圖2感覺有老了。注:如果函數A調用函數B那麼函數A稱為函數B的"parents",函數B稱為函數A的"children."
Google關於traceview工具的介紹可參考http://developer.android.com/intl/zh-cn/tools/debugging/debugging-tracing.html