第4章3节《MonkeyRunner源码剖析》ADB协议及服务: ADB协议概览SYNC.TXT翻译参考(原创)
天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文“寻求合作伙伴编写《深入理解 MonkeyRunner》书籍“。但因为诸多原因,没有如愿。所以这里把草稿分享出来,所以错误在所难免。有需要的就参考下吧,转发的话还请保留每篇文章结尾的出处等信息。
本文档的目的是去文档化一个客户端请求ADB服务器往adbd守护进程发送文件相关的请求。请查看OVERVIEW.TXT文档去查看(ADB服务器和adbd守护进程)相关信息,查看SERVICES.TXT去学习其他更多的可用请求。
同步服务:
通过使用SERVICES.TXT描述的相关协议去请求同步服务(“sync:”)把连接设置成同步模式。这个模式也叫做二进制模式,它不同于正常的adb协议。当设置后连接会保持在这个模式之下直到被显式的终止掉(请查看下面描述)
在发起”sync:”命令去启动同步模式之后,服务器端必须如正常模式(请看OVERVIEW.TXT)般返回”OKAY”或者”FAIL”应答。
在同步模式中,服务器和客户端会频繁的使用8字节数据包来进行交互通信,这个在本文档中被称为”同步请求”和”同步应答“。最开始的4字节是一个指定的同步请求的id,这4个字节是用4个utf-8字符来呈现的。后面的4字节是一个小字节序的整数,使用比较广泛(多种多样),往下会被称作”长度“。事实上在同步模式中所有的二进制整数都是小字节序的。同步模式在每次同步请求完成后都会隐式的自动退出并进入到正常的adb通信模式,正常模式详情请查看SERVICES.TXT.
以下列出可接受范围内的所有同步请求:
-
LIST - 列出一个文件夹下面的所有文件
-
SEND - 往目标设备传送一个文件
-
RECV - 从目标设备获取一个文件
以下列出还没有真正文档化下来的同步请求:
-
STAT - 获取一个文件的各种状态属性
-
ULINK - 取消(删除)一个文件的连接。(还没有支持)
上面提及的所有的同步请求后面必须紧跟着由“长度”指定大小的字节来存储utf-8字串类型的远程文件名字。
LIST:
这个同步请求会列出“远程文件名”指定的目录下的所有文件。服务器端会返回0个以上的目录项或者也可以叫做”dents”。
目录项将会以以下的形式进行返回
-
一个4字节的id为”DENT”的同步返回
-
一个4字节代表文件(权限)模式的整数
-
一个4字节代表文件大小的整数
-
一个4字节代表最后修改事件的整数
-
一个4字节代表文件名长度的整数
-
“长度”大小的包含一个以utf-8字串格式编码的文件名的字节码
当客户端接收到”DONE”这个同步返回之后,这个列出指定目录下所有文件的请求就算完成了。
SEND:
远程文件名在这种情况下会通过最后的一个逗号(“,”)划分成2部分,前面一部分代表真实的路径,而后面的第二部分是一个十进制形式的代表文件在目标设备的访问权限的文件模式属性。
注意有些文件类型在(adbd)把文件真正拷贝到目标目录之前或者在传送失败后会被删除掉。但也有一些文件类型是不会被删除掉,这样就允许
adb push disk_image /some_block_device
- 1
可以正常工作了(天地会珠海分舵注:否则如果adbd把接受到的文件处理完后删除掉了,就不能再把这个文件转发拷贝到目标块设备”some_block_device”去了)。
在发送了传送命令后真实的文件内容就可以通过块的方式进行传输了。每一个文件块会有以下的格式。
一个以id为”DATA”的同步请求命令以及紧跟着的等同于块大小的长度,然后紧跟着的是一个块大小的字节内容。文件的内容会以这种格式反复的传输直至整个文件传输完成。每一个块的大小不能大于64k。
当文件传输完成后一个”DONE”同步请求就会发送到目标机器(adbd),这种情况下请求的“长度”就会被设置成文件的最后修改时间。服务器最后在收到这个请求(注意不是每个数据块的发送请求)后会返回一个”OKAY”的同步应答(请求的“长度”可以忽略不管)
RECV:
这个请求的作用是从目标机器获取一个文件并保存到本地。请求的“远程文件名”设置的是要获取回来的远程文件名的路径。和上面的“SEND”同步请求一样,文件都是以文件块的方式进行传送的。同步返回格式中的id是”DATA”,“长度”是块大小,然后紧跟着是指定块大小的字节数(文件内容)。同样每个块大小不能超过64k。
当文件传送完成后客户端就会获得一个”DONE”的同步请求,该请求的“长度”可以忽略不管。
官方英文版: https://android.googlesource.com/platform/system/core/+/master/adb/SYNC.TXT
——— 未完待续———
作者:天地会珠海分舵
微信公众号:TechGoGoGo
微博:http://weibo.com/techgogogo
CSDN:http://blog.csdn.net/zhubaitian