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在两者之间起到了一个桥梁的作用。
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在两者之间起到了一个桥梁的作用。