adbd工作原理

adbd工作原理

    adbd运行在手机端,我们在调试应用程序时负责Java虚拟机与PC端adb server之间的通信。

    adbd启动后,它会创建一个unix套接字@vm-debug-control,当一个新的JDWP(Java Debug Wire Protocol)守护线程在一个虚拟机进程中运行后,JDWP守护线程会和@vm-debug-control创建一个连接声明它的存在(如下图所示)。

     JDWP thread                             @vm-debug-control
         |                                         |
         |------------------------------->         |
         | hello I'm in process <pid>              |
         |                                         |
         |                                         |

这个连接是kept alive的。当进程被结束(terminate)时,这个连接也会被结束(close),这样adbd就能检测已经死掉(dead)的进程。

    adbd会维护一个活动的JDWP进程链表,它可以通过"device:debug-ports"服务发送或更新自己的内容给客户端。

    当一个调试器试图连接时,只需要运行"adb forward tcp:<hostport> jdwp:<pid>"命令即可。"jdwp:<pid>"是转送目标的地址,即在设备上需要调试的虚拟机进程。当一个连接请求到来时,adbd做了如下的工作:
    1.调用socketpair()函数创建一对回应的套接字。
    2.使用创建的那一对套接字中的第1个套接字,用这个套接字连接远程的套接字。
    3.使用创建的那一对套接字中的第2个套接字,用这个套接字直接和要调试进程中的JDWP线程通信(使用sendmsg()函数),发送文件描述符(file descriptor)。

     JDWP thread                             @vm-debug-control
         |                                         |
         |                  <----------------------|
         |           OK, try this file descriptor  |
         |                                         |
         |                                         |

然后,JDWP线程用这个新建的套接字描述符(socket descriptor),连接到调试器(debugger),然后进行握手、应答等操作。整个过程如下图所示:
                    ____________________________________
                   |                                    |
                   |          ADB Server (host)         |
                   |                                    |
        Debugger <---> LocalSocket <----> RemoteSocket  |
                   |                           ^^       |
                   |___________________________||_______|
                                               ||
                                     Transport ||
           (TCP for emulator - USB for device) ||
                                               ||
                    ___________________________||_______
                   |                           ||       |
                   |          ADBD  (device)   ||       |
                   |                           VV       |
         JDWP <======> LocalSocket <----> RemoteSocket  |
                   |                                    |
                   |____________________________________|

    根据adb的工作方式,调试器和JDWP进程都不需要特殊的方式来建立和关闭连接。adbd和adb server在两者之间起到了一个桥梁的作用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值