Android-Using DDMS

原文:http://developer.android.com/tools/debugging/ddms.html#how-ddms-workshtml

 

Android提供了一個debug工具叫作:DDMS,它提供了端口轉發服務,設備截屏,設備線程和堆信息,日誌,進程,模擬接打電話,模擬收發短信,模擬位置數據等功能。本文主要是對DDMS特性的簡單闡述,它不是對DDMS全部特性和功能的一個全面的挖掘。java

運行DDMSandroid


DDMS被集成到了Eclipse裏面,同時在SDK的tools目錄下面也有一份。DDMS同時支持模擬器和真實設備。若是它們同時在運行,DDMS默認指向模擬器。git

·        在Eclipse裏面:點擊-> Window > Open Perspective > Other... > DDMSapache

·        在命令行裏面:進入tools目錄,輸入:ddms(Linux/Mac平臺上是./ddms)瀏覽器

DDMS和調試器是如何交互的網絡


在android裏面,每個application運行在單獨的進程中,每個進程運行在本身的虛擬機裏面(VM)。每個虛擬機會暴漏一個惟一的端口號供調試器來鏈接。app

當DDMS啓動的時候,它會鏈接到adb。當一個設備鏈接上來之後,在adb和DDMS之間會建立一個虛擬機監控服務,當設備上的虛擬機啓動或者終止的時候,監控服務會通知DDMS。一旦一個虛擬機運行起來,DDMS會經過adb檢索出虛擬機的pid,而後經過設備上的adbd後臺進程打開一個DDMS到虛擬機調試器的鏈接。DDMS如今就可使用定製化的無線協議和虛擬機進行對話了eclipse

DDMS會給設備上的每個虛擬機賦予一個調試端口。通常來講,DDMS會把8600給第一個調試器,下一個是8601,以此類推。當調試器鏈接到這些端口的時候,相關聯的虛擬機上的全部的數據都會被轉發到調試器上。你能夠只把一個調試器給一個端口使用,可是DDMS能夠處理多個調試器。socket

默認狀況下,DDMS還會監聽另外一個調試端口,叫作基端口(默認的端口號是8700)。基端口是一個端口轉發器,它能夠從任何一個調試端口接收虛擬機的數據,而後轉到發到8700端口,而後調試設備上的全部的虛擬機。被轉發的數據是由在DDMS的Device視圖裏面當前被選中的進程來決定的。

下圖展現了eclipse裏面DDMS長的模樣。若是你是從命令行啓動的DDMS,模樣稍微有點不同,可是大部分的功能是同樣的。注意,高亮的進程com.android.email,它是運行在模擬器裏面的,同時被賦予了8700和8606的調試端口。這代表當前DDMS會把8606的數據轉發到8700上。

 

Figure 1. Screenshot of DDMS

若是你不是使用Eclipse和ADT,請閱讀 Configuring your IDE to attach to thedebugging port,來綁定你的調試器。

Tip:你能夠經過File > Preferences設置不少個DDMS的preference。Preference被保存到$HOME/.android/ddms.cfg.

Dalvik的調試的問題

在Dalvik虛擬機中調試和在其餘的虛擬機調試基本是同樣的,可是,當單步跳出同步代碼塊的時候,鼠標的當前行會跳到方法的最後一行。

使用DDMS


下面的章節介紹如何使用DDMS,還有DDMD界面上各個分頁和麪板。Eclipse的版本和命令行的版本在UI上會有細微的差異,可是功能是同樣的。如何運行DDMS請參考本文前面的章節。

查看進程佔用的heap內存

DDMS容許查看進程佔用了多少堆內存,這對跟蹤application執行過程當中的某個時間點上堆的使用狀況很是有用。

查看一個進程的堆的使用狀況:

1.   在Devices頁面,選中你要查看堆信息的進程。

2.   單擊Update Heap 按鈕,容許查看進程的堆信息。

3.   在Heap頁面,單擊Cause GC 觸發垃圾回收,這會手機堆數據信息。當操做完成之後,你會看到不少數據類型和他們所佔用的內存。你能夠再次單擊 CauseGC 來刷新數據。

4.   在一個數據類型上單擊,會出現一個柱狀圖,它展現了對象的數量和以字節計數分配的內存。

跟蹤對象的內存分配

DDMS提供了一種跟蹤對象內存分配的特性,能夠看到是哪些類和線程正在分配對象。這就容許你實時的跟蹤是哪些對象正在被分配,當你的應用做某些操做的時候。這對評估那些可能會影響應用性能的內存的使用很是有用。

跟蹤對象的內存分配:

1.   在Devices頁面,選中你要查看堆信息的進程。

2.   在AllocationTracker頁面,點擊Start Tracking按鈕,開始跟蹤。這時,應用裏面的任何的動做都會被跟蹤下來。

3.   點擊Get Allocations查看自從你點擊了Start Tracking之後應用分配的對象的列表。你能夠再次點擊Get Allocations來追加分配的新對象。

4.   點擊Stop Tracking按鈕按鈕能夠中止跟蹤或者是清除數據而後從新開始。

5.   點擊列表裏面的某一行數據,能夠查看更細節的信息,好比:分配對象的代碼的方法和行號等。

使用模擬器或者是設備的文件系統

DDMS提供了一個文件瀏覽器頁面,容許你查看、複製、刪除設備上的文件。檢查你應用建立的文件或者你想在設備上轉移文件的時候,這個特性會很是有用。

使用模擬器或者是設備的文件系統

1.    在Devices頁面,選中你要查看堆信息的進程。

2.   從設備中拷貝文件,在文件瀏覽器中定位到文件,點擊Pull file按鈕。

3.   把文件拷貝到設備,在文件瀏覽器頁面點擊 Pushfile 按鈕。

檢查線程信息

DDMS裏面的Threads頁面展現了某個選中的進程下當前運行的線程。

1.   在Devices頁面,選中你要查看堆信息的進程。

2.   點擊Update Threads 按鈕.

3.   在Threads頁面,就能夠看到選中的進程的線程信息。

開始方法分析

方法分析是一種跟蹤方法的某些信息的方式,好比說:調用次數,執行時間。關於在哪裏收集分析數據,若是你想要獲取更細粒度的控制,可使用startMethodTracing() 和stopMethodTracing()。關於如何產生跟蹤日誌,請參考:Profiling and Debugging UIs.

在DDMS裏面開始方法分析以前,要知道有以下的一些限制:

·        Android2.1和更早期的版本的設備必須得有SD卡,你的應用必須得有寫SD卡的權限。

·        Android2.2和高版本的設備不須要SD卡,跟蹤日誌直接發送到你的開發機上。

開始方法分析:

1.   在Devices頁面,選中你要查看堆信息的進程。

2.   點擊Start MethodProfiling 按鈕

3.   跟應用進行交互,啓動你想要分析的方法。

點擊Stop MethodProfiling按鈕。DDMS中止分析你的應用,而後會打開 含有在你點擊Start Method Profiling 和Stop MethodProfiling之間收集到的方法分析信息的Traceview 視圖。

使用網絡流量工具

在Android 4.0裏面,DDMS包含了一個詳細的網絡使用狀況的頁面,這使得監控應用發出的網絡請求變爲可能。使用這個工具,你能夠監控你的應用是在何時如何傳遞數據,能夠更好的優化底層的代碼。你也能夠在使用以前,給網絡的socket應用一個「tag」來區分不一樣的流量的類型,

These tags are shownin a stack area chart in DDMS, as shown in figure 2:

 

Figure 2. Network Usage tab.

By monitoringthe frequency of your data transfers, and the amount of data transferred duringeach connection, you can identify areas of your application that can be mademore battery-efficient. Generally, you should look for short spikes that can bedelayed, or that should cause a later transfer to be pre-empted.

To betteridentify the cause of transfer spikes, the TrafficStats API allows you to tag the datatransfers occurring within a thread using setThreadStatsTag(), followed by manually tagging (anduntagging) individual sockets using tagSocket()and untagSocket(). For example:

TrafficStats.setThreadStatsTag(0xF00D);
TrafficStats.tagSocket(outputSocket);
// Transfer datausing socket
TrafficStats.untagSocket(outputSocket);

Alternatively,the Apache HttpClient and URLConnection APIs included in the platformautomatically tag sockets internally based on the active tag (as identifiedby getThreadStatsTag()). These APIs correctly tag/untag socketswhen recycled through keep-alive pools. In the following example, setThreadStatsTag() sets the active tag to be 0xF00D. There can only be one active tag perthread. That is the value that will be returned by getThreadStatsTag() and thus used byHttpClient to tagsockets. The finally statementinvokes clearThreadStatsTag() to clear the tag.

TrafficStats.setThreadStatsTag(0xF00D);
    try {
        // Make network request using HttpClient.execute()
    } finally{
        TrafficStats.clearThreadStatsTag();
}

Socket taggingis supported in Android 4.0, but real-time stats will only be displayed ondevices running Android 4.0.3 or higher.

使用LogCat

LogCat被集成到了DDMS裏面,他會打印出你使用Log類打印的消息和其餘的系統的消息,好比:當發生異常的時候的堆棧元素。更多關於如何把日誌輸出到LogCat,請參考Reading and Writing Log Messages.

當你設置好了你的日誌,你可使用DDMS的LogCat特性來過濾特定的消息,使用如下按鈕:

·        Verbose

·        Debug

·        Info

·        Warn

·        Error

你也能夠設置你本身的過濾器定製過濾更多地細節,好比用log的tag來過濾日誌,或者是產生日誌的pid來過濾日誌。add filter,edit filter,和delete filter按鈕容許你管理這些定製的過濾器。

模擬手機操做和位置

Emulator control頁面容許你模擬手機的語音和網絡狀態。當你想測試應用在不一樣網絡環境下的健壯性的時候會很是的有用。

改變網絡的狀態、速度、延遲

Emulatorcontrols頁面的Telephony Status區域容許你改變手機網絡的狀態、速度、延遲。能夠應用如下選項,一旦設置,立馬生效:

·        Voice - unregistered, home, roaming, searching, denied

·        Data - unregistered, home, roaming, searching, denied

·        Speed - Full, GSM, HSCSD, GPRS, EDGE, UMTS, HSDPA

·        Latency - GPRS, EDGE, UMTS

模擬打電話或者是發短信

Emulatorcontrols頁面的Telephony Actions區域能夠模擬打電話和發短信。當你想測試應用收到來電或者短信的時候的健壯性的時候,會很是的有用。你能夠作如下的動做:

·        語音-在Incoming number域輸入一個號碼,點後點擊Call給模擬器或者是手機打電話。點擊Hang up 按鈕掛斷。

·        SMS-在 Incomingnumber 域輸入一個號碼,在Message域輸入短信,點擊 Send按鈕,發送短信。

設置手機的位置信息

若是你的應用取決於手機所在的位置,你可讓DDMS給你的設備或者是模擬器發送一個假的位置。當你想測試應用的基於位置的特性的時候,能夠不用物理的移動位置,這將會很是的有用。支持如下地理數據類型:

·        Manual - set the location by manually specifying decimalor sexagesimal longitude and latitude values.

·        GPX - GPS eXchange file

·        KML - Keyhole Markup Language file

·        純手工-手動設置浮點數的經緯度

·        GPX-GPS eXchange文件

·        KML-KML文件

For more information about providingmock location data, see Location Strategies.

關於提供mock位置數據的更多信息,能夠參考: Location Strategies.

 

注意:

 

DDMS生成的內存dump文件不能直接用MAT工具打開,會提示文件格式不支持。須要轉化:

(1)運行cmd,cd到D:\tools\android-sdk\tools目錄下

(2)輸入命令hprof-conv  xxxx.hprof  yyyy.hprof 

 xxxx.hprof 爲原文件,yyyy.hprof 爲轉化事後的文件(一樣生成在D:\tools\android-sdk\tools目錄下)

(3)ok, .hprof文件轉化完成

參考:http://blog.csdn.net/jingwen3699/article/details/7977275

相關文章
相關標籤/搜索