adb <-> adbserver <-> JDWP
简单理一下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()
并关闭serverSocket 0jdwp-control
初始化环节完成
对方是谁?
Dalvik 的 jdwp 线程(c层,在虚拟机启动时,启动的一个pthread,会先通过 /dev/socket/\0jdwp-control 和adbd 建立链接)
JDWPAdb
3.fdevent_loop() 处理socket 的命令
在一个循环里 用 select() 找出要处理的 socket fd,然后进行读写
adb <-> adbserver <-> JDWP的更多相关文章
- 解决小米/红米手机无法进行jdwp调试的问题
问题描述:在逆向一个app,研究环境是一台红米2,需要使用jdwp接口,也就是ddms下面这个界面: 但神奇的是,同一台主机上,模拟器的进程可以显示在ddms界面上,红米2确一个进程都没有显示出来.c ...
- adb shell 杀进程以及端口占用,adbserver服务重启失败
linux: adb shell ps |grep netease 杀进程: adb shell kill [PID] //杀死进程 C:\Users\chenquan>adb shell ...
- adb概览及协议參考
原文:https://github.com/android/platform_system_core/blob/master/adb/OVERVIEW.TXT) Implementation note ...
- Adb shell 常用命令
1. 查看IP adb shell netcfg 2. 查看挂载设备 adb devices 3. 将本地端口转发至手机端口 adb forward tcp: tcp: // PC上所有6100端口通 ...
- android adb 命令详解
ADB (Android Debug Bridge) 是android SDK中的工具,需要先配置环境变量才能使用.起调试桥的作用,可以管理安卓设备.(也叫debug工具) ---------查看设 ...
- Android学习第一天-adb常用命令
平时开发android应用 的时候,我们都会用到包含在Android SDK中一系列的工具,或许我们通过Eclipse去调用,又或许,我们自己通过打开终端进行手动输入并且执行,下面我们来一起学习下这些 ...
- Pyqt adb 获取Android手机屏幕
adb的全称为Android Debug Bridge,就是起到调试桥的作用.adb的工作方式比较特殊,采用监听Socket TCP 5554等端口的方式让IDE和Qemu通讯,默认情况下adb会da ...
- [Android Tips] 25. ADB Command Note
copy from https://github.com/operando/Android-Command-Note Android Command Note Logcat adb logcat -v ...
- Android adb常用指令
Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态. 可以通过下列几种方法加入adb: 在设备上运行shell命令 通过端口转发来管理模拟器或设备 从模拟器或 ...
随机推荐
- Redis Cluster 集群三主三从高可用环境搭建
前言 Redis 是我们目前大规模使用的缓存中间件,由于它强大高效而又便捷的功能,得到了广泛的使用. Window环境下载地址:https://github.com/tporadowski/redis ...
- 个人的一点小愚见,java有什么优点和缺点
java是一种面向对象的编程语言,优点是可移植性比较高,最初设计时就是本着一次编写到处执行设计的.可以开发各种应用程序和游戏,不过速度没有c++快,所以一般是不用java来编写应用程序和电脑游戏. j ...
- 垃圾收集器GC
(1)DefNew(串行)收集器 Serial(串行)垃圾收集器是最基本.发展历史最悠久的收集器:JDK1.3.1前是HotSpot新生代收集的唯一选择: 特点: (1) 针对新生代采用复制算法,单线 ...
- [BZOJ1042]AOI2008]硬币购物
题目描述 Description 硬币购物一共有4种硬币.面值分别为\(c_1\) ,\(c_2\) ,\(c_3\) ,\(c_4\) .某人去商店买东西,去了\(tot\) 次.每次带\(d_i\ ...
- python奇闻杂技
第一天 01 从计算机到程序设计语言 02 python环境配置 03 实例一:温度转换 04 python语法分析 第二天 01 深入理解python语言 02 实例二,python蟒蛇配置 03 ...
- java之位运算符
整型转二进制:Integer.toBInaryString(6) <<:左移,3<<2 = 3*2*2 = 12 >>:右移,3>>1 = 3/2 = ...
- python接口自动化11-pytest入门
前言 pytest是一个非常成熟的全功能的Python测试框架,适合从简单的单元到复杂的功能测试,主要特点有以下几点: 简单灵活,容易上手: 支持参数化: 能够支持简单的单元测试: 标记测试功能与属性 ...
- 踩过了这些坑,你真的懂python基础吗?
一.浮点数的计算 思考1:打印结果是什么? a = 0.1 b = 0.2 c = 0.3 print(b == a + a) 思考2:打印结果是什么? a = 0.1 b = 0.2 c = 0.3 ...
- linux学习之Ubuntu
查看自己的ubuntu版本,输入以下命令(我的都是在root用户下的,在普通用户要使用sudo)第一行的lsb是因为没有安装LSB,安装之后就不会出现这个东西.LSB(Linux Standards ...
- 下载文件旁边附的MD5/SHA256等有什么用途?
在我们下载很多软件时,旁边会出现md5,sha1/sha256/sha512等一长串字符串,这些字符串是什么意义呢? 因为怕盗版或者怕软件被植入病毒或者插件等,要对软件的完整性做校验.步骤:先下载完软 ...