ADB是android debug bridge的縮寫,負責電腦與Android裝置的幾乎所有通訊和協作,可以認為是串連兩者的橋樑。
在Android開發和惡意程式碼分析中,經常用到它的install、uninstall、push、pull、logcat、shell等命令。它的用法可以參考SDK的文檔:
http://developer.android.com/guide/developing/tools/adb.html
正因為其獨特的橋樑作用,有必要詳細瞭解其工作過程。幸運的是,我們可以獲得其源碼,它位於Android源碼樹的platform/system/core/adb/目錄下,可以通過下面的git命令下載:
git clone git://android.git.kernel.org/platform/system/core.git
如果要編譯,還是推薦下載完整的Android源碼,並參考上一篇文章所述編譯方法。
ADB由兩個物理檔案組成:
- adb或adb.exe,運行於PC端,包括Linux、Windows、Mac OS等系統之中,通常是x86架構上(下文中,ADB指整個模組,而adb單獨指這一部分);
- adbd,運行於Android裝置的底層Linux之中,ARMv5架構上。
為了保持兩者代碼一致,Google並未將其做源碼檔案層級的分離,而是統一為一份代碼,通過傳入Android.mk的$(BUILD_SIMULATOR)變數是否為真,來構建不同的檔案。對源碼而言,由ADB_HOST宏是否預定義為真來區分。
而adb本身還需要估計多個作業系統平台,這由傳入Android.mk的$(HOST_OS)來控制,它的有效取值包括linux、darwin、freebsd和windows。不同平台的主要差異是USB的控制方法和檔案路徑。
除了物理檔案上的區別,adb本身還會在PC中產生兩類不同的進程。
其中一個進程將由命令列“adb fork-server server”產生(給使用者的調用介面是adb start-server),這個守護進程長期運行於後台,沒有控制台介面,稱之為adb server(adb服務端),其主要工作有兩部分:
- 管理PC中的Android模擬器,以及通過USB線串連到PC的Android裝置,負責維持運行於其中的adbd進程與自身的資料通道;
- 實現PC與裝置/模擬器之間的資料拷貝。
adb的另一類進程是提供給使用者的命令列工具,對使用者暴露了上述install、push、shell等介面,與使用者互動,稱之為adb client(adb用戶端)。其主要工作是解析這些命令的參數,做必要預先處理,然後轉移為指令或資料,發送給adb服務端。adb服務端再將指令資料轉寄到模擬器或裝置中,由adbd處理,產生結果,再通過adb服務端接收回來。
事實上,當adb用戶端運行時,會自動檢查當前系統中是否存在adb服務端,如果不存在,則通過“adb fork-server server”啟動一個服務端,然後再與之建立串連。這樣,使用者就不需要關心這些概念和差異了。
因此,從運行實體上看,ADB由三部分構成:
- adbd
- adb server
- adb client
Google還引入了一個adb service(adb服務,注意與adb服務端的區別)的概念,指adbd提供的功能。這就構成了ADB的四個模組。在源碼的OVERVIEW.txt檔案中對它們的關係進行了描述。而protocol.txt描述了各模組之間通訊協作的協議格式。
http://blog.claudxiao.net/2011/05/adb_analysis_part1/