老李推荐:第4章3节《MonkeyRunner源码剖析》ADB协议及服务: ADB协议概览

 

poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标。如果对课程感兴趣,请大家咨询qq:908821478,

本文档的目的是去文档化一个客户端请求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

可以正常工作了(天地会珠海分舵注:否则如果adbd把接受到的文件处理完后删除掉了,就不能再把这个文件转发拷贝到目标块设备”some_block_device”去了)。

在发送了传送命令后真实的文件内容就可以通过块的方式进行传输了。每一个文件块会有以下的格式。

一个以id为”DATA”的同步请求命令以及紧跟着的等同于块大小的长度,然后紧跟着的是一个块大小的字节内容。文件的内容会以这种格式反复的传输直至整个文件传输完成。每一个块的大小不能大于64k。

当文件传输完成后一个”DONE”同步请求就会发送到目标机器(adbd),这种情况下请求的“长度”就会被设置成文件的最后修改时间。服务器最后在收到这个请求(注意不是每个数据块的发送请求)后会返回一个”OKAY”的同步应答(请求的“长度”可以忽略不管)

RECV:


这个请求的作用是从目标机器获取一个文件并保存到本地。请求的“远程文件名”设置的是要获取回来的远程文件名的路径。和上面的“SEND”同步请求一样,文件都是以文件块的方式进行传送的。同步返回格式中的id是”DATA”,“长度”是块大小,然后紧跟着是指定块大小的字节数(文件内容)。同样每个块大小不能超过64k。

当文件传送完成后客户端就会获得一个”DONE”的同步请求,该请求的“长度”可以忽略不管。

老李推荐:第4章3节《MonkeyRunner源码剖析》ADB协议及服务: ADB协议概览的更多相关文章

  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. 老李推荐:第6章1节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览 2

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

  9. 老李推荐:第14章9节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-遍历控件树查找控件

    老李推荐:第14章9节<MonkeyRunner源码剖析> HierarchyViewer实现原理-遍历控件树查找控件   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员 ...

  10. 老李推荐:第14章5节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-查询ViewServer运行状态

    老李推荐:第14章5节<MonkeyRunner源码剖析> HierarchyViewer实现原理-装备ViewServer-查询ViewServer运行状态   poptest是国内唯一 ...

随机推荐

  1. 解读Java内部类

    一.基本概念: 顾名思义,内部类存在于外部类当中,依附于外部类.就像眼睛和脑袋的关系一样. 二.几点说明: 1.内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以 ...

  2. Visual Studio Code 中编写 C++ 的工作流

    1. 官网下载 Visual Studio Code ,安装.按提示安装 cpp 插件和 cmake 插件. 官网下载 CMake ,安装. 官网下载 Mingw ,安装. 安装 Mingw 时,注意 ...

  3. 随手小记(es6)

    在学习前辈阮一峰大神写的<ECMAScript入门>一书的过程中,第九章中讲到对象扩展时,第一条我就有点看不懂 ES6允许直接写入变量和函数,作为对象的属性和方法.这样的书写更加简洁. v ...

  4. linux数据库初始化配置

    mysql: 第一次登陆mysql -uroot -p,密码输入直接回车,以空密码登陆 选择数据库:use mysql; UPDATE user SET password=PASSWORD('Java ...

  5. Nginx+tomcat动静分离安装脚本

    #!/bin/bashsetenforce 0systemctl stop firewalldtar -zxvf nginx-1.8.0.tar.gz -C /usr/src/ cd /usr/src ...

  6. javascript string对象方法总结

    1.anchor() 用于创建html锚,也就是a标签,()中可以带参数,是a标签的name属性值. var string="hello world"; document.writ ...

  7. Android网络开发实例(基于抓包实现的网络模拟登录,登出和强制登出)

    学习Android有几个月了,最近喜欢上了网络编程,于是想通过Android写一些一个小程序用于连接外网.在这里非常感谢雪夜圣诞的支持,非常感谢,给我打开新的一扇门. 1.声明,本程序只能用于西南大学 ...

  8. Think PHP 基础

    ThinkPHP 一.什么框架: 一堆代码的集合,里边有变量.函数.类.常量,里边也有许多设计模式MVC.AR数据库.单例等等. 框架可以节省我们50-60%的工作量,我们全部精力都集中在业务层次. ...

  9. Oracle 数据库启用归档

    一.关闭数据库 二.启动数据库到mount状态 三.启用或停止归档模式 启用 停用 四.开启数据库并查看归档模式 参考文档:http://blog.csdn.net/feifei_86/article ...

  10. 解决springmvc在单纯返回一个字符串对象时所出现的乱码情况(极速版)

    使用springmvc框架开发了这么长时间,之前都是直接返回jsp页面,乱码情况都是通过配置和手动编解码来解决,但是今天突然返回一段单纯的字符串时,发现中文乱码情况解决不了了,下面就给各位分享一下如何 ...