Android培訓班(31) – Android移動開發技術文章_手機開發 Android移動開發教學課程

<!– @page { margin: 2cm } P { margin-bottom: 0.21cm } –>


在init.rc文件裡,可以看到下面的服務加載並運行:


# adbd is controlled by the persist.service.adb.enable system property


service adbd /sbin/adbd


disabled


 


adbd服務的代碼在目錄:Android-2.0/system/core/adb


adbd服務使用c語言實現,它不但可以在虛擬機裡運行,也可以在實際的設備裡運行。adbd服務是adb調試系統中的一部分,整個adb調試系統包括有三部分:手機運行的adbd服務、PC運行的服務器、PC運行的客戶端。當android啟動時,就運行adbd服務,創建一個調試端口,這樣就可以讓開發機器上的服務器連接過來,通過這個連接就可以發送調試信息給服務器,也可以接收到外面發送過來的調試命令。


 


先來分析編譯文件Android.mk,adbd相關內容如下:


# adbd device daemon


# =========================================================


 


# build adbd in all non-simulator builds


BUILD_ADBD := false


當設置為BUILD_ADBD為true時,就是編譯運行在模擬器裡的調試服務,否則就是運行到真實機器裡的調試服務。


 


ifneq ($(TARGET_SIMULATOR),true)


BUILD_ADBD := true


endif


 


 


如果運行在linux裡模擬器,就需要使用下面的判斷。


# build adbd for the Linux simulator build


# so we can use it to test the adb USB gadget driver on x86


#ifeq ($(HOST_OS),linux)


# BUILD_ADBD := true


#endif


 


 


ifeq ($(BUILD_ADBD),true)


include $(CLEAR_VARS)


 


LOCAL_SRC_FILES :=


adb.c


fdevent.c


transport.c


transport_local.c


transport_usb.c


sockets.c


services.c


file_sync_service.c


jdwp_service.c


framebuffer_service.c


remount_service.c


usb_linux_client.c


log_service.c


utils.c


 


LOCAL_CFLAGS := -O2 -g -DADB_HOST=0 -Wall -Wno-unused-parameter


LOCAL_CFLAGS += -D_XOPEN_SOURCE -D_GNU_SOURCE


 


# TODO: This should probably be board specific, whether or not the kernel has


# the gadget driver; rather than relying on the architecture type.


ifeq ($(TARGET_ARCH),arm)


LOCAL_CFLAGS += -DANDROID_GADGET=1


endif


 


LOCAL_MODULE := adbd


 


LOCAL_FORCE_STATIC_EXECUTABLE := true


LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT_SBIN)


LOCAL_UNSTRIPPED_PATH := $(TARGET_ROOT_OUT_SBIN_UNSTRIPPED)


 


如果在模擬器裡運行,就需要編譯為線程模式,否則就需要連接靜態庫的方式。


ifeq ($(TARGET_SIMULATOR),true)


LOCAL_STATIC_LIBRARIES := libcutils


LOCAL_LDLIBS += -lpthread


include $(BUILD_HOST_EXECUTABLE)


else


LOCAL_STATIC_LIBRARIES := libcutils libc


include $(BUILD_EXECUTABLE)


endif


 


接著來分析程序入口函數main處理過程,它的代碼如下:


int main(int argc, char **argv)


{


 


adb_trace_init();


這行代碼主要獲取環境變量,用來判斷到底輸出什麼樣信息。


 


下面這段代碼根據編譯選項來決定編譯為PC機裡的服務,還是設備運行的服務。


#if ADB_HOST


adb_sysdeps_init();


return adb_commandline(argc – 1, argv + 1);


這裡是選擇編譯為PC裡的服務器。


 


#else


 


這段是選擇為設備裡的服務進程。


if((argc > 1) && (!strcmp(argv[1],”recovery”))) {


adb_device_banner = “recovery”;


recovery_mode = 1;


}


上面這段用來判斷是否恢復模式。


 


 


start_device_log();


這行代碼開始輸出調試LOG。


 


return adb_main(0);


這行代碼是進入adb服務進程處理。


 


#endif


}

發佈留言