android traceview簡介

Traceview是android平臺配備的一個很好的性能分析工具。它能夠經過圖形化的方式讓咱們瞭解咱們要跟蹤的程序的性能,而且能具體到method。html

進行Traceview的版本限制java

對於Android 1.5及如下的版本:不支持android

對於Android 1.5以上2.1下(含2.1)的版本:受限支持。trace文件只能生成到SD卡,且必須在程序中加入代碼。shell

對於Android 2.2上(含2.2)的版本:全支持。能夠不用SD卡,不用在程序中加代碼,直接本身用DDMS就能夠進程Traceview。app

1、Android 1.5以上2.1下(含2.1)的版本中Traceview的使用ide

首先,必須在程序當中加入代碼,以便生成trace文件,有了這個trace文件咱們才能夠將其轉化爲圖形。函數

1.一、啓動追蹤工具

使用Debug的如下靜態方法方法來啓動:性能

static void startMethodTracing(String traceName)ui

Start method tracing, specifying the trace log file name.

使用指定trace文件的名字和默認最大容量(8M)的方式開始方法的追蹤

static void startMethodTracing()

Start method tracing with default log name and buffer size.

使用默認trace文件的名字(dmtrace.trace)和默認最大容量(8M)的方式開始方法的追蹤

static void startMethodTracing(String traceName, int bufferSize, int flags)

Start method tracing, specifying the trace log file name and the buffer size.

使用指定trace文件的名字和最大容量的方式開始方法的追蹤。並可指定flags.

注:int flags好像沒意義。通常都用0.

static void startMethodTracing(String traceName, int bufferSize)

Start method tracing, specifying the trace log file name and the buffer size.

使用指定trace文件的名字和最大容量的方式開始方法的追蹤。

注1:以上的方法的文件都會建立於SD卡下,即"/sdcard/"下,對默認文件名的就是"/sdcard/dmtrace.trace"

若是沒SD卡,以上方法會拋異常導致程序crash.

注2:若是文件名沒有指定類型,系統爲其加上類型.trace

1.二、中止追蹤

使用Debug的靜態方法方法來中止:

public static void stopMethodTracing ()。

例如在activity的onCreate()中添加Debug.startMethodTracing(), 而在onDestroy()中添加Debug.stopMethodTracing(),

以下:

    @Override

    public void onCreate(Bundle savedInstanceState) {

     Debug.startMethodTracing();

        super.onCreate(savedInstanceState);

     ..............................

     }

protected void onDestroy() {

super.onDestroy();

.................

Debug.stopMethodTracing();


}

對於模擬器咱們還得建立一個帶有SD card的AVD,這樣才能使trace文件保存到/sdcard/...當中。

能夠在命令中分別單首創建,也能夠在建立avd的時候一塊兒將sdcard建立。建立以後經過DDMS file explore咱們就能夠看到/sdcard/目錄下有一個trace文件,若是沒有在Debug語句中設置名字則默認爲dmtrace.trace.

1.三、 把trace文件從SD卡拷到電腦上

如今咱們把這個文件copy到咱們的電腦上指定的目錄:

adb pull /sdcard/dmtrace.trace d:

1.四、啓動traceview可視界面

如今就能夠經過命令行來執行traceview了。進入SDK的tools目錄後,執行traceview,以下: 

traceview D:\dmtrace.trace.

以後便可以看到圖形界面了。

1.五、分析traceview結果

Timeline Panel

窗口的上半部分是時間軸面圖(Timeline Panel)

The image below shows a close up of the timeline panel. Each thread’s execution is shown in its own row, with time increasing to the right. 

Each method is shown in another color (colors are reused in a round-robin fashion starting with the methods that have the most inclusive time). 

The thin lines underneath the first row show the extent (entry to exit) of all the calls to the selected method.

界面上方的尺子表明了MethodTracing的時間段(從Debug.startMethodTracing()到Debug.stopMethodTracing()的時間)。

每一個線程的函數執行時間圖處於和線程名同一行的右側。

注1線寬度表明執行該函數自己操做所用的時間

注2:函數所調用的子函數時間線夾雜在該函數自己操做所用的時間線之間。

注3:時間線的高度不知道有什麼意義。

注4:函數自己是嵌套的。

注5每行下面粗的線段標註了Profile Panel中被選中函數調用所消耗的時間段。每一個線段對應一次函數的運行。

在下面的圖中咱們能夠看到有11次對LoadListener.nativeFinished()的調用,其中有一次調用耗時特別的多。這裏的11次和圖2並不一致,應該是google的疏忽。

圖1The Traceview Timeline Panel

 

Profile Panel

窗口的下半界面是對各個函數調用的彙總圖Profile Panel

  Figure 2 shows the profile pane, a summary of all the time spent in a method. 

The table shows both the inclusive and exclusive times (as well as the percentage of the total time). 

Exclusive time is the time spent in the method. 

Inclusive time is the time spent in the method plus the time spent in any called functions. 

We refer to calling methods as "parents" and called methods as "children." When a method is selected (by clicking on it), 

it expands to show the parents and children. Parents are shown with a purple background and children with a yellow background. 

The last column in the table shows the number of calls to this method plus the number of recursive calls. 

The last column shows the number of calls out of the total number of calls made to that method. 

In this view, we can see that there were 14 calls to LoadListener.nativeFinished(); 

looking at the timeline panel shows that one of those calls took an unusually long time.

圖2是對各個函數調用的彙總圖Profile Panel。該表給出了the inclusive and exclusive times及他們所佔有的百分比。

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."

如下是翻譯

英語 中文
Incl 調用方法佔用時間百分比
Inclusive 調用方法時間(ms)(包括了全部方法的調用)
Excl 執行方法佔用時間百分比
Exclusive 執行方法佔用時間(ms)(不包括子方法的調用)
Calls+Recur Calls/Total 調用和重複調用的次數
Time/Call 總的時間(ms)

 

圖2Profile Panel

圖3Profile Panel

Traceview的使用 - hubingforever - 民主與科學

 

2、Android 2.2以上(含2.2)的版本中Traceview的簡化使用。

Android 2.2除了像2.1當中那樣使用Traceview,還能夠在DDMS使用Traceview,比之前簡化的很多。

* The trace log files are streamed directly to your development machine.

在Android 2.2後能夠不用SD卡。Traceview文件流是直接指向開發調試的主機(即DDMS所在的電腦)

To start method profiling:

   1. On the Devices tab, select the process that you want to enable method profiling for.

   2. Click the Start Method Profiling button.

   3. Interact with your application to start the methods that you want to profile.

   4. Click the Stop Method Profiling button. DDMS stops profiling your application and opens Traceview with the method profiling information that was collected between the time you clicked on Start Method Profiling and Stop Method Profiling.

 在DDMS中如何進行Traceview。

 1,在設備表中選中你想進行method trace的進程

 2,單擊Method Profiling按鈕開始method trace。該按鈕在窗口的左上方,它在"stop"按鈕的左方,"Device菜單的正下方"。

 3,method trace進行中

 4,單擊Method Profiling按鈕中止method trace。緊接着系統會自動彈出Traceview窗口來顯示剛纔的method trace結果。

3、Traceview文件格式

  關於Traceview文件格式請參照http://developer.android.com/guide/developing/debugging/debugging-tracing.html



4、TraceView工具使用方法

  TraceView有三種啓動方式,下面逐一介紹:

  一、 代碼中啓動

  能夠在代碼中添加

  Debug.startMethodTracing(「Tracelog」);

  Debug.stopMethodTracing();

  使用這種方式須要確保應用的AndroidMainfest.xml中的SD卡的讀寫權限是打開的,即

  應用運行完後,會在SD卡下生成一個Tracelog文件,使用adb pull把這個文件拷貝至XP系統上,再在android sdk的tools目錄下執行traceview Tracelog,則會彈出一個圖形界面,經過這個圖形界面就能夠分析出應用的性能瓶頸;

  二、 Eclipse中啓動

  Eclipse啓動traceview及其簡單,在DDMS中對須要分析的應用進程點擊以下按鈕

  在須要中止traceview的地方點擊相同的按鈕,則Eclipse會自動彈出相似1中的一個圖形界面;

  三、 adb 命令行啓動

  adb shell am profile start

  adb shell am profile stop

  PROCESS_ID爲應用的進程號,能夠用ps命令獲取,TRACE_FILE爲須要存儲的Trcaelog文件。

  執行上面的命令後,會生成對應的TRACE_FILE,使用adb pull把這個文件拷貝至XP系統上,再在android sdk的tools目錄下執行traceview Tracelog,則會彈出一個圖形界面,經過這個圖形界面就能夠分析出應用的性能瓶頸;



本文參照來源:

http://wbdban.javaeye.com/blog/564309

http://developer.android.com/guide/developing/debugging/debugging-tracing.html

http://developer.android.com/guide/developing/debugging/ddms.html#profiling

相關文章
相關標籤/搜索