歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Android開發工具——ADB(Android Debug Bridge)

Android Debug Bridge (adb) 是一個android開發人員必會的多功能的調試工具,確實它的名字一樣,它在開發者和目標機器之間,架起了一座bridge。

adb的用法很簡單,只要看完SDK文檔關於ADB的部分,(android-sdk-linux_86/docs/guide/developing/tools/adb.html),再稍加練習,基本上就滿上就能很熟練的使用了。但是對它的實現感興趣,最好的途徑就是閱讀源代碼,它android 2.2的位置是:

 
  1. system/core/adb  
        adb是slient-server架構的,包含三個部分,

1、 client,運行於開發機器,你可以在shell中調用adb命令,其它的Android工具比如ADT插件和DDMS也包含adb client。

2、 server,作為後台進程同樣運行於開發機器,server負責管理client和運行於目標機器或者emulator的守護進程之間的通信,就像一座橋一樣。

3、 daemon,運行於目標機或者emulator的守護進程。

       上面這段話是SDK裡面翻譯過來的,我是看adb的代碼看的有點迷糊,才去看sdk的,再返回來看代碼的時候思路清晰很多。

        adb的功能強大,而且支持多平台,但是它的代碼卻非常精簡,只有1.5萬行左右,代價就是比較晦澀難懂(看懂以前),代碼裡面隨處可見的各種宏讓人眼花缭亂,其中一個重要的宏ADB_HOST,是用來區分本地主機和目標機器的。

client和server調用的是adb

 
  1. LOCAL_CFLAGS += -O2 -g -DADB_HOST=1  -Wall -Wno-unused-parameter  
  2. LOCAL_CFLAGS += -D_XOPEN_SOURCE -D_GNU_SOURCE -DSH_HISTORY  
  3. LOCAL_MODULE := adb  
而emulator/device調用adbd  
  1. LOCAL_CFLAGS := -O2 -g -DADB_HOST=0 -Wall -Wno-unused-parameter  
  2. LOCAL_CFLAGS += -D_XOPEN_SOURCE -D_GNU_SOURCE  
  3. LOCAL_MODULE := adbd  

1、 在HOST端,adb會fork出一個守護進程(不是adbd),即server,而父進程繼續處理client請求,所有的client通過TCP端口號5037進行與server通信,而server創建local socket與remote socket,前者用於和client通信,後者用與遠端進行通信,emulator通過TCP,real device則通過usb。

2、在emulator/device端,adbd也創建local socket和remote socket,前者與通過jdwp與Java虛擬機進層通信,後者通過TCP/USB與HOST通信。

因此整個流程應該是這樣的,

1、client調用某個adb命令

2、adb進程fork出一個子進程作為server

3、server查找當前連接的emulator/device

4、server接收到來自client請求

5、server處理請求,將本地處理不了的請求發給emulator/device

6、位於emulator/device的adbd拿到請求後交給對應的java虛擬機進程。

7、adbd將結果發回給server

8、server講結果發回給client

如下圖:

                               ___________________________________
                               |                                                                                |
                               |                          ADB Server (host)                      |
                               |                                                                                 |
        Debugger <---> LocalSocket <-------------> RemoteSocket   |
                               |                                                              ^^                |
                               |___________________________||_______|
                                                                                               ||
                                                                            Transport ||
                              (TCP for emulator - USB for device) ||
                                                                                               ||
                                ___________________________||_______
                                |                                                              ||                |
                                |                                ADBD  (device)   ||                |
                                |                                                             VV               |
         JDWP <======> LocalSocket <------------> RemoteSocket |
                                |                                                                                 |
                                |___________________________________|

Copyright © Linux教程網 All Rights Reserved