/* 今天學(xué)習(xí)了用Eclipse 來調(diào)試Android的代碼,首次使用,可能有的問題很基本,有問題請指出,交流嘛:) */
(筆記中提到的Emulator也可以理解成Device)
一、adb的介紹:
adb(Android Debug Bridge)包括三個部分:
1)adb client, 運行在PC上(為DDMS,即IDE工作)
2)adb daemon(守護進(jìn)程), 運行于Emulator(為與Emulator中的VM交互工作);
3)adb server(服務(wù)進(jìn)程), 運行在PC(任務(wù)管理器上有),管理著adb client和adb daemon的通信.server與client通信的端口是是5037,
adb server會與emulator交互的,使用的端口有兩個,一個是5554專門用于與Emulator實例的連接,那么數(shù)據(jù)可以從Emulator轉(zhuǎn)發(fā)給IDE控制臺了,另一個則是5555,專門與adb daemon連接為后面調(diào)試使用。
PS:Emulator/Device占用兩個(一組)端口,一個為偶數(shù)的5554,一個奇數(shù)的5555。
如果還開啟其他的Emulator,則使用的另一組端口是5556,5557,一直到5585.
adb server開啟時就是通過查找5555-5585之間端口來建立與模擬器的連接的,建立連接后就可以用adb的相關(guān)命令了。
如果您安裝了ADT就基本不需要adb的命令了(因為DDMS會調(diào)用ADB進(jìn)行透明操作)
關(guān)于本機的端口使用情況可以使用netstat [-a] [-n]來查詢驗證一下。
二、觀察一組數(shù)據(jù):
1,在開啟仿真器時有一些打印:
[2009-06-06 14:04:16 - Helloworld] Android Launch!
[2009-06-06 14:04:17 - Helloworld] adb is running normally.
[2009-06-06 14:04:17 - Helloworld] Performing com.android.hello.Helloworld activity launch
[2009-06-06 14:04:17 - Helloworld] Automatic Target Mode: Preferred AVD 'lab' is not available. Launching new emulator.
[2009-06-06 14:04:17 - Helloworld] Launching a new emulator with Virtual Device 'lab'
[2009-06-06 14:04:24 - Helloworld] New emulator found: emulator-5554
[2009-06-06 14:04:24 - Helloworld] Waiting for HOME ('android.process.acore') to be launched...
[2009-06-06 14:05:45 - Helloworld] HOME is up on device 'emulator-5554'
[2009-06-06 14:05:45 - Helloworld] Uploading Helloworld.apk onto device 'emulator-5554'
[2009-06-06 14:05:45 - Helloworld] Installing Helloworld.apk...
每一行都基本表示一個命令在執(zhí)行,emulator-5554是仿真器的初始端口了。
最后一句等于命令:adb -s emulator-5554 install helloworld.apk
如果報了類似以下的錯誤,那得(加個-r)重裝,因為該App已經(jīng)在該Emulator下運行了
DDM dispatch reg wait timeout
Can't dispatch DDM chunk 52454151: no handler defined
Can't dispatch DDM chunk 48454c4f: no handler defined
網(wǎng)上沒有看到這個錯誤因此順便提下解決方法:adb -s emulator-5554 install -r helloworld.apk
三,了解下DDMS:(都是adb的命令相當(dāng)?shù)墓δ?
DDMS有幾個界面:
1)Devices:可以查看到當(dāng)前運行的Emulator和其內(nèi)運行的應(yīng)用
2)Emulator control,即仿真器的硬件設(shè)置項等:
設(shè)置當(dāng)前注冊的網(wǎng)絡(luò)狀態(tài)(Home,Roaming,UnRegistered,Searching)
數(shù)據(jù)業(yè)務(wù)的速度設(shè)置:有GSM,GPRS,EDGE,UMTS,HSDPA(3.5G?)
還有載入KML或NMEA文件來模擬GPS數(shù)據(jù)
3)還可以查詢Threads,Heap,File Explorer、重啟adb,抓屏等,其他都是在調(diào)用adb。
4)關(guān)于Logcat
從Windows->Prereference->android->DDMS->Loggin Level進(jìn)行設(shè)置打印等級,
不過默認(rèn)下只打印入口線程的信息,射頻和Tapi的動作信息要通過adb Logcat -b radio打開,
os-events相關(guān)的打印通過adb logcat -b events.打開,
Log默認(rèn)被寫入到手機的/data/anr/traces.txt文件中。
四,Debug面板
這個面板對于熟悉Eclipse的用戶來說應(yīng)該不用看了。
通過以下三步將自己的應(yīng)用或?qū)⒁呀?jīng)跑起來的應(yīng)用加入調(diào)試列表:
1)選擇Devices列表中Your app,
2)選擇臭蟲按鈕將該程序加載進(jìn)調(diào)試狀態(tài)
3)OK,加斷點吧。不過源代碼要最新的否則斷點不起作用。
五、DDMS如何讓IDE的調(diào)試工作起來呢?
1)有幾個組成:
一個是adb(Android Debug Bridge)參考第一部分,它起到調(diào)試橋的作用;
另一類是運行在Device/Emulator端的adb daemon, VM, debugger, your Applicatioin,
通過下面句話就可以理解它們的關(guān)系:
一個App跑在一個進(jìn)程中,這個進(jìn)程又被一個VM綁定,都是一對一的,但VM與Emulator顯然是多對一的,
那調(diào)試時debugger從VM中拿到棧線程進(jìn)程等信息,而daemon的作用僅僅是被DDMS用于建立一條連接(看下面)。
最后一類則是運行在PC上的DDMS debugger;
這個debugger是IDE的調(diào)試器,你可以改成另一個調(diào)試器;
DDMS是Dalvik Debug Monitor Service,負(fù)責(zé)建立調(diào)試的作用,它僅有兩個Service,其他的功能都是通過ADB client.讓IDE與Emulator交互起來的。
2)開啟IDE時,DDMS會建立一個Device monitoring service用于監(jiān)控Emulator,因為可以開啟多個Emulator嘛;
如果找到一個Emulator,那么DDMS才會再開啟另一個Service叫VM Monitoring Sevice用于監(jiān)控該Emulator下的VM; 第一部分提到adb有三個部分,其中的adb client可以多個實例的,DDMS的Service通過從ADB Client與ADb server的交互結(jié)果來維護自身的數(shù)據(jù)。
如果VM Monitor找到Emulator的一個VM,那么DDMS會利用ADB獲取目標(biāo)VM的進(jìn)程ID,
同時通過client與daemon建立起與vm的debugger的新連接,注意新連接的交互端口是從8600開始的(n個的話端口是8659+n),這條新連接可以讓DDMS獲得與VM的實際交互。
剩下的就是DDMS把拿到的數(shù)據(jù)再扔給ide 的 debugger(它們之間默認(rèn)通過8700端口,可更改,因為與VM的交互端口從8600開始使用的話可能會不夠的),
這樣IDE的Debug視圖就能正確工作了.