天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文“寻求合作伙伴编写《深入理解 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

第4章3节《MonkeyRunner源码剖析》ADB协议及服务: ADB协议概览SYNC.TXT翻译参考(原创)的更多相关文章

  1. 老李推荐:第6章8节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-小结

    老李推荐:第6章8节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-小结   本章我们重点围绕处理网络过来的命令的MonkeySourceNetwork这个事 ...

  2. 老李推荐:第6章7节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-注入按键事件实例

    老李推荐:第6章7节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-注入按键事件实例   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜 ...

  3. 老李推荐:第6章6节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-命令队列

    老李推荐:第6章6节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-命令队列   事件源在获得字串命令并把它翻译成对应的MonkeyEvent事件后,会把这些 ...

  4. 老李推荐:第6章4节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-翻译命令字串

    老李推荐:第6章4节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-翻译命令字串   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自 ...

  5. 老李推荐:第6章5节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-事件

    老李推荐:第6章5节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-事件   从网络过来的命令字串需要解析翻译出来,有些命令会在翻译好后直接执行然后返回,但有 ...

  6. 老李推荐:第6章3节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-命令翻译类

    老李推荐:第6章3节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-命令翻译类   每个来自网络的字串命令都需要进行解析执行,只是有些是在解析的过程中直接执行 ...

  7. 老李推荐:第6章2节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-获取命令字串

    老李推荐:第6章2节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-获取命令字串   从上一节的描述可以知道,MonkeyRunner发送给Monkey的命令 ...

  8. 第4章1节《MonkeyRunner源码剖析》ADB协议及服务: ADB协议概览OVERVIEW.TXT翻译参考(原创)

    天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文“寻求合作伙伴编写<深入理解 MonkeyRunner>书籍“.但因为诸多原因,没有如愿.所以这里把草稿分享出来,所以错误在 ...

  9. 老李推荐:第6章1节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览 2

    事件要到那里去? 每个事件源处理类都维护着一个自己的事件队列, 在Monkey中叫做CommandQueue,里面装的是每个具体的MonkeyEvent事件.当来自网络的字串命令被翻译成对应的Monk ...

随机推荐

  1. Java版网络爬虫基础(转)

    网络爬虫不仅仅可以爬取网站的网页,图片,甚至可以实现抢票功能,网上抢购,机票查询等.这几天看了点基础,记录下来. 网页的关系可以看做是一张很大的图,图的遍历可以分为深度优先和广度优先.网络爬虫采取的广 ...

  2. android 如何将电话簿SDN数字和其他普通的数字混合在一起?

    最初的设计将默认SDN单独分出来,副标题"SDN". 下面的变化可以通过例如实现SDN并安排普通相同数量在一起,按字母顺序排列. DefaultContactListAdapter ...

  3. POJ 3579- Median

     Description Given N numbers, X1, X2, ... , XN, let us calculate the difference of every pair of n ...

  4. iOS开发- 隐藏状态栏(电池栏)

    分为两种情况: 1. 想要隐藏某个视图的状态栏, 比方说, 从界面A, push 到界面B的时候, 界面A原本显示状态栏, 然而我们须要界面B不显示状态栏. 这时候, 能够这样做: 在B中实现: - ...

  5. POJ 1141 区间DP

    给一组小括号与中括号的序列,加入最少的字符,使该序列变为合法序列,输出该合法序列. dp[a][b]记录a-b区间内的最小值, mark[a][b]记录该区间的最小值怎样得到. #include &q ...

  6. JavaScript高级编程

             原文地址: http://www.onlamp.com/pub/a/onlamp/2007/07/05/writing-advanced-javascript.html Web应用程 ...

  7. 设计管理员表;webservice用于网络安全的高端内提供服务的

    admin表设计.你应该有角色表,管理员属于一个样的作用,另一个接口选项,以查看表.角色有更多的选择的能力. 角色和选项代表了许多关系,因此,我们必须保持这种关系有一个表 版权声明:本文博客原创文章, ...

  8. Log4NET 数据库

    阅读目录 Log4NET简介 前提 详细步骤 回到顶部 Log4NET简介 log4net库是Apache log4j框架在Microsoft .NET平台的实现,是一个帮助程序员将日志信息输出到各种 ...

  9. 多于ListView同步滚动

    简介: 发展过程中可能遇到的2一个或多个其他listview为了用相应的关系保持滚动的情况下一起,本文演示了这种效应为大家. 功效: 实现原理: 在滚动当中不论什么一个ListView的时候,同一时候 ...

  10. NSIS:判断并安装.NET Framework 4 的例子

    原文 NSIS:判断并安装.NET Framework 4 的例子 现在.NET开发的软件已经大行其道,但有些操作系统并不符合软件的运行要求,所以,我们需要在安装程序中进行.NET Framework ...