Android開発ツール——ADB(Android Debug Bridge)概要


Android Debug Bridge(adb)はAndroid開発者が必ずできる多機能なデバッグツールです。確かにその名前は同じです。開発者と目標機器の間にbridgeが架けられています。
        adbの使い方は簡単です。SDK文書のADBに関する部分を見終わったら、(android-sdk-linuxu 86/docs/guide/developing/tools/adb)、もう少し練習すれば、ほぼ満杯で上手に使えます。しかし、その実現に興味があります。一番いい方法はソースコードを読むことです。android 2.2の位置は:
system/core/adb
        adbはsleient-serverアーキテクチャで、三つの部分を含みます。
1、clientは開発マシンで動作します。shellでadb命令を呼び出すことができます。他のAndroidツールはADTプラグインやDDMSなどもadb clientを含みます。
2、serverは、バックグラウンドプロセスとして同じ開発マシンで動作しています。serverは、clientとターゲットマシンまたはemulatorのデーモンプロセスとの間の通信を管理しています。橋のようです。
3、daemenは、ターゲットマシンまたはeulatorのデーモンプロセスで実行します。
       上の文はSDKの中で翻訳されたものです。adbのコードを見て、ぼんやりしていて、sdkを見に行きました。コードを見に戻ったら、考えがはっきりしています。
        adbの機能は強くて、マルチプラットフォームをサポートしていますが、コードは非常に簡単で、1.5万行ぐらいしかないです。価格は分かりにくいです。コードの中には随所に見られる各種のマクロは目がくらみます。その中の一つの重要なマクロADB_です。HOSTは、ローカルホストとターゲットマシンを区別するためのものです。
clientとserverが呼び出したのはadbです。
LOCAL_CFLAGS += -O2 -g -DADB_HOST=1  -Wall -Wno-unused-parameter
LOCAL_CFLAGS += -D_XOPEN_SOURCE -D_GNU_SOURCE -DSH_HISTORY
LOCAL_MODULE := adb
emulator/deviceがadbdを呼び出します。
LOCAL_CFLAGS := -O2 -g -DADB_HOST=0 -Wall -Wno-unused-parameter
LOCAL_CFLAGS += -D_XOPEN_SOURCE -D_GNU_SOURCE
LOCAL_MODULE := adbd
1、HOST端では、adbはforkで保護プロセス(adbdではない)を出します。つまり、親プロセスはclient要求を処理し続けます。すべてのclientはTCPポート番号5037を通じてserverと通信します。serverはlocal socketとremote socketを作成します。前者はclientと通信します。後者はリモート端末と通信します。emuladeviceはTCPを通じて通信します。
2、emulator/device端末で、adbdもlocal socketとremote socketを作成して、前者はjdwpを通じてJava仮想マシンと層通信して、後者はTCP/USBを通じてHOSTと通信します。
したがって、全体の流れはこうなるべきです。
1、clientはあるadbコマンドを呼び出します。
2、adbプロセスforkからサブプロセスをserverとして出す
3、serverは現在接続されているeulator/deviceを検索します。
4、serverはclientからの要求を受信しました。
5、server処理要求は、現地で処理できない要求をemaulator/deviceに送ります。
6、emulator/deviceにあるadbdは要求を持ってから対応するjava仮想マシンプロセスに渡す。
7、adbdは結果をserverに返送する。
8、serverの結果をclientに返送します。
次の図のように
                               ___________________________________                                |                                                                                |                                |                          ADB Server(host)                     |                                |                                                                                 |         Debugger<-->LocarSocket<----->RemoteSocket  |                                |                                                              ^^                |                                |___________________________||_______|                                                                                                ||                                                                             Transport 124                              (TCP for emulator-USB for device)||                                                                                               ||                                 ___________________________||_______                                 |                                                              ||                |                                 |                                ADBD (device)  ||                |                                 |                                                             VV              |          JDWP<=====>LocalSocket<------>RemoteSocket|                                |                                                                                 |                                 |___________________________________|