本文转载自:http://blog.csdn.net/xgbing/article/details/52096880

本篇以“adb devices"命令为例,跟踪代码的执行流程。

(1) main()->
(2)adb_commandline()->
adb_commandline()中的相关源码:

  1. if(!strcmp(argv[0], "devices")) {
  2. char *tmp;
  3. char *listopt;
  4. if (argc < 2)
  5. listopt = "";
  6. else if (argc == 2 && !strcmp(argv[1], "-l"))
  7. listopt = argv[1];
  8. else {
  9. fprintf(stderr, "Usage: adb devices [-l]\n");
  10. return 1;
  11. }
  12. snprintf(buf, sizeof buf, "host:%s%s", argv[0], listopt);
  13. tmp = adb_query(buf); //传递的buf=”host:devices”
  14. if(tmp) { //命令执行成功,打印出信息
  15. printf("List of devices attached \n");
  16. printf("%s\n", tmp);
  17. return 0;
  18. } else {///失败
  19. return 1;
  20. }
  21. }

(3) adb_query():adb_query: host:devices ->

  1. char *adb_query(const char *service) //函数返回设备信息字符串
  2. {
  3. char buf[5];
  4. unsigned n;
  5. char *tmp;
  6. D("adb_query: %s\n", service);
  7. int fd = adb_connect(service);  //连接adbserver,返回fd
  8. if(fd < 0) {
  9. fprintf(stderr,"error: %s\n", __adb_error);
  10. return 0;
  11. }
  12. if(readx(fd, buf, 4)) goto oops;   //读取数据长度,如果失败则返回错误
  13. buf[4] = 0;
  14. n = strtoul(buf, 0, 16);      //转换成数值
  15. if(n > 1024) goto oops;
  16. tmp = malloc(n + 1);     //申请空间
  17. if(tmp == 0) goto oops;
  18. if(readx(fd, tmp, n) == 0) {   //读取信息并返回
  19. tmp[n] = 0;
  20. adb_close(fd);
  21. return tmp;
  22. }
  23. free(tmp);
  24. oops:
  25. adb_close(fd);
  26. return 0;
  27. }

(4) adb_connect()->
这个函数的作用是连接adb server,如果adb server没有启动则先启动它。

  1. int adb_connect(const char *service)
  2. {
  3. // first query the adb server's version
  4. int fd = _adb_connect("host:version");  //查询adb server的版本信息,用来判断它是否启动。
  5. D("adb_connect: service %s\n", service);
  6. if(fd == -2) { //查询不到adb server
  7. fprintf(stdout,"* daemon not running. starting it now on port %d *\n",
  8. __adb_server_port);
  9. start_server: //启动adb server
  10. if(launch_server(__adb_server_port)) { //启动adb server失败
  11. fprintf(stderr,"* failed to start daemon *\n");
  12. return -1;
  13. } else {
  14. fprintf(stdout,"* daemon started successfully *\n");
  15. }
  16. /* give the server some time to start properly and detect devices */
  17. adb_sleep_ms(3000);
  18. // fall through to _adb_connect
  19. } else {//查询到adb server版本信息,说明adb server 已经启动
  20. // if server was running, check its version to make sure it is not out of date
  21. char buf[100];
  22. int n;
  23. int version = ADB_SERVER_VERSION - 1;
  24. // if we have a file descriptor, then parse version result
  25. if(fd >= 0) {
  26. if(readx(fd, buf, 4)) goto error; //读取版本信息的长度
  27. buf[4] = 0;
  28. n = strtoul(buf, 0, 16);
  29. if(n > (int)sizeof(buf)) goto error;
  30. if(readx(fd, buf, n)) goto error;//读取版本信息
  31. adb_close(fd);
  32. if (sscanf(buf, "%04x", &version) != 1) goto error;//转换字符串的版本为数值型
  33. } else { //fd返回的值表示adb server可能不支持读取版本信息
  34. // if fd is -1, then check for "unknown host service",
  35. // which would indicate a version of adb that does not support the version command
  36. if (strcmp(__adb_error, "unknown host service") != 0)
  37. return fd;  //返回错误。
  38. }
  39. if(version != ADB_SERVER_VERSION) {
  40. printf("adb server is out of date.  killing...\n");
  41. fd = _adb_connect("host:kill");
  42. adb_close(fd);
  43. /* XXX can we better detect its death? */
  44. adb_sleep_ms(2000);
  45. goto start_server; //版本信息过期则关闭adb server并重新启动。
  46. }
  47. }
  48. // if the command is start-server, we are done.
  49. if (!strcmp(service, "host:start-server"))  //如果命令是start-server,执行到这就可以了
  50. return 0;
  51. //下面的代码连接adb server并返回fd。
  52. fd = _adb_connect(service); //连接adb server 并返回fd。
  53. if(fd == -2) {
  54. fprintf(stderr,"** daemon still not running");
  55. }
  56. D("adb_connect: return fd %d\n", fd);
  57. return fd;
  58. error:
  59. adb_close(fd);
  60. return -1;
  61. }

(5) launch_server()

  1. #if ADB_HOST
  2. int launch_server(int server_port)
  3. {
  4. #ifdef HAVE_WIN32_PROC
  5. /* we need to start the server in the background                    */
  6. /* we create a PIPE that will be used to wait for the server's "OK" */
  7. /* message since the pipe handles must be inheritable, we use a     */
  8. /* security attribute                                               */
  9. HANDLE                pipe_read, pipe_write;
  10. SECURITY_ATTRIBUTES   sa;
  11. STARTUPINFO           startup;
  12. PROCESS_INFORMATION   pinfo;
  13. char                  program_path[ MAX_PATH ];
  14. int                   ret;
  15. sa.nLength = sizeof(sa);
  16. sa.lpSecurityDescriptor = NULL;
  17. sa.bInheritHandle = TRUE;
  18. /* create pipe, and ensure its read handle isn't inheritable */
  19. ret = CreatePipe( &pipe_read, &pipe_write, &sa, 0 );
  20. if (!ret) {
  21. fprintf(stderr, "CreatePipe() failure, error %ld\n", GetLastError() );
  22. return -1;
  23. }
  24. SetHandleInformation( pipe_read, HANDLE_FLAG_INHERIT, 0 );
  25. ZeroMemory( &startup, sizeof(startup) );
  26. startup.cb = sizeof(startup);
  27. startup.hStdInput  = GetStdHandle( STD_INPUT_HANDLE );
  28. startup.hStdOutput = pipe_write;
  29. startup.hStdError  = GetStdHandle( STD_ERROR_HANDLE );
  30. startup.dwFlags    = STARTF_USESTDHANDLES;
  31. ZeroMemory( &pinfo, sizeof(pinfo) );
  32. /* get path of current program */
  33. GetModuleFileName( NULL, program_path, sizeof(program_path) );
  34. //创建进程“adb fork-server server”,并把startup信息传给新进程。
  35. ret = CreateProcess(
  36. program_path,                              /* program path  */
  37. "adb fork-server server",
  38. /* the fork-server argument will set the
  39. debug = 2 in the child           */
  40. NULL,                   /* process handle is not inheritable */
  41. NULL,                    /* thread handle is not inheritable */
  42. TRUE,                          /* yes, inherit some handles */
  43. DETACHED_PROCESS, /* the new process doesn't have a console */
  44. NULL,                     /* use parent's environment block */
  45. NULL,                    /* use parent's starting directory */
  46. &startup,                 /* startup info, i.e. std handles */
  47. &pinfo );
  48. CloseHandle( pipe_write );
  49. if (!ret) {
  50. fprintf(stderr, "CreateProcess failure, error %ld\n", GetLastError() );
  51. CloseHandle( pipe_read );
  52. return -1;
  53. }
  54. CloseHandle( pinfo.hProcess );
  55. CloseHandle( pinfo.hThread );
  56. /* wait for the "OK\n" message */
  57. {
  58. char  temp[3];
  59. DWORD  count;
  60. //等待新进程发送“OK”到pipe_read管道。
  61. ret = ReadFile( pipe_read, temp, 3, &count, NULL );
  62. CloseHandle( pipe_read );
  63. if ( !ret ) {
  64. fprintf(stderr, "could not read ok from ADB Server, error = %ld\n", GetLastError() );
  65. return -1;
  66. }
  67. if (count != 3 || temp[0] != 'O' || temp[1] != 'K' || temp[2] != '\n') {
  68. fprintf(stderr, "ADB server didn't ACK\n" );
  69. return -1;
  70. }
  71. }
  72. #elif defined(HAVE_FORKEXEC)
  73. char    path[PATH_MAX];
  74. int     fd[2];
  75. // set up a pipe so the child can tell us when it is ready.
  76. // fd[0] will be parent's end, and fd[1] will get mapped to stderr in the child.
  77. if (pipe(fd)) {
  78. fprintf(stderr, "pipe failed in launch_server, errno: %d\n", errno);
  79. return -1;
  80. }
  81. get_my_path(path, PATH_MAX);
  82. pid_t pid = fork();
  83. if(pid < 0) return -1;
  84. if (pid == 0) {  //下面的代码在子进程中运行
  85. // child side of the fork
  86. // redirect stderr to the pipe
  87. // we use stderr instead of stdout due to stdout's buffering behavior.
  88. adb_close(fd[0]);
  89. dup2(fd[1], STDERR_FILENO);  //重定向新进程的错误信息给fd[1]
  90. adb_close(fd[1]);
  91. // child process 运行”adb fok-server server”程序。
  92. int result = execl(path, "adb", "fork-server", "server", NULL);
  93. // this should not return
  94. fprintf(stderr, "OOPS! execl returned %d, errno: %d\n", result, errno);
  95. } else  {//下面的代码还是在这个进程中执行
  96. // parent side of the fork
  97. char  temp[3];
  98. temp[0] = 'A'; temp[1] = 'B'; temp[2] = 'C';
  99. // wait for the "OK\n" message
  100. adb_close(fd[1]);
  101. int ret = adb_read(fd[0], temp, 3); //等待新进程发送“OK”字符串。
  102. int saved_errno = errno;
  103. adb_close(fd[0]);
  104. if (ret < 0) {
  105. fprintf(stderr, "could not read ok from ADB Server, errno = %d\n", saved_errno);
  106. return -1;
  107. }
  108. if (ret != 3 || temp[0] != 'O' || temp[1] != 'K' || temp[2] != '\n') {//接收字符错误。
  109. fprintf(stderr, "ADB server didn't ACK\n" );
  110. return -1;
  111. }
  112. setsid();
  113. }
  114. #else
  115. #error "cannot implement background server start on this platform"
  116. #endif
  117. return 0;
  118. }
  119. #endif

再来看看”adb fork-server server”的运行。
(1)    main()->adb_commandline();

  1. /* modifiers and flags */
  2. while(argc > 0) {
  3. if(!strcmp(argv[0],"server")) {
  4. is_server = 1;
  5. } else if(!strcmp(argv[0],"nodaemon")) {
  6. no_daemon = 1;
  7. } else if (!strcmp(argv[0], "fork-server")) {
  8. /* this is a special flag used only when the ADB client launches the ADB Server */
  9. is_daemon = 1;
  10. } else if(!strcmp(argv[0],"persist")) {
  11. persist = 1;
  12. } else if(!strncmp(argv[0], "-p", 2)) {
  13. const char *product = NULL;
  14. if (argv[0][2] == '\0') {
  15. if (argc < 2) return usage();
  16. product = argv[1];
  17. argc--;
  18. argv++;
  19. } else {
  20. product = argv[0] + 2;
  21. }
  22. gProductOutPath = find_product_out_path(product);
  23. if (gProductOutPath == NULL) {
  24. fprintf(stderr, "adb: could not resolve \"-p %s\"\n",
  25. product);
  26. return usage();
  27. }
  28. } else if (argv[0][0]=='-' && argv[0][1]=='s') {
  29. if (isdigit(argv[0][2])) {
  30. serial = argv[0] + 2;
  31. } else {
  32. if(argc < 2 || argv[0][2] != '\0') return usage();
  33. serial = argv[1];
  34. argc--;
  35. argv++;
  36. }
  37. } else if (!strcmp(argv[0],"-d")) {
  38. ttype = kTransportUsb;
  39. } else if (!strcmp(argv[0],"-e")) {
  40. ttype = kTransportLocal;
  41. } else {
  42. /* out of recognized modifiers and flags */
  43. break;
  44. }
  45. argc--;
  46. argv++;
  47. }
  48. adb_set_transport(ttype, serial);
  49. adb_set_tcp_specifics(server_port);
  50. if (is_server) {
  51. if (no_daemon || is_daemon) {
  52. r = adb_main(is_daemon, server_port);
  53. } else {
  54. r = launch_server(server_port);
  55. }
  56. if(r) {
  57. fprintf(stderr,"* could not start server *\n");
  58. }
  59. return r;
  60. }

这里将is_daemon和is_server都置为1,并调用adb_main(1, 5037);

(2)    adb_main()

  1. int adb_main(int is_daemon, int server_port)
  2. {
  3. #if ADB_HOST
  4. HOST = 1;
  5. usb_vendors_init();
  6. usb_init();  //监听USB端口数据
  7. local_init(DEFAULT_ADB_LOCAL_TRANSPORT_PORT); //初始化建立5555网口信道
  8. adb_auth_init();
  9. char local_name[30];
  10. build_local_name(local_name, sizeof(local_name), server_port); //监听5037端口
  11. if(install_listener(local_name, "*smartsocket*", NULL)) {
  12. exit(1);
  13. }
  14. #else
  15. #endif
  16. if (is_daemon)
  17. {
  18. // inform our parent that we are up and running.
  19. //发送“OK”给父进程
  20. #ifdef HAVE_WIN32_PROC
  21. DWORD  count;
  22. WriteFile( GetStdHandle( STD_OUTPUT_HANDLE ), "OK\n", 3, &count, NULL );
  23. #elif defined(HAVE_FORKEXEC)
  24. fprintf(stderr, "OK\n");
  25. #endif
  26. start_logging();
  27. }
  28. D("Event loop starting\n");
  29. fdevent_loop();
  30. usb_cleanup();
  31. return 0;
  32. }

(3)    usb_linux.c中的usb_init()

  1. void usb_init()
  2. {
  3. adb_thread_t tid;
  4. struct sigaction    actions;
  5. memset(&actions, 0, sizeof(actions));
  6. sigemptyset(&actions.sa_mask);
  7. actions.sa_flags = 0;
  8. actions.sa_handler = sigalrm_handler;
  9. sigaction(SIGALRM,& actions, NULL);
  10. if(adb_thread_create(&tid, device_poll_thread, NULL)){
  11. fatal_errno("cannot create input thread");
  12. }
  13. }
  14. void* device_poll_thread(void* unused)
  15. {
  16. D("Created device thread\n");
  17. for(;;) {
  18. /* XXX use inotify */
  19. find_usb_device("/dev/bus/usb", register_device);
  20. kick_disconnected_devices();
  21. sleep(1);
  22. }
  23. return NULL;
  24. }

在register_device()函数中最终会调用register_usb_transport()。

(4)    install_listener(local_name, "*smartsocket*", NULL)

  1. if(!strcmp(l->connect_to, "*smartsocket*")) {
  2. fdevent_install(&l->fde, l->fd, ss_listener_event_func, l);
  3. } else {
  4. fdevent_install(&l->fde, l->fd, listener_event_func, l);
  5. }
  6. fdevent_set(&l->fde, FDE_READ);

(5)    ss_listener_event_func分析

  1. static void ss_listener_event_func(int _fd, unsigned ev, void *_l)
  2. {
  3. asocket *s;
  4. if(ev & FDE_READ) {
  5. struct sockaddr addr;
  6. socklen_t alen;
  7. int fd;
  8. alen = sizeof(addr);
  9. fd = adb_socket_accept(_fd, &addr, &alen);  //接受客户端的连接
  10. if(fd < 0) return;
  11. adb_socket_setbufsize(fd, CHUNK_SIZE);
  12. s = create_local_socket(fd);
  13. if(s) {
  14. connect_to_smartsocket(s);
  15. return;
  16. }
  17. adb_close(fd);
  18. }
  19. }

(6)    执行connect_to_smartsocket(s)

  1. void connect_to_smartsocket(asocket *s)
  2. {
  3. D("Connecting to smart socket \n");
  4. asocket *ss = create_smart_socket(smart_socket_action);
  5. s->peer = ss;
  6. ss->peer = s;
  7. s->ready(s);
  8. }

(7)    执行create_smart_socket

  1. static int smart_socket_enqueue(asocket *s, apacket *p)
  2. {
  3. unsigned len;
  4. #if ADB_HOST
  5. char *service = NULL;
  6. char* serial = NULL;
  7. transport_type ttype = kTransportAny;
  8. #endif
  9. D("SS(%d): enqueue %d\n", s->id, p->len);
  10. if(s->pkt_first == 0) {
  11. s->pkt_first = p;
  12. s->pkt_last = p;
  13. } else {
  14. if((s->pkt_first->len + p->len) > MAX_PAYLOAD) {
  15. D("SS(%d): overflow\n", s->id);
  16. put_apacket(p);
  17. goto fail;
  18. }
  19. memcpy(s->pkt_first->data + s->pkt_first->len,
  20. p->data, p->len);
  21. s->pkt_first->len += p->len;
  22. put_apacket(p);
  23. p = s->pkt_first;
  24. }
  25. /* don't bother if we can't decode the length */
  26. if(p->len < 4) return 0;
  27. len = unhex(p->data, 4);
  28. if((len < 1) ||  (len > 1024)) {
  29. D("SS(%d): bad size (%d)\n", s->id, len);
  30. goto fail;
  31. }
  32. D("SS(%d): len is %d\n", s->id, len );
  33. /* can't do anything until we have the full header */
  34. if((len + 4) > p->len) {
  35. D("SS(%d): waiting for %d more bytes\n", s->id, len+4 - p->len);
  36. return 0;
  37. }
  38. p->data[len + 4] = 0;
  39. D("SS(%d): '%s'\n", s->id, (char*) (p->data + 4));
  40. #if ADB_HOST
  41. service = (char *)p->data + 4;
  42. if(!strncmp(service, "host-serial:", strlen("host-serial:"))) {
  43. char* serial_end;
  44. service += strlen("host-serial:");
  45. // serial number should follow "host:" and could be a host:port string.
  46. serial_end = skip_host_serial(service);
  47. if (serial_end) {
  48. *serial_end = 0; // terminate string
  49. serial = service;
  50. service = serial_end + 1;
  51. }
  52. } else if (!strncmp(service, "host-usb:", strlen("host-usb:"))) {
  53. ttype = kTransportUsb;
  54. service += strlen("host-usb:");
  55. } else if (!strncmp(service, "host-local:", strlen("host-local:"))) {
  56. ttype = kTransportLocal;
  57. service += strlen("host-local:");
  58. } else if (!strncmp(service, "host:", strlen("host:"))) {
  59. ttype = kTransportAny;
  60. service += strlen("host:");
  61. } else {
  62. service = NULL;
  63. }
  64. if (service) {
  65. asocket *s2;
  66. /* some requests are handled immediately -- in that
  67. ** case the handle_host_request() routine has sent
  68. ** the OKAY or FAIL message and all we have to do
  69. ** is clean up.
  70. */
  71. if(handle_host_request(service, ttype, serial, s->peer->fd, s) == 0) {
  72. /* XXX fail message? */
  73. D( "SS(%d): handled host service '%s'\n", s->id, service );
  74. goto fail;
  75. }
  76. if (!strncmp(service, "transport", strlen("transport"))) {
  77. D( "SS(%d): okay transport\n", s->id );
  78. p->len = 0;
  79. return 0;
  80. }
  81. /* try to find a local service with this name.
  82. ** if no such service exists, we'll fail out
  83. ** and tear down here.
  84. */
  85. s2 = create_host_service_socket(service, serial);
  86. if(s2 == 0) {
  87. D( "SS(%d): couldn't create host service '%s'\n", s->id, service );
  88. sendfailmsg(s->peer->fd, "unknown host service");
  89. goto fail;
  90. }
  91. /* we've connected to a local host service,
  92. ** so we make our peer back into a regular
  93. ** local socket and bind it to the new local
  94. ** service socket, acknowledge the successful
  95. ** connection, and close this smart socket now
  96. ** that its work is done.
  97. */
  98. adb_write(s->peer->fd, "OKAY", 4);
  99. s->peer->ready = local_socket_ready;
  100. s->peer->close = local_socket_close;
  101. s->peer->peer = s2;
  102. s2->peer = s->peer;
  103. s->peer = 0;
  104. D( "SS(%d): okay\n", s->id );
  105. s->close(s);
  106. /* initial state is "ready" */
  107. s2->ready(s2);
  108. return 0;
  109. }
  110. #else /* !ADB_HOST */
  111. if (s->transport == NULL) {
  112. char* error_string = "unknown failure";
  113. s->transport = acquire_one_transport (CS_ANY,
  114. kTransportAny, NULL, &error_string);
  115. if (s->transport == NULL) {
  116. sendfailmsg(s->peer->fd, error_string);
  117. goto fail;
  118. }
  119. }
  120. #endif
  121. if(!(s->transport) || (s->transport->connection_state == CS_OFFLINE)) {
  122. /* if there's no remote we fail the connection
  123. ** right here and terminate it
  124. */
  125. sendfailmsg(s->peer->fd, "device offline (x)");
  126. goto fail;
  127. }
  128. /* instrument our peer to pass the success or fail
  129. ** message back once it connects or closes, then
  130. ** detach from it, request the connection, and
  131. ** tear down
  132. */
  133. s->peer->ready = local_socket_ready_notify;
  134. s->peer->close = local_socket_close_notify;
  135. s->peer->peer = 0;
  136. /* give him our transport and upref it */
  137. s->peer->transport = s->transport;
  138. connect_to_remote(s->peer, (char*) (p->data + 4));
  139. s->peer = 0;
  140. s->close(s);
  141. return 1;
  142. fail:
  143. /* we're going to close our peer as a side-effect, so
  144. ** return -1 to signal that state to the local socket
  145. ** who is enqueueing against us
  146. */
  147. s->close(s);
  148. return -1;
  149. }

(8)    执行handle_host_request

    1. int handle_host_request(char *service, transport_type ttype, char* serial, int reply_fd, asocket *s)
    2. {
    3. // return a list of all connected devices
    4. if (!strncmp(service, "devices", 7)) {   //执行adb devices,返回结果
    5. char buffer[4096];
    6. int use_long = !strcmp(service+7, "-l");
    7. if (use_long || service[7] == 0) {
    8. memset(buf, 0, sizeof(buf));
    9. memset(buffer, 0, sizeof(buffer));
    10. D("Getting device list \n");
    11. list_transports(buffer, sizeof(buffer), use_long);
    12. snprintf(buf, sizeof(buf), "OKAY%04x%s",(unsigned)strlen(buffer),buffer);
    13. D("Wrote device list \n");
    14. writex(reply_fd, buf, strlen(buf));
    15. return 0;
    16. }
    17. }
    18. }

最新文章

  1. Swift设置textView的行间距
  2. ubuntu samba server 配置多用户访问
  3. Lintcode Perfect Squares
  4. ecshop简单三部实现导航分类二级菜单
  5. Entity Framework 泛型使用
  6. 【转】Android 基于google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果--不错
  7. 在Sublime Text3中运行PHP代码
  8. C#webbrowser控件技巧(取得javascript变量值,禁止显示脚本错误)
  9. 使用Maven的assembly插件实现自定义打包
  10. [Swift]LeetCode636. 函数的独占时间 | Exclusive Time of Functions
  11. (转)你应该知道的RPC原理
  12. leetcode 421.Maximum XOR of Two Numbers in an Array
  13. js检测输入域的值是否变化
  14. day 31 进程的其他方法 进程锁 进程队列
  15. Java基础-String和StringBuilder类型(11)
  16. [Bash] Create Aliases in .bash_profile for Common Bash Commands
  17. 如何监控ActiveMQ
  18. Axis2 WebService(配置、发布、调用)
  19. python调用html内的js方法
  20. 命令行 -- 命令&quot;%cd%&quot;

热门文章

  1. response.setHeader参数、用法的介绍
  2. Contest Hunter #46 T1 磁力块 [分块]
  3. ASP.NET里创建Microsoft Word文档
  4. Chrome V8系列--浅析Chrome V8引擎中的垃圾回收机制和内存泄露优化策略
  5. 在C#中使用Json.Net进行序列化和反序列化及定制化
  6. XCTFreverse第一道DMD
  7. Linux最常用的命名
  8. struts2_13_OGNL表达式
  9. HDU 1242 rescue (优先队列模板题)
  10. 【前端】怎样成长为一名优秀的前端project师---