Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> adb 深入分析一1、adb模塊的源碼路徑,源碼編譯生成的結果。 2、adb模塊分為adb client、adb server、services、adbd daemon幾個

adb 深入分析一1、adb模塊的源碼路徑,源碼編譯生成的結果。 2、adb模塊分為adb client、adb server、services、adbd daemon幾個

編輯:關於Android編程

主要分為:   1、adb模塊的源碼路徑,源碼編譯生成的結果。   2、adb模塊分為adb client、adb server、services、adbd daemon幾個模塊。   3、adb通訊模型。   4、adb與 adbd daemon的入口函數。   內容:     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 用來初始化傳遞數據的連接   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. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved