ADB原始碼分析——ADB模組簡述(轉)
本文轉載自:http://www.apkbus.com/blog-50331-54609.html
1、Adb 原始碼路徑(system/core/adb)。
2、要想很快的瞭解一個模組的基本情況,最直接的就是檢視該模組的Android.mk檔案,下面就來看看adb模組的Android.mk檔案:
……
ifeq ($(HOST_OS),linux) //用HOST_OS這個巨集來相容不同的作業系統的adb可執行程式(windows、Linux……)
USB_SRCS := usb_linux.c
EXTRA_SRCS := get_my_path_linux.c
LOCAL_LDLIBS += -lrt -lncurses -lpthread
endif
……
LOCAL_MODULE := adb //編譯生成adb可執行程式。運行於PC端,通過HOST_OS這個巨集來相容不同的作業系統
……
include $(BUILD_HOST_EXECUTABLE)
……
……
LOCAL_MODULE := adbd //執行在手機端或模擬器等終端裝置的adbd daemon程序
LOCAL_FORCE_STATIC_EXECUTABLE := true
LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT_SBIN)
LOCAL_UNSTRIPPED_PATH := $(TARGET_ROOT_OUT_SBIN_UNSTRIPPED)
LOCAL_STATIC_LIBRARIES := libcutils libc
include $(BUILD_EXECUTABLE)
……
ifneq ($(SDK_ONLY),true)
LOCAL_MODULE := adb //編譯sdk時生成一個adb可執行程式sdk/platform-tools/adb
LOCAL_STATIC_LIBRARIES := libzipfile libunz libcutils
include $(BUILD_EXECUTABLE)。
通過檢視system/core/adb模組的Android.mk檔案,我們隊adb有了一個初步的印象: “adb的工作是由兩個可執行檔案完成的”。
a)、adb/adb.exe:運行於PC端(包括Linux、Windows、MacOS等作業系統之中),通常是x86架構之上。也就是我們常用的Android開發工具
SDK中(platform/tools/adb),我們在命令提示行執行adb命令時,就是通過這個adb程式執行的。
b)、adbd:運行於Android裝置的底層Linux之中,ARMv5架構上。構建不同檔案,通過傳入Android.mk的$(BUILD_SIMULATOR)變數是否為真。
原始碼中由ADB_HOST巨集用來區分本地主機(adb)和目標機(adbd)。區分不同OS,通過傳入Android.mk的$(HOST_OS)。它的有效取值包括linux、
darwin、freebsd和windows。不同平臺的主要差異是USB的控制方法和檔案路徑。
3、直接編譯該模組,可以看到會生成如下一些內容:
編譯生成的也就是我們上面講到的adb模組的兩個可執行檔案(adb和adbd daemon)。我們進入adb shell下,在sbin/目錄下存在一個adbd可執行程式,這就是就是ADB模組編譯生成的這個adbd可執行程式。而我們在安裝Android開發環境的時候有指定過sdk的環境變數,因此我們在命令列下面輸入的adb命令,就是通過sdk中的adb這個可執行程式進行響應的。 我們通過ps命令可以看到adb和adbd也分別運行於PC端和Adb裝置中,也就是說我們執行的所有的adb命令都是通過adb程序與adbd 守護程序之間進行資料交換的結果。
4、 通過上面的介紹,相信我們對ADB模組已經有了一個初步的印象了,要想更進一步瞭解adb模組,就需要深入的去分析一些整個adb模組的實現的方式了。在分析整個模組程式碼之前,我們先看一下Google對整個ADB模組的介紹(在system/core/adb目錄下有一個OVERVIEW.txt檔案),這個檔案介紹了這個adb模組的工作過程。英文好的同學可以詳細的閱讀一下OVERVIEW.txt這個檔案,這個檔案對整個ADB模組的工作原理講的比較透徹。
簡單的看看這個檔案的描述,整個ADB模組由如下幾個模組組成:
a)、The ADB server(adb): 執行在PC端的一個後臺應用程式,用來檢測Android Devices的連線或去除。ADB Server是一個時刻協調交換Client、Services和Android devices之間的資料。
b)、The ADB daemon (adbd) : 運行於一個Android Devices/Emulator的後臺守護程序,該程序主要是用來連線ADB Server通過USB(模擬器通過TCP協議)為adb clients提供一些運行於PC端的services。
c)、The ADB command-line client: 執行adb 命令的終端,它會找出PC端的執行的adb server如果沒有找到就會自動的啟動adb server,然後向adb server傳送請求命令。
d)、Services: 由此服務給adbd提供功能,即由這個模組完成,主要分為Host Services及 Local Services兩類
Host Services: 運行於ADB Server,不需要和devices進行資料交換。典型的就是執行adb devices命令時,只需要adb server端返回當前的adb devices的狀態即可。
Local Services: 運行於adbd守護程序,ADB Server 在adb clients和Local Services之間複用Streams。Local Services 用來初始化傳遞資料的連線。
ADB 通訊模型圖(欲瞭解更詳細的情況可以檢視system/core/adb/transports.txt檔案中的介紹)
(adb 通訊模型圖)
5、要想進一步瞭解adb命令的工作方式,就需要我們進一步研究adb模組的原始碼。Adb執行的入口在system/core/adb/adb.c中,下面來初步看看adb.c的main()方法:
int main(int argc, char **argv)
{
#if ADB_HOST //前面講到在Android.mk中定義了這個巨集,如果編譯adb ADB_HOST = 1否則ADB_HOST = 0
adb_sysdeps_init();
adb_trace_init();
D("Handling commandline()\n");
return adb_commandline(argc - 1, argv + 1); //執行PC端的adb/adb.exe可執行程式
#else
/* If adbd runs inside the emulator this will enable adb tracing via
* adb-debug qemud service in the emulator. */
adb_qemu_trace_init();
if((argc > 1) && (!strcmp(argv[1],"recovery"))) {
adb_device_banner = "recovery";
recovery_mode = 1;
}
start_device_log();
D("Handling main()\n");
return adb_main(0, DEFAULT_ADB_PORT); //執行Android devices/emulator 的adbd可執行程式
#endif
}。
小結:本篇文件主要講解了以下內容:
1、adb模組的原始碼路徑,原始碼編譯生成的結果。
2、adb模組分為adb client、adb server、services、adbd daemon幾個模組。
3、adb通訊模型。
4、adb與 adbd daemon的入口函式