简单理一下adb,adbserver,jdwp 之间的关系、角色与相关协议

|    上位机     | USB/TCP |   下位机      |

adb <-> adbserver <-JDWP-> Adbd <-JDWP-> VM

JDWP Server

当启动adbd时,它会创建UnixServerSocket ,命名为 @ vm-debug-control(@是“第一字节为0”的简写,用于以私有命名空间代替文件系统)

当一个新的JDWP守护线程(c层pthrerad,线程入口函数jdwpThreadStart())在新的虚拟机进程种启动时,他会创建一个链接到@ vm-debug-control来通知服务自己处于激活状态

JDWP thread                             @vm-debug-control   (\0jdwp-control)//只是不被文件系统所现实出来的技巧?

|                                         |

|------------------------------->         |

| hello I'm in process <pid>              |

|                                         |

|                                         |

保持长连接。当JDWP进程结束时,会自动关闭(adbd也通过这种方式得知进程的死亡)

Adbd因此原理维护了一个“active”(活动的) JDWP 进程列表。他能发送内容信息通过“device:debug-prots”服务到客户端,

或者通过”device:track-debug-ports” 服务来更新。

当调试器想要链接时,会运行类似“adb forward tcp:<hostprot> jdwp:<pid>”的命令

(由host端的ADBServer和device端的ADBD通信后,)

“jdwp:<pid>” 是告诉设备需要转发目标JDWP进程到目的的新转发。当这样的请求到来时,adbd会做这样的操作流程

-首先,调用socketpair() 创建对等的socket对

-它将配对中的第一个套接字链接到本地套接字,而本地套接字又链接到远程套接字

-它发送第二个socket的文件描述符直接通过sendmsg()发送给JDWP进程

JDWP thread                             @vm-debug-control

|                                         |

|                  <----------------------|

|           OK, try this file descriptor  |

|                                         |

|                                         |

然后,JDWP线程使用这个新的socket描述符做为它链接到调试器的通道(例如,并且通过它接受JDWP握手消息,并用它应答)

流程图:

____________________________________

88                    |                                    |

89                    |          ADB Server (host)         |

90                    |                                    |

91         Debugger <---> LocalSocket <----> RemoteSocket  |

92                    |                           ^^       |

93                    |___________________________||_______|

94                                                ||

95                                      Transport ||

96            (TCP for emulator - USB for device) ||

97                                                ||

98                     ___________________________||_______

99                    |                           ||       |

100                   |          ADBD  (device)   ||       |

101                   |                           VV       |

102         JDWP <======> LocalSocket <----> RemoteSocket  |

103                   |                                    |

104                   |____________________________________|

由于adb的工作方式,这并不需要特别的socket类型或者当socket终止时或者调试器或者JDWP进程关闭链接时要做什么复杂的处理。

自己:这就像个交换机

1.创建 UDS socket 并监听

name of the debug control Unix socket

JDWP_CONTROL_NAME = \0jdwp-control

/dev/socket/0jdwp-control

2.对握手后的socket  fdevent_create()

fdevent_add()

并关闭serverSocket   0jdwp-control

初始化环节完成

对方是谁?

Dalvik 的 jdwp 线程(c层,在虚拟机启动时,启动的一个pthread,会先通过 /dev/socket/\0jdwp-control 和adbd 建立链接)

JDWPAdb

3.fdevent_loop() 处理socket 的命令

在一个循环里 用 select() 找出要处理的 socket fd,然后进行读写

adb <-> adbserver <-> JDWP的更多相关文章

  1. 解决小米/红米手机无法进行jdwp调试的问题

    问题描述:在逆向一个app,研究环境是一台红米2,需要使用jdwp接口,也就是ddms下面这个界面: 但神奇的是,同一台主机上,模拟器的进程可以显示在ddms界面上,红米2确一个进程都没有显示出来.c ...

  2. adb shell 杀进程以及端口占用,adbserver服务重启失败

    linux: adb shell  ps |grep  netease 杀进程: adb shell kill [PID] //杀死进程 C:\Users\chenquan>adb shell ...

  3. adb概览及协议參考

    原文:https://github.com/android/platform_system_core/blob/master/adb/OVERVIEW.TXT) Implementation note ...

  4. Adb shell 常用命令

    1. 查看IP adb shell netcfg 2. 查看挂载设备 adb devices 3. 将本地端口转发至手机端口 adb forward tcp: tcp: // PC上所有6100端口通 ...

  5. android adb 命令详解

    ADB (Android Debug Bridge)  是android SDK中的工具,需要先配置环境变量才能使用.起调试桥的作用,可以管理安卓设备.(也叫debug工具) ---------查看设 ...

  6. Android学习第一天-adb常用命令

    平时开发android应用 的时候,我们都会用到包含在Android SDK中一系列的工具,或许我们通过Eclipse去调用,又或许,我们自己通过打开终端进行手动输入并且执行,下面我们来一起学习下这些 ...

  7. Pyqt adb 获取Android手机屏幕

    adb的全称为Android Debug Bridge,就是起到调试桥的作用.adb的工作方式比较特殊,采用监听Socket TCP 5554等端口的方式让IDE和Qemu通讯,默认情况下adb会da ...

  8. [Android Tips] 25. ADB Command Note

    copy from https://github.com/operando/Android-Command-Note Android Command Note Logcat adb logcat -v ...

  9. Android adb常用指令

    Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态. 可以通过下列几种方法加入adb: 在设备上运行shell命令 通过端口转发来管理模拟器或设备 从模拟器或 ...

随机推荐

  1. MVC、MVP与MVVM架构模式

    MVC(Model View Controller): View 层是界面,Model 层是业务逻辑,Controller 层用来调度 View 层和 Model 层, 将用户界面和业务逻辑合理的组织 ...

  2. go语言设计模式之Chain Of Responsibility(责任链)

    ChainOfResponsibility.go package ChainOfResponsibility import ( "fmt" "io" " ...

  3. LeetCode解题笔记 - 3. Longest Substring Without Repeating Characters

    Given a string, find the length of the longest substring without repeating characters. Examples: Giv ...

  4. 第05组 Alpha事后诸葛亮

    组长博客链接(2分) 组长博客链接 现代软件工程 项目Postmortem 模板(27分) 设想和目标(2分) 1.我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? ...

  5. Golang 入门 : channel(通道)

    笔者在<Golang 入门 : 竞争条件>一文中介绍了 Golang 并发编程中需要面对的竞争条件.本文我们就介绍如何使用 Golang 提供的 channel(通道) 消除竞争条件. C ...

  6. C语言程序设计100例之(7):级数求和

    例7    级数求和 题目描述 已知: Sn =1+1/2+1/3+…+1/n.显然对于任意一个整数 k,当 n 足够大的时候,Sn>k. 现给出一个整数 k,要求计算出一个最小的 n,使得 S ...

  7. MQ的深入理解

    MQ的深入理解 MQ的作用: 解耦合,降低系统与系统之间的频繁改动 MQ的特点: 复杂的系统解耦合 (主系统将数据放入mq,子系统需要的时候直接从mq中取出数据)复杂链路的异步调用(将必要的链路执行完 ...

  8. go语言中map每次遍历的顺序不同-问题分析

    WHAT? 发现下面这段代码,多次运行出的结果是不一样的 mapper := make(map[int]string) mapper[1] = "1" mapper[2] = &q ...

  9. Ubuntu安装CUDA、CUDNN比较有用的网址总结

    Ubuntu安装CUDA.CUDNN比较有用的网址总结 1.tensorflow各个版本所对应的的系统要求和CUDA\CUDNN适配版本 https://tensorflow.google.cn/in ...

  10. Elasticsearch 6.x版本全文检索学习之分布式特性介绍

    1.Elasticsearch 6.x版本全文检索学习之分布式特性介绍. 1).Elasticsearch支持集群默认,是一个分布式系统,其好处主要有两个. a.增大系统容量,如内存.磁盘.使得es集 ...