日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android adb源码分析(1)

發布時間:2023/12/1 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android adb源码分析(1) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

ADB是Android debug bridge的縮寫,它使用PC機可以通過USB或網絡與android設備通訊。

adb的源碼位于system/core/adb目錄下,先來看下編譯腳本Android.mk:

[plain] view plaincopy
  • #?Copyright?2005?The?Android?Open?Source?Project??
  • #??
  • #?Android.mk?for?adb??
  • #??
  • ??
  • LOCAL_PATH:=?$(call?my-dir)??
  • ??
  • #?adb?host?tool??
  • #?=========================================================??
  • include?$(CLEAR_VARS)??
  • ??
  • #?Default?to?a?virtual?(sockets)?usb?interface??
  • USB_SRCS?:=??
  • EXTRA_SRCS?:=??
  • ??
  • ifeq?($(HOST_OS),linux)??
  • ??USB_SRCS?:=?usb_linux.c??
  • ??EXTRA_SRCS?:=?get_my_path_linux.c??
  • ??LOCAL_LDLIBS?+=?-lrt?-ldl?-lpthread??
  • ??LOCAL_CFLAGS?+=?-DWORKAROUND_BUG6558362??
  • endif??
  • ??
  • ifeq?($(HOST_OS),darwin)??
  • ??USB_SRCS?:=?usb_osx.c??
  • ??EXTRA_SRCS?:=?get_my_path_darwin.c??
  • ??LOCAL_LDLIBS?+=?-lpthread?-framework?CoreFoundation?-framework?IOKit?-framework?Carbon??
  • endif??
  • ??
  • ifeq?($(HOST_OS),freebsd)??
  • ??USB_SRCS?:=?usb_libusb.c??
  • ??EXTRA_SRCS?:=?get_my_path_freebsd.c??
  • ??LOCAL_LDLIBS?+=?-lpthread?-lusb??
  • endif??
  • ??
  • ifeq?($(HOST_OS),windows)??
  • ??USB_SRCS?:=?usb_windows.c??
  • ??EXTRA_SRCS?:=?get_my_path_windows.c?../libcutils/list.c??
  • ??EXTRA_STATIC_LIBS?:=?AdbWinApi??
  • ??ifneq?($(strip?$(USE_CYGWIN)),)??
  • ????#?Pure?cygwin?case??
  • ????LOCAL_LDLIBS?+=?-lpthread?-lgdi32??
  • ????LOCAL_C_INCLUDES?+=?/usr/include/w32api/ddk??
  • ??endif??
  • ??ifneq?($(strip?$(USE_MINGW)),)??
  • ????#?MinGW?under?Linux?case??
  • ????LOCAL_LDLIBS?+=?-lws2_32?-lgdi32??
  • ????USE_SYSDEPS_WIN32?:=?1??
  • ????LOCAL_C_INCLUDES?+=?/usr/i586-mingw32msvc/include/ddk??
  • ??endif??
  • ??LOCAL_C_INCLUDES?+=?development/host/windows/usb/api/??
  • endif??
  • ??
  • LOCAL_SRC_FILES?:=?\??
  • ????adb.c?\??
  • ????console.c?\??
  • ????transport.c?\??
  • ????transport_local.c?\??
  • ????transport_usb.c?\??
  • ????commandline.c?\??
  • ????adb_client.c?\??
  • ????adb_auth_host.c?\??
  • ????sockets.c?\??
  • ????services.c?\??
  • ????file_sync_client.c?\??
  • ????$(EXTRA_SRCS)?\??
  • ????$(USB_SRCS)?\??
  • ????usb_vendors.c??
  • ??
  • LOCAL_C_INCLUDES?+=?external/openssl/include??
  • ??
  • ifneq?($(USE_SYSDEPS_WIN32),)??
  • ??LOCAL_SRC_FILES?+=?sysdeps_win32.c??
  • else??
  • ??LOCAL_SRC_FILES?+=?fdevent.c??
  • endif??
  • ??
  • LOCAL_CFLAGS?+=?-O2?-g?-DADB_HOST=1??-Wall?-Wno-unused-parameter??
  • LOCAL_CFLAGS?+=?-D_XOPEN_SOURCE?-D_GNU_SOURCE??
  • LOCAL_MODULE?:=?adb??
  • LOCAL_MODULE_TAGS?:=?debug??
  • ??
  • LOCAL_STATIC_LIBRARIES?:=?libzipfile?libunz?libcrypto_static?$(EXTRA_STATIC_LIBS)??
  • ifeq?($(USE_SYSDEPS_WIN32),)??
  • ????LOCAL_STATIC_LIBRARIES?+=?libcutils??
  • endif??
  • ??
  • include?$(BUILD_HOST_EXECUTABLE)??
  • ??
  • $(call?dist-for-goals,dist_files?sdk,$(LOCAL_BUILT_MODULE))??
  • ??
  • ifeq?($(HOST_OS),windows)??
  • $(LOCAL_INSTALLED_MODULE):?\??
  • ????$(HOST_OUT_EXECUTABLES)/AdbWinApi.dll?\??
  • ????$(HOST_OUT_EXECUTABLES)/AdbWinUsbApi.dll??
  • endif??
  • ??
  • ??
  • #?adbd?device?daemon??
  • #?=========================================================??
  • ??
  • include?$(CLEAR_VARS)??
  • ??
  • LOCAL_SRC_FILES?:=?\??
  • ????adb.c?\??
  • ????backup_service.c?\??
  • ????fdevent.c?\??
  • ????transport.c?\??
  • ????transport_local.c?\??
  • ????transport_usb.c?\??
  • ????adb_auth_client.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??
  • ??
  • LOCAL_CFLAGS?:=?-O2?-g?-DADB_HOST=0?-Wall?-Wno-unused-parameter??
  • LOCAL_CFLAGS?+=?-D_XOPEN_SOURCE?-D_GNU_SOURCE??
  • ??
  • ifneq?(,$(filter?userdebug?eng,$(TARGET_BUILD_VARIANT)))??
  • LOCAL_CFLAGS?+=?-DALLOW_ADBD_ROOT=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)??
  • ??
  • LOCAL_STATIC_LIBRARIES?:=?liblog?libcutils?libc?libmincrypt??
  • include?$(BUILD_EXECUTABLE)??
  • ??
  • ??
  • #?adb?host?tool?for?device-as-host??
  • #?=========================================================??
  • ifneq?($(SDK_ONLY),true)??
  • include?$(CLEAR_VARS)??
  • ??
  • LOCAL_LDLIBS?:=?-lrt?-ldl?-lpthread??
  • ??
  • LOCAL_SRC_FILES?:=?\??
  • ????adb.c?\??
  • ????console.c?\??
  • ????transport.c?\??
  • ????transport_local.c?\??
  • ????transport_usb.c?\??
  • ????commandline.c?\??
  • ????adb_client.c?\??
  • ????adb_auth_host.c?\??
  • ????sockets.c?\??
  • ????services.c?\??
  • ????file_sync_client.c?\??
  • ????get_my_path_linux.c?\??
  • ????usb_linux.c?\??
  • ????usb_vendors.c?\??
  • ????fdevent.c??
  • ??
  • LOCAL_CFLAGS?:=?\??
  • ????-O2?\??
  • ????-g?\??
  • ????-DADB_HOST=1?\??
  • ????-DADB_HOST_ON_TARGET=1?\??
  • ????-Wall?\??
  • ????-Wno-unused-parameter?\??
  • ????-D_XOPEN_SOURCE?\??
  • ????-D_GNU_SOURCE??
  • ??
  • LOCAL_C_INCLUDES?+=?external/openssl/include??
  • ??
  • LOCAL_MODULE?:=?adb??
  • ??
  • LOCAL_STATIC_LIBRARIES?:=?libzipfile?libunz?libcutils??
  • ??
  • LOCAL_SHARED_LIBRARIES?:=?libcrypto??
  • ??
  • include?$(BUILD_EXECUTABLE)??
  • endif??

  • 可以看到,最終會有3個執行文件被生成,adbd和兩個adb程序。adbd是手機終的守護進程;adb一個是windows、linux、darwin或freebsd運行的程序,另一個是目標機上運行的程序。

    ??? 宏ADB_HOST用于區分是PC端程序還是目標機端的程序。宏ADB_HOST_ON_TARGET用于區分adb程序是否是在目標機上運行。這3個程序使用的是同一份源碼,在內部,使用這些宏來區別不同的程序。

    ??? 程序的入口在adb.c的main()函數:

    [cpp] view plaincopy
  • int?main(int?argc,?char?**argv)??
  • {??
  • #if?ADB_HOST??
  • ????adb_sysdeps_init();??
  • ????adb_trace_init();??
  • ????D("Handling?commandline()\n");??
  • ????return?adb_commandline(argc?-?1,?argv?+?1);??
  • #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);??
  • #endif??
  • }??

  • 先來看adbd程序,此時宏的設置是ADB_HOST=0。上面代碼中start_device_log()是log的初始化操作,可以重定向輸出的log信息,接著進入adb_main()函數。先來看下它的參數DEFAULT_ADB_PORT:

    [cpp] view plaincopy
  • #if?ADB_HOST_ON_TARGET??
  • /*?adb?and?adbd?are?coexisting?on?the?target,?so?use?5038?for?adb?
  • ?*?to?avoid?conflicting?with?adbd's?usage?of?5037?
  • ?*/??
  • #??define?DEFAULT_ADB_PORT?5038??
  • #else??
  • #??define?DEFAULT_ADB_PORT?5037??
  • #endif??
  • 如果是目標機程序,它的值是5038,否則它的值是5037。這里沒有定義ADB_HOST_ON_TARGET, 所以它是5037。

    adb_main()的源代碼如下:

    [cpp] view plaincopy
  • int?adb_main(int?is_daemon,?int?server_port)??
  • {??
  • #if?!ADB_HOST??
  • ????int?port;??
  • ????char?value[PROPERTY_VALUE_MAX];??
  • ??
  • ????umask(000);??
  • #endif??
  • ??
  • ????atexit(adb_cleanup);??
  • #ifdef?HAVE_WIN32_PROC??
  • ????SetConsoleCtrlHandler(?ctrlc_handler,?TRUE?);??
  • #elif?defined(HAVE_FORKEXEC)??
  • ????//?No?SIGCHLD.?Let?the?service?subproc?handle?its?children.??
  • ????signal(SIGPIPE,?SIG_IGN);??
  • #endif??
  • ??
  • ????init_transport_registration();??
  • ??
  • #if?ADB_HOST??
  • ????HOST?=?1;??
  • ????usb_vendors_init();??
  • ????usb_init();??
  • ????local_init(DEFAULT_ADB_LOCAL_TRANSPORT_PORT);??
  • ????adb_auth_init();??
  • ??
  • ????char?local_name[30];??
  • ????build_local_name(local_name,?sizeof(local_name),?server_port);??
  • ????if(install_listener(local_name,?"*smartsocket*",?NULL))?{??
  • ????????exit(1);??
  • ????}??
  • #else??
  • ????property_get("ro.adb.secure",?value,?"0");??
  • ????auth_enabled?=?!strcmp(value,?"1");??
  • ????if?(auth_enabled)??
  • ????????adb_auth_init();??
  • ??
  • ????//?Our?external?storage?path?may?be?different?than?apps,?since??
  • ????//?we?aren't?able?to?bind?mount?after?dropping?root.??
  • ????const?char*?adb_external_storage?=?getenv("ADB_EXTERNAL_STORAGE");??
  • ????if?(NULL?!=?adb_external_storage)?{??
  • ????????setenv("EXTERNAL_STORAGE",?adb_external_storage,?1);??
  • ????}?else?{??
  • ????????D("Warning:?ADB_EXTERNAL_STORAGE?is?not?set.??Leaving?EXTERNAL_STORAGE"??
  • ??????????"?unchanged.\n");??
  • ????}??
  • ??
  • ????/*?don't?listen?on?a?port?(default?5037)?if?running?in?secure?mode?*/??
  • ????/*?don't?run?as?root?if?we?are?running?in?secure?mode?*/??
  • ????if?(should_drop_privileges())?{??
  • ????????struct?__user_cap_header_struct?header;??
  • ????????struct?__user_cap_data_struct?cap;??
  • ??
  • ????????if?(prctl(PR_SET_KEEPCAPS,?1,?0,?0,?0)?!=?0)?{??
  • ????????????exit(1);??
  • ????????}??
  • ??
  • ????????/*?add?extra?groups:?
  • ????????**?AID_ADB?to?access?the?USB?driver?
  • ????????**?AID_LOG?to?read?system?logs?(adb?logcat)?
  • ????????**?AID_INPUT?to?diagnose?input?issues?(getevent)?
  • ????????**?AID_INET?to?diagnose?network?issues?(netcfg,?ping)?
  • ????????**?AID_GRAPHICS?to?access?the?frame?buffer?
  • ????????**?AID_NET_BT?and?AID_NET_BT_ADMIN?to?diagnose?bluetooth?(hcidump)?
  • ????????**?AID_SDCARD_R?to?allow?reading?from?the?SD?card?
  • ????????**?AID_SDCARD_RW?to?allow?writing?to?the?SD?card?
  • ????????**?AID_MOUNT?to?allow?unmounting?the?SD?card?before?rebooting?
  • ????????**?AID_NET_BW_STATS?to?read?out?qtaguid?statistics?
  • ????????*/??
  • ????????gid_t?groups[]?=?{?AID_ADB,?AID_LOG,?AID_INPUT,?AID_INET,?AID_GRAPHICS,??
  • ???????????????????????????AID_NET_BT,?AID_NET_BT_ADMIN,?AID_SDCARD_R,?AID_SDCARD_RW,??
  • ???????????????????????????AID_MOUNT,?AID_NET_BW_STATS?};??
  • ????????if?(setgroups(sizeof(groups)/sizeof(groups[0]),?groups)?!=?0)?{??
  • ????????????exit(1);??
  • ????????}??
  • ??
  • ????????/*?then?switch?user?and?group?to?"shell"?*/??
  • ????????if?(setgid(AID_SHELL)?!=?0)?{??
  • ????????????exit(1);??
  • ????????}??
  • ????????if?(setuid(AID_SHELL)?!=?0)?{??
  • ????????????exit(1);??
  • ????????}??
  • ??
  • ????????/*?set?CAP_SYS_BOOT?capability,?so?"adb?reboot"?will?succeed?*/??
  • ????????header.version?=?_LINUX_CAPABILITY_VERSION;??
  • ????????header.pid?=?0;??
  • ????????cap.effective?=?cap.permitted?=?(1?<<?CAP_SYS_BOOT);??
  • ????????cap.inheritable?=?0;??
  • ????????capset(&header,?&cap);??
  • ??
  • ????????D("Local?port?disabled\n");??
  • ????}?else?{??
  • ????????char?local_name[30];??
  • ????????build_local_name(local_name,?sizeof(local_name),?server_port);??
  • ????????if(install_listener(local_name,?"*smartsocket*",?NULL))?{??
  • ????????????exit(1);??
  • ????????}??
  • ????}??
  • ??
  • ????int?usb?=?0;??
  • ????if?(access(USB_ADB_PATH,?F_OK)?==?0?||?access(USB_FFS_ADB_EP0,?F_OK)?==?0)?{??
  • ????????//?listen?on?USB??
  • ????????usb_init();??
  • ????????usb?=?1;??
  • ????}??
  • ??
  • ????//?If?one?of?these?properties?is?set,?also?listen?on?that?port??
  • ????//?If?one?of?the?properties?isn't?set?and?we?couldn't?listen?on?usb,??
  • ????//?listen?on?the?default?port.??
  • ????property_get("service.adb.tcp.port",?value,?"");??
  • ????if?(!value[0])?{??
  • ????????property_get("persist.adb.tcp.port",?value,?"");??
  • ????}??
  • ????if?(sscanf(value,?"%d",?&port)?==?1?&&?port?>?0)?{??
  • ????????printf("using?port=%d\n",?port);??
  • ????????//?listen?on?TCP?port?specified?by?service.adb.tcp.port?property??
  • ????????local_init(port);??
  • ????}?else?if?(!usb)?{??
  • ????????//?listen?on?default?port??
  • ????????local_init(DEFAULT_ADB_LOCAL_TRANSPORT_PORT);??
  • ????}??
  • ??
  • ????D("adb_main():?pre?init_jdwp()\n");??
  • ????init_jdwp();??
  • ????D("adb_main():?post?init_jdwp()\n");??
  • #endif??
  • ??
  • ????if?(is_daemon)??
  • ????{??
  • ????????//?inform?our?parent?that?we?are?up?and?running.??
  • #ifdef?HAVE_WIN32_PROC??
  • ????????DWORD??count;??
  • ????????WriteFile(?GetStdHandle(?STD_OUTPUT_HANDLE?),?"OK\n",?3,?&count,?NULL?);??
  • #elif?defined(HAVE_FORKEXEC)??
  • ????????fprintf(stderr,?"OK\n");??
  • #endif??
  • ????????start_logging();??
  • ????}??
  • ????D("Event?loop?starting\n");??
  • ??
  • ????fdevent_loop();??
  • ??
  • ????usb_cleanup();??
  • ??
  • ????return?0;??
  • }??

  • (1) init_transport_registration()初始化fevent transport_registration_fde;

    (2) 判斷系統屬性ro.adb.secure,目標板沒有設置這個宏;

    (3) 沒有定義環境變量adb_external_storage;

    (4) should_drop_privileges()根據android編譯環境should_drop_privileges返回不同的值,如果它的值是userdebug或eng,宏ALLOW_ADBD_ROOT的值被定義為1,執行install_listener(),否則不會定義,這種情況下,由于adbd運行在root下,為保證它的安全性,它需要降級運行;

    (5) 判斷是否存在設備文件USB_ADB_PATH或USB_FFS_ADB_EP0,存在則執行usb_init();

    (6) 讀取屬性service.adb.tcp.port或persist.adb.tcp.port(目標板均未定義),執行local_init(),它內部會創建adb thread;

    (7) 執行init_jdwp(),jdwp是java調試體系中的一種,具體可百度;

    (8) 調用fdevent_loop()監聽fdevent并處理;

    (9) 程序結束。

    ?

    再來看adb程序的執行:

    在main()中調用return adb_commandline(argc - 1, argv + 1):

    [cpp] view plaincopy
  • int?adb_commandline(int?argc,?char?**argv)??
  • {??
  • ????char?buf[4096];??
  • ????int?no_daemon?=?0;??
  • ????int?is_daemon?=?0;??
  • ????int?is_server?=?0;??
  • ????int?persist?=?0;??
  • ????int?r;??
  • ????int?quote;??
  • ????transport_type?ttype?=?kTransportAny;??
  • ????char*?serial?=?NULL;??
  • ????char*?server_port_str?=?NULL;??
  • ??
  • ????????/*?If?defined,?this?should?be?an?absolute?path?to?
  • ?????????*?the?directory?containing?all?of?the?various?system?images?
  • ?????????*?for?a?particular?product.??If?not?defined,?and?the?adb?
  • ?????????*?command?requires?this?information,?then?the?user?must?
  • ?????????*?specify?the?path?using?"-p".?
  • ?????????*/??
  • ????gProductOutPath?=?getenv("ANDROID_PRODUCT_OUT");??
  • ????if?(gProductOutPath?==?NULL?||?gProductOutPath[0]?==?'\0')?{??
  • ????????gProductOutPath?=?NULL;??
  • ????}??
  • ????//?TODO:?also?try?TARGET_PRODUCT/TARGET_DEVICE?as?a?hint??
  • ??
  • ????serial?=?getenv("ANDROID_SERIAL");??
  • ??
  • ????/*?Validate?and?assign?the?server?port?*/??
  • ????server_port_str?=?getenv("ANDROID_ADB_SERVER_PORT");??
  • ????int?server_port?=?DEFAULT_ADB_PORT;??
  • ????if?(server_port_str?&&?strlen(server_port_str)?>?0)?{??
  • ????????server_port?=?(int)?strtol(server_port_str,?NULL,?0);??
  • ????????if?(server_port?<=?0)?{??
  • ????????????fprintf(stderr,??
  • ????????????????????"adb:?Env?var?ANDROID_ADB_SERVER_PORT?must?be?a?positive?number.?Got?\"%s\"\n",??
  • ????????????????????server_port_str);??
  • ????????????return?usage();??
  • ????????}??
  • ????}??
  • ??
  • ????/*?modifiers?and?flags?*/??
  • ????while(argc?>?0)?{??
  • ????????if(!strcmp(argv[0],"server"))?{??
  • ????????????is_server?=?1;??
  • ????????}?else?if(!strcmp(argv[0],"nodaemon"))?{??
  • ????????????no_daemon?=?1;??
  • ????????}?else?if?(!strcmp(argv[0],?"fork-server"))?{??
  • ????????????/*?this?is?a?special?flag?used?only?when?the?ADB?client?launches?the?ADB?Server?*/??
  • ????????????is_daemon?=?1;??
  • ????????}?else?if(!strcmp(argv[0],"persist"))?{??
  • ????????????persist?=?1;??
  • ????????}?else?if(!strncmp(argv[0],?"-p",?2))?{??
  • ????????????const?char?*product?=?NULL;??
  • ????????????if?(argv[0][2]?==?'\0')?{??
  • ????????????????if?(argc?<?2)?return?usage();??
  • ????????????????product?=?argv[1];??
  • ????????????????argc--;??
  • ????????????????argv++;??
  • ????????????}?else?{??
  • ????????????????product?=?argv[0]?+?2;??
  • ????????????}??
  • ????????????gProductOutPath?=?find_product_out_path(product);??
  • ????????????if?(gProductOutPath?==?NULL)?{??
  • ????????????????fprintf(stderr,?"adb:?could?not?resolve?\"-p?%s\"\n",??
  • ????????????????????????product);??
  • ????????????????return?usage();??
  • ????????????}??
  • ????????}?else?if?(argv[0][0]=='-'?&&?argv[0][1]=='s')?{??
  • ????????????if?(isdigit(argv[0][2]))?{??
  • ????????????????serial?=?argv[0]?+?2;??
  • ????????????}?else?{??
  • ????????????????if(argc?<?2?||?argv[0][2]?!=?'\0')?return?usage();??
  • ????????????????serial?=?argv[1];??
  • ????????????????argc--;??
  • ????????????????argv++;??
  • ????????????}??
  • ????????}?else?if?(!strcmp(argv[0],"-d"))?{??
  • ????????????ttype?=?kTransportUsb;??
  • ????????}?else?if?(!strcmp(argv[0],"-e"))?{??
  • ????????????ttype?=?kTransportLocal;??
  • ????????}?else?{??
  • ????????????????/*?out?of?recognized?modifiers?and?flags?*/??
  • ????????????break;??
  • ????????}??
  • ????????argc--;??
  • ????????argv++;??
  • ????}??
  • ??
  • ????adb_set_transport(ttype,?serial);??
  • ????adb_set_tcp_specifics(server_port);??
  • ??
  • ????if?(is_server)?{??
  • ????????if?(no_daemon?||?is_daemon)?{??
  • ????????????r?=?adb_main(is_daemon,?server_port);??
  • ????????}?else?{??
  • ????????????r?=?launch_server(server_port);??
  • ????????}??
  • ????????if(r)?{??
  • ????????????fprintf(stderr,"*?could?not?start?server?*\n");??
  • ????????}??
  • ????????return?r;??
  • ????}??
  • ??
  • top:??
  • ????if(argc?==?0)?{??
  • ????????return?usage();??
  • ????}??
  • ??
  • ????/*?adb_connect()?commands?*/??
  • ??
  • ????if(!strcmp(argv[0],?"devices"))?{??
  • ????????char?*tmp;??
  • ????????char?*listopt;??
  • ????????if?(argc?<?2)??
  • ????????????listopt?=?"";??
  • ????????else?if?(argc?==?2?&&?!strcmp(argv[1],?"-l"))??
  • ????????????listopt?=?argv[1];??
  • ????????else?{??
  • ????????????fprintf(stderr,?"Usage:?adb?devices?[-l]\n");??
  • ????????????return?1;??
  • ????????}??
  • ????????snprintf(buf,?sizeof?buf,?"host:%s%s",?argv[0],?listopt);??
  • ????????tmp?=?adb_query(buf);??
  • ????????if(tmp)?{??
  • ????????????printf("List?of?devices?attached?\n");??
  • ????????????printf("%s\n",?tmp);??
  • ????????????return?0;??
  • ????????}?else?{??
  • ????????????return?1;??
  • ????????}??
  • ????}??
  • ??
  • ????if(!strcmp(argv[0],?"connect"))?{??
  • ????????char?*tmp;??
  • ????????if?(argc?!=?2)?{??
  • ????????????fprintf(stderr,?"Usage:?adb?connect?<host>[:<port>]\n");??
  • ????????????return?1;??
  • ????????}??
  • ????????snprintf(buf,?sizeof?buf,?"host:connect:%s",?argv[1]);??
  • ????????tmp?=?adb_query(buf);??
  • ????????if(tmp)?{??
  • ????????????printf("%s\n",?tmp);??
  • ????????????return?0;??
  • ????????}?else?{??
  • ????????????return?1;??
  • ????????}??
  • ????}??
  • ??
  • ????if(!strcmp(argv[0],?"disconnect"))?{??
  • ????????char?*tmp;??
  • ????????if?(argc?>?2)?{??
  • ????????????fprintf(stderr,?"Usage:?adb?disconnect?[<host>[:<port>]]\n");??
  • ????????????return?1;??
  • ????????}??
  • ????????if?(argc?==?2)?{??
  • ????????????snprintf(buf,?sizeof?buf,?"host:disconnect:%s",?argv[1]);??
  • ????????}?else?{??
  • ????????????snprintf(buf,?sizeof?buf,?"host:disconnect:");??
  • ????????}??
  • ????????tmp?=?adb_query(buf);??
  • ????????if(tmp)?{??
  • ????????????printf("%s\n",?tmp);??
  • ????????????return?0;??
  • ????????}?else?{??
  • ????????????return?1;??
  • ????????}??
  • ????}??
  • ??
  • ????if?(!strcmp(argv[0],?"emu"))?{??
  • ????????return?adb_send_emulator_command(argc,?argv);??
  • ????}??
  • ??
  • ????if(!strcmp(argv[0],?"shell")?||?!strcmp(argv[0],?"hell"))?{??
  • ????????int?r;??
  • ????????int?fd;??
  • ??
  • ????????char?h?=?(argv[0][0]?==?'h');??
  • ??
  • ????????if?(h)?{??
  • ????????????printf("\x1b[41;33m");??
  • ????????????fflush(stdout);??
  • ????????}??
  • ??
  • ????????if(argc?<?2)?{??
  • ????????????D("starting?interactive?shell\n");??
  • ????????????r?=?interactive_shell();??
  • ????????????if?(h)?{??
  • ????????????????printf("\x1b[0m");??
  • ????????????????fflush(stdout);??
  • ????????????}??
  • ????????????return?r;??
  • ????????}??
  • ??
  • ????????snprintf(buf,?sizeof?buf,?"shell:%s",?argv[1]);??
  • ????????argc?-=?2;??
  • ????????argv?+=?2;??
  • ????????while(argc--?>?0)?{??
  • ????????????strcat(buf,?"?");??
  • ??
  • ????????????/*?quote?empty?strings?and?strings?with?spaces?*/??
  • ????????????quote?=?(**argv?==?0?||?strchr(*argv,?'?'));??
  • ????????????if?(quote)??
  • ????????????????strcat(buf,?"\"");??
  • ????????????strcat(buf,?*argv++);??
  • ????????????if?(quote)??
  • ????????????????strcat(buf,?"\"");??
  • ????????}??
  • ??
  • ????????for(;;)?{??
  • ????????????D("interactive?shell?loop.?buff=%s\n",?buf);??
  • ????????????fd?=?adb_connect(buf);??
  • ????????????if(fd?>=?0)?{??
  • ????????????????D("about?to?read_and_dump(fd=%d)\n",?fd);??
  • ????????????????read_and_dump(fd);??
  • ????????????????D("read_and_dump()?done.\n");??
  • ????????????????adb_close(fd);??
  • ????????????????r?=?0;??
  • ????????????}?else?{??
  • ????????????????fprintf(stderr,"error:?%s\n",?adb_error());??
  • ????????????????r?=?-1;??
  • ????????????}??
  • ??
  • ????????????if(persist)?{??
  • ????????????????fprintf(stderr,"\n-?waiting?for?device?-\n");??
  • ????????????????adb_sleep_ms(1000);??
  • ????????????????do_cmd(ttype,?serial,?"wait-for-device",?0);??
  • ????????????}?else?{??
  • ????????????????if?(h)?{??
  • ????????????????????printf("\x1b[0m");??
  • ????????????????????fflush(stdout);??
  • ????????????????}??
  • ????????????????D("interactive?shell?loop.?return?r=%d\n",?r);??
  • ????????????????return?r;??
  • ????????????}??
  • ????????}??
  • ????}??
  • ??
  • ????if(!strcmp(argv[0],?"kill-server"))?{??
  • ????????int?fd;??
  • ????????fd?=?_adb_connect("host:kill");??
  • ????????if(fd?==?-1)?{??
  • ????????????fprintf(stderr,"*?server?not?running?*\n");??
  • ????????????return?1;??
  • ????????}??
  • ????????return?0;??
  • ????}??
  • ??
  • ????if(!strcmp(argv[0],?"sideload"))?{??
  • ????????if(argc?!=?2)?return?usage();??
  • ????????if(adb_download("sideload",?argv[1],?1))?{??
  • ????????????return?1;??
  • ????????}?else?{??
  • ????????????return?0;??
  • ????????}??
  • ????}??
  • ??
  • ????if(!strcmp(argv[0],?"remount")?||?!strcmp(argv[0],?"reboot")??
  • ????????????||?!strcmp(argv[0],?"reboot-bootloader")??
  • ????????????||?!strcmp(argv[0],?"tcpip")?||?!strcmp(argv[0],?"usb")??
  • ????????????||?!strcmp(argv[0],?"root"))?{??
  • ????????char?command[100];??
  • ????????if?(!strcmp(argv[0],?"reboot-bootloader"))??
  • ????????????snprintf(command,?sizeof(command),?"reboot:bootloader");??
  • ????????else?if?(argc?>?1)??
  • ????????????snprintf(command,?sizeof(command),?"%s:%s",?argv[0],?argv[1]);??
  • ????????else??
  • ????????????snprintf(command,?sizeof(command),?"%s:",?argv[0]);??
  • ????????int?fd?=?adb_connect(command);??
  • ????????if(fd?>=?0)?{??
  • ????????????read_and_dump(fd);??
  • ????????????adb_close(fd);??
  • ????????????return?0;??
  • ????????}??
  • ????????fprintf(stderr,"error:?%s\n",?adb_error());??
  • ????????return?1;??
  • ????}??
  • ??
  • ????if(!strcmp(argv[0],?"bugreport"))?{??
  • ????????if?(argc?!=?1)?return?usage();??
  • ????????do_cmd(ttype,?serial,?"shell",?"bugreport",?0);??
  • ????????return?0;??
  • ????}??
  • ??
  • ????/*?adb_command()?wrapper?commands?*/??
  • ??
  • ????if(!strncmp(argv[0],?"wait-for-",?strlen("wait-for-")))?{??
  • ????????char*?service?=?argv[0];??
  • ????????if?(!strncmp(service,?"wait-for-device",?strlen("wait-for-device")))?{??
  • ????????????if?(ttype?==?kTransportUsb)?{??
  • ????????????????service?=?"wait-for-usb";??
  • ????????????}?else?if?(ttype?==?kTransportLocal)?{??
  • ????????????????service?=?"wait-for-local";??
  • ????????????}?else?{??
  • ????????????????service?=?"wait-for-any";??
  • ????????????}??
  • ????????}??
  • ??
  • ????????format_host_command(buf,?sizeof?buf,?service,?ttype,?serial);??
  • ??
  • ????????if?(adb_command(buf))?{??
  • ????????????D("failure:?%s?*\n",adb_error());??
  • ????????????fprintf(stderr,"error:?%s\n",?adb_error());??
  • ????????????return?1;??
  • ????????}??
  • ??
  • ????????/*?Allow?a?command?to?be?run?after?wait-for-device,?
  • ????????????*?e.g.?'adb?wait-for-device?shell'.?
  • ????????????*/??
  • ????????if(argc?>?1)?{??
  • ????????????argc--;??
  • ????????????argv++;??
  • ????????????goto?top;??
  • ????????}??
  • ????????return?0;??
  • ????}??
  • ??
  • ????if(!strcmp(argv[0],?"forward"))?{??
  • ????????if(argc?!=?3)?return?usage();??
  • ????????if?(serial)?{??
  • ????????????snprintf(buf,?sizeof?buf,?"host-serial:%s:forward:%s;%s",serial,?argv[1],?argv[2]);??
  • ????????}?else?if?(ttype?==?kTransportUsb)?{??
  • ????????????snprintf(buf,?sizeof?buf,?"host-usb:forward:%s;%s",?argv[1],?argv[2]);??
  • ????????}?else?if?(ttype?==?kTransportLocal)?{??
  • ????????????snprintf(buf,?sizeof?buf,?"host-local:forward:%s;%s",?argv[1],?argv[2]);??
  • ????????}?else?{??
  • ????????????snprintf(buf,?sizeof?buf,?"host:forward:%s;%s",?argv[1],?argv[2]);??
  • ????????}??
  • ????????if(adb_command(buf))?{??
  • ????????????fprintf(stderr,"error:?%s\n",?adb_error());??
  • ????????????return?1;??
  • ????????}??
  • ????????return?0;??
  • ????}??
  • ??
  • ????/*?do_sync_*()?commands?*/??
  • ??
  • ????if(!strcmp(argv[0],?"ls"))?{??
  • ????????if(argc?!=?2)?return?usage();??
  • ????????return?do_sync_ls(argv[1]);??
  • ????}??
  • ??
  • ????if(!strcmp(argv[0],?"push"))?{??
  • ????????if(argc?!=?3)?return?usage();??
  • ????????return?do_sync_push(argv[1],?argv[2],?0?/*?no?verify?APK?*/);??
  • ????}??
  • ??
  • ????if(!strcmp(argv[0],?"pull"))?{??
  • ????????if?(argc?==?2)?{??
  • ????????????return?do_sync_pull(argv[1],?".");??
  • ????????}?else?if?(argc?==?3)?{??
  • ????????????return?do_sync_pull(argv[1],?argv[2]);??
  • ????????}?else?{??
  • ????????????return?usage();??
  • ????????}??
  • ????}??
  • ??
  • ????if(!strcmp(argv[0],?"install"))?{??
  • ????????if?(argc?<?2)?return?usage();??
  • ????????return?install_app(ttype,?serial,?argc,?argv);??
  • ????}??
  • ??
  • ????if(!strcmp(argv[0],?"uninstall"))?{??
  • ????????if?(argc?<?2)?return?usage();??
  • ????????return?uninstall_app(ttype,?serial,?argc,?argv);??
  • ????}??
  • ??
  • ????if(!strcmp(argv[0],?"sync"))?{??
  • ????????char?*srcarg,?*android_srcpath,?*data_srcpath;??
  • ????????int?listonly?=?0;??
  • ??
  • ????????int?ret;??
  • ????????if(argc?<?2)?{??
  • ????????????/*?No?local?path?was?specified.?*/??
  • ????????????srcarg?=?NULL;??
  • ????????}?else?if?(argc?>=?2?&&?strcmp(argv[1],?"-l")?==?0)?{??
  • ????????????listonly?=?1;??
  • ????????????if?(argc?==?3)?{??
  • ????????????????srcarg?=?argv[2];??
  • ????????????}?else?{??
  • ????????????????srcarg?=?NULL;??
  • ????????????}??
  • ????????}?else?if(argc?==?2)?{??
  • ????????????/*?A?local?path?or?"android"/"data"?arg?was?specified.?*/??
  • ????????????srcarg?=?argv[1];??
  • ????????}?else?{??
  • ????????????return?usage();??
  • ????????}??
  • ????????ret?=?find_sync_dirs(srcarg,?&android_srcpath,?&data_srcpath);??
  • ????????if(ret?!=?0)?return?usage();??
  • ??
  • ????????if(android_srcpath?!=?NULL)??
  • ????????????ret?=?do_sync_sync(android_srcpath,?"/system",?listonly);??
  • ????????if(ret?==?0?&&?data_srcpath?!=?NULL)??
  • ????????????ret?=?do_sync_sync(data_srcpath,?"/data",?listonly);??
  • ??
  • ????????free(android_srcpath);??
  • ????????free(data_srcpath);??
  • ????????return?ret;??
  • ????}??
  • ??
  • ????/*?passthrough?commands?*/??
  • ??
  • ????if(!strcmp(argv[0],"get-state")?||??
  • ????????!strcmp(argv[0],"get-serialno")?||??
  • ????????!strcmp(argv[0],"get-devpath"))??
  • ????{??
  • ????????char?*tmp;??
  • ??
  • ????????format_host_command(buf,?sizeof?buf,?argv[0],?ttype,?serial);??
  • ????????tmp?=?adb_query(buf);??
  • ????????if(tmp)?{??
  • ????????????printf("%s\n",?tmp);??
  • ????????????return?0;??
  • ????????}?else?{??
  • ????????????return?1;??
  • ????????}??
  • ????}??
  • ??
  • ????/*?other?commands?*/??
  • ??
  • ????if(!strcmp(argv[0],"status-window"))?{??
  • ????????status_window(ttype,?serial);??
  • ????????return?0;??
  • ????}??
  • ??
  • ????if(!strcmp(argv[0],"logcat")?||?!strcmp(argv[0],"lolcat")?||?!strcmp(argv[0],"longcat"))?{??
  • ????????return?logcat(ttype,?serial,?argc,?argv);??
  • ????}??
  • ??
  • ????if(!strcmp(argv[0],"ppp"))?{??
  • ????????return?ppp(argc,?argv);??
  • ????}??
  • ??
  • ????if?(!strcmp(argv[0],?"start-server"))?{??
  • ????????return?adb_connect("host:start-server");??
  • ????}??
  • ??
  • ????if?(!strcmp(argv[0],?"backup"))?{??
  • ????????return?backup(argc,?argv);??
  • ????}??
  • ??
  • ????if?(!strcmp(argv[0],?"restore"))?{??
  • ????????return?restore(argc,?argv);??
  • ????}??
  • ??
  • ????if?(!strcmp(argv[0],?"jdwp"))?{??
  • ????????int??fd?=?adb_connect("jdwp");??
  • ????????if?(fd?>=?0)?{??
  • ????????????read_and_dump(fd);??
  • ????????????adb_close(fd);??
  • ????????????return?0;??
  • ????????}?else?{??
  • ????????????fprintf(stderr,?"error:?%s\n",?adb_error());??
  • ????????????return?-1;??
  • ????????}??
  • ????}??
  • ??
  • ????/*?"adb?/?"?is?a?common?idiom?under?Windows?*/??
  • ????if(!strcmp(argv[0],?"help")?||?!strcmp(argv[0],?"/?"))?{??
  • ????????help();??
  • ????????return?0;??
  • ????}??
  • ??
  • ????if(!strcmp(argv[0],?"version"))?{??
  • ????????version(stdout);??
  • ????????return?0;??
  • ????}??
  • ??
  • ????usage();??
  • ????return?1;??
  • }??

  • 它的代碼有點長,但可以很容易看明白它根據命令的參數執行不同的功能。adb程序可能以服務的方式或命令行客戶端的方式運行。

    ----------

    以上就是main()函數的執行過程,后續將分析其中的細節內容。

    轉載于:https://www.cnblogs.com/wanghuaijun/p/8490343.html

    總結

    以上是生活随笔為你收集整理的android adb源码分析(1)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。