生活随笔
收集整理的這篇文章主要介紹了
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??????????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??#??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)??????????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();????????????????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");??????}????????????????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);??????????}????????????????????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);??????????}????????????????????if?(setgid(AID_SHELL)?!=?0)?{??????????????exit(1);??????????}??????????if?(setuid(AID_SHELL)?!=?0)?{??????????????exit(1);??????????}????????????????????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)?{??????????????????usb_init();??????????usb?=?1;??????}????????????????????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);??????????????????local_init(port);??????}?else?if?(!usb)?{??????????????????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)??????{??????????#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;????????????????gProductOutPath?=?getenv("ANDROID_PRODUCT_OUT");??????if?(gProductOutPath?==?NULL?||?gProductOutPath[0]?==?'\0')?{??????????gProductOutPath?=?NULL;??????}????????????serial?=?getenv("ANDROID_SERIAL");????????????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();??????????}??????}????????????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"))?{??????????????????????????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?{??????????????????????????????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();??????}??????????????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?=?(**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;??????}??????????????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;??????????}????????????????????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;??????}??????????????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?????}????????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)?{??????????????????????????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)?{??????????????????????????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;??????}??????????????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;??????????}??????}??????????????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;??????????}??????}????????????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)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。