本文介绍Android ADB的基本架构和组成,通信工作原理,以及命令执行流程,命令错误处理流程等。
既然是原理,如果涉及基础部分就不过多赘述 ,本篇文章还需要完成源码追溯。
之前我有记录一部分,链接: Android系统 adb shell auth授权使用
ADB基础简述
1.1 ADB的定义和作用
- ADB是Android Debug Bridge的缩写,它是一个用于连接和控制Android设备的命令行工具。
- ADB可以让电脑上通过USB或无线网络与Android设备进行通信,执行各种操作,例如安装和卸载应用,传输文件,执行命令,获取日志等。
- ADB的优势是它可以让在不触摸设备的情况下对设备进行管理和调试,节省时间和精力。ADB的局限性是它需要一定的技术知识和操作经验,以及设备的开发者(ROOT)权限。
1.2 ADB的安装和配置
- 要使用ADB,需要下载和安装Android SDK平台工具,它包含了ADB和其他一些工具。
- 为了方便使用ADB命令,需要配置ADB的环境变量,即将ADB所在的目录添加到系统的PATH变量中。这样就可以在任意目录下使用ADB命令,而不需要每次都输入完整的路径。
- 在设备上,需要启用开发者选项,这是一个隐藏的菜单,通常需要在设置中多次点击版本号才能显示。在开发者选项中,需要启用USB调试模式,这样才能让ADB访问设备。当第一次连接设备时,需要在设备上授权ADB,这样才能建立安全的连接。
1.3 ADB的基本命令
- ADB命令的通用格式是
adb [options] [command] [command parameters]
。其中options
是可选的参数,用于指定一些选项;command
是要执行的命令;command parameters
是命令所需的参数。 - ADB命令有很多选项和参数,可以通过输入
adb help
来查看ADB命令的帮助信息。其中最常用的选项是-d
,-e
,-s
,-a
,-p
等。 - ADB命令有很多种类和功能,可以通过输入
adb help
来查看ADB命令的列表。其中最常用的命令是:
adb devices
: 列出已连接的设备adb install
: 安装一个应用到设备adb uninstall
: 卸载一个应用从设备adb push
: 将一个文件或目录从电脑复制到设备adb pull
: 将一个文件或目录从设备复制到电脑adb shell
: 在设备上运行一个交互式或非交互式的shell命令adb logcat
: 查看设备上的日志信息
ADB原理和流程
2.1 ADB的架构和组成
- ADB由三个组件构成:客户端、服务器、守护进程。
- 客户端:就是在电脑上输入并执行的ADB命令
- 服务器:就是一个在电脑上后台运行的进程,负责管理客户端和守护进程之间的通信
- 守护进程:就是一个在设备上后台运行的进程,负责执行客户端发送的命令
- ADB有两种连接方式:USB连接和无线连接。
- USB连接:就是通过USB线将设备和电脑连接起来,这是最常用的连接方式,速度快,稳定性高,但需要物理接触
- 无线连接:就是通过无线网络将设备和电脑连接起来,这是一种方便的连接方式,不需要物理接触,但需要设备和电脑在同一局域网内,速度慢,稳定性低
- ADB有两种通信模式:直接模式和服务模式。
- 直接模式:就是客户端直接与守护进程通信,不经过服务器,这是默认的通信模式,适用于只有一个设备连接的情况
- 服务模式:就是客户端与服务器通信,由服务器转发给守护进程,这是一种特殊的通信模式,适用于多个设备连接的情况
主题 | 总结 |
ADB的三个组件 | 1. 客户端:在电脑上输入并执行的ADB命令 2.服务器:在电脑上后台运行的进程,负责管理客户端和守护进程之间的通信 3.守护进程:在设备上后台运行的进程,负责执行客户端发送的命令 |
ADB的连接方式 | 1.无线连接:通过无线网络将设备和电脑连接起来 2.USB连接:通过USB线将设备和电脑连接起来 |
ADB的通信模式 | 1. 直接模式:客户端直接与守护进程通信,不经过服务器 2.服务模式:客户端与服务器通信,由服务器转发给守护进程 |
2.2 ADB的工作原理
- 当输入并执行一个ADB命令时,客户端会启动并检查ADB服务器是否运行。如果没有运行,客户端会启动服务器并绑定到本地端口5037。然后客户端会向服务器发送命令。
- 当服务器收到客户端发送的命令时,它会根据命令的类型进行处理。如果是设备管理命令,例如
adb devices
,adb connect
,adb disconnect
等,服务器会直接执行并返回结果或错误信息给客户端。如果是设备操作命令,例如adb install
,adb push
,adb pull
,adb shell
等,服务器会扫描并连接设备上的守护进程。然后服务器会将命令转发给守护进程。 - 当守护进程收到服务器转发的命令时,它会根据命令的类型进行处理。如果是文件传输命令,例如
adb push
,adb pull
等,守护进程会在设备上创建一个临时服务,并与服务器建立一个新的套接字连接。然后守护进程会通过这个连接传输文件数据,并返回结果或错误信息给服务器。如果是shell命令,例如adb shell
等,守护进程会在设备上启动一个shell子进程,并与服务器建立一个新的套接字连接。然后守护进程会通过这个连接传输shell输入和输出,并返回结果或错误信息给服务器。 源码部分我后面会分析出来
2.3 ADB的通信流程
- ADB客户端、服务器、守护进程之间的通信协议是基于TCP/IP协议的应用层协议。它使用了一种简单的数据格式:
<length><space><message>
。其中length
是一个四位十六进制数,表示消息的长度;space
是一个空格字符;message
是消息内容。
- ADB客户端发送命令到服务器的流程如下:
- 客户端向服务器发送一个四字节
CNXN
(connection),表示建立连接。 - 服务器向客户端发送一个四字节
CNXN
(connection),表示确认连接。 - 客户端向服务器发送一个四字节
OPEN
(open),表示打开一个新的服务。 - 服务器向客户端发送一个四字节
OKAY
(okay),表示确认打开服务。 - 客户端向服务器发送一个四字节
WRTE
(write),表示写入数据。 - 服务器向客户端发送一个四字节
OKAY
(okay),表示确认接收数据。 - 客户端向服务器发送一个四字节
CLSE
(close),表示关闭服务。 - 服务器向客户端发送一个四字节
CLSE
(close),表示确认关闭服务。
- ADB服务器转发命令到守护进程的流程如下:
- 服务器向守护进程发送一个四字节
OPEN
(open),表示打开一个新的服务。 - 守护进程向服务器发送一个四字节
OKAY
(okay),表示确认打开服务。 - 服务器向守护进程发送一个四字节
WRTE
(write),表示写入数据。 - 守护进程向服务器发送一个四字节
OKAY
(okay),表示确认接收数据。 - 守护进程根据命令类型执行相应操作,并将结果或错误信息返回给服务器。
- 服务器向守护进程发送一个四字节
CLSE
(close),表示关闭服务。 - 守护进程向服务器发送一个四字节
CLSE
(close),表示确认关闭服务。
- ADB守护进程返回结果到服务器的流程如下:
- 守护进程向服务器发送一个四字节
WRTE
(write),表示写入数据。 - 服务器向守护进程发送一个四字节
OKAY
(okay),表示确认接收数据。
- ADB服务器返回结果到客户端的流程如下:
- 服务器向客户端发送一个四字节
WRTE
(write),表示写入数据。 - 客户端向服务器发送一个四字节
OKAY
(okay),表示确认接收数据。
这个流程是基于ADB协议的基本工作原理,实际的流程可能会因为具体的命令和操作,版本有所不同。
ADB命令的执行
3.1 ADB命令的类型和格式
- ADB命令可以分为两种类型:设备管理命令和设备操作命令。
- 设备管理命令:就是用于管理设备的连接和状态的命令,例如
adb devices
,adb connect
,adb disconnect
等。这些命令通常不需要指定具体的设备,因为它们会作用于所有已连接的设备,或者根据选项来选择设备。 - 设备操作命令:就是用于操作设备的功能和数据的命令,例如
adb install
,adb push
,adb pull
,adb shell
等。这些命令通常需要指定具体的设备,因为它们会作用于单个设备,或者根据选项来选择设备。
- 设备管理命令的格式是
adb [options] [command]
。其中options
是可选的参数,用于指定一些选项;command
是要执行的命令。例如:
adb devices
: 列出已连接的设备adb connect <host>[:<port>]
: 连接到一个无线设备,其中host
是设备的IP地址或主机名,port
是设备的端口号,默认为5555adb disconnect [<host>[:<port>]]
: 断开与一个无线设备的连接,如果不指定参数,则断开所有无线连接
- 设备操作命令的格式是
adb [-d|-e|-s <serial number>] [command] [command parameters]
。其中-d
,-e
,-s <serial number>
是可选的参数,用于指定要操作的设备;command
是要执行的命令;command parameters
是命令所需的参数。例如:
adb -d install <file>
: 在唯一连接的USB设备上安装一个应用,其中file
是应用文件的路径adb -e push <local> <remote>
: 在唯一运行的模拟器上将一个文件或目录从电脑复制到设备,其中local
是电脑上的文件或目录路径,remote
是设备上的文件或目录路径adb -s <serial number> pull <remote> [<local>]
: 在指定序列号的设备上将一个文件或目录从设备复制到电脑,其中remote
是设备上的文件或目录路径,local
是电脑上的文件或目录路径,如果省略,则默认为当前目录
主题 | 总结 |
ADB的通信协议和数据格式 | 基于TCP/IP协议的应用层协议,使用了一种简单的数据格式:,其中length是一个四位十六进制数,表示消息的长度;space是一个空格字符;message是消息内容 |
ADB命令的类型 | 1. 设备管理命令:用于管理设备的连接和状态的命令,例如adb devices, adb connect, adb disconnect等 2. 设备操作命令:用于操作设备的功能和数据的命令,例如adb install, adb push, adb pull, adb shell等 |
3.2 ADB命令的执行过程
- 设备管理命令如何在客户端和服务器之间执行,并返回结果或错误信息:
- 客户端向服务器发送一个打开服务的请求,服务名为要执行的命令
- 服务器向客户端发送一个确认打开服务的响应
- 服务器根据服务名执行相应操作,并将结果或错误信息写入到服务中
- 客户端从服务中读取结果或错误信息,并显示在终端上
- 客户端向服务器发送一个关闭服务的请求
- 服务器向客户端发送一个确认关闭服务的响应
- 设备操作命令如何在客户端、服务器、守护进程之间执行,并返回结果或错误信息:
- 客户端向服务器发送一个打开服务的请求,服务名为要执行的命令
- 服务器向客户端发送一个确认打开服务的响应
- 服务器向守护进程发送一个打开服务的请求,服务名为要执行的命令
- 守护进程向服务器发送一个确认打开服务的响应
- 客户端将命令参数写入到服务中
- 服务器将命令参数从服务中读取,并转发给守护进程
- 守护进程根据服务名和参数执行相应操作,并将结果或错误信息写入到服务中
- 服务器将结果或错误信息从服务中读取,并转发给客户端
- 客户端从服务中读取结果或错误信息,并显示在终端上
- 客户端向服务器发送一个关闭服务的请求
- 服务器向客户端发送一个确认关闭服务的响应
- 服务器向守护进程发送一个关闭服务的请求
- 守护进程向服务器发送一个确认关闭服务的响应
- adb shell命令如何在客户端、服务器、守护进程之间建立交互式会话,并执行Unix shell命令:
- 客户端向服务器发送一个打开服务的请求,服务名为shell
- 服务器向客户端发送一个确认打开服务的响应
- 服务器向守护进程发送一个打开服务的请求,服务名为shell
- 守护进程向服务器发送一个确认打开服务的响应
- 守护进程在设备上启动一个shell子进程,并将其标准输入、输出、错误与服务绑定
- 客户端将用户输入的shell命令写入到服务中
- 服务器将用户输入的shell命令从服务中读取,并转发给守护进程
- 守护进程将用户输入的shell命令从服务中读取,并传递给shell子进程的标准输入
- shell子进程执行用户输入的shell命令,并将结果或错误信息写入到其标准输出或标准错误中
- 守护进程将shell子进程的标准输出或标准错误从服务中读取,并写入到服务中
- 服务器将shell子进程的标准输出或标准错误从服务中读取,并转发给客户端
- 客户端从服务中读取结果或错误信息,并显示在终端上
- 客户端和守护进程重复上述步骤,直到用户输入exit命令或按下Ctrl+C键退出会话
- 客户端向服务器发送一个关闭服务的请求
- 服务器向客户端发送一个确认关闭服务的响应
- 服务器向守护进程发送一个关闭服务的请求
- 守护进程向服务器发送一个确认关闭服务的响应
主题 | 总结 |
ADB命令的执行过程 | 设备管理命令在客户端和服务器之间执行,并返回结果或错误信息;设备操作命令在客户端、服务器、守护进程之间执行,并返回结果或错误信息;adb shell命令在客户端、服务器、守护进程之间建立交互式会话,并执行Unix shell命令 |
3.3 ADB命令的错误处理
- ADB命令可能出现的错误类型有以下几种:
- 语法错误:就是输入的ADB命令格式不正确,缺少必要的参数或选项,或者参数或选项不合法。例如:
adb install
(缺少文件参数),adb push /sdcard
(缺少目标路径参数),adb -x install <file>
(不存在的选项-x) - 连接错误:就是无法连接到ADB服务器或设备,可能是因为ADB服务器没有运行,或者设备没有正确连接,或者设备没有授权ADB访问。例如:
adb: no devices/emulators found
(没有找到设备或模拟器),adb: device offline
(设备离线),adb: device unauthorized
(设备未授权) - 权限错误:就是没有足够的权限来执行ADB命令,可能是因为设备没有开启开发者选项或USB调试模式,或者设备已经加密,或者设备已经锁屏。例如:
adb: error: failed to copy '<file>' to '<remote>': Permission denied
(拒绝访问权限),adb: error: failed to get feature set: device is locked. Please unlock the device and re-connect.
(设备已锁定,请解锁设备并重新连接)
- ADB命令如何显示错误信息,以及如何解读错误信息:
- ADB命令会在终端上显示错误信息,通常以
adb: error:
开头,然后是具体的错误原因和相关信息。例如:adb: error: failed to copy '<file>' to '<remote>': Permission denied
(拒绝访问权限),adb: error: failed to get feature set: device is locked. Please unlock the device and re-connect.
(设备已锁定,请解锁设备并重新连接) - 可以根据错误信息的内容来判断错误的类型和原因,以及可能的解决方法。例如,如果错误信息中出现了
Permission denied
(拒绝访问权限),可以检查是否有足够的权限来执行ADB命令,或者是否在正确的目录下操作。如果错误信息中出现了device is locked
(设备已锁定),可以检查是否已经解锁设备,并重新连接ADB。
- ADB命令如何处理错误,以及如何避免或解决常见错误:
- ADB命令会根据错误的类型和严重程度来处理错误,有些错误会导致ADB命令失败并退出,有些错误会导致ADB命令部分失败并继续,有些错误会导致ADB命令忽略并继续。例如,如果ADB命令无法连接到设备,它会失败并退出;如果ADB命令无法复制某个文件,它会部分失败并继续;如果ADB命令遇到一个未知的选项或参数,它会忽略并继续。
- 为了避免或解决常见错误,可以采取以下一些措施:
- 在执行ADB命令之前,确保已经安装和配置好ADB所需的软件和驱动,以及启用了设备上的开发者选项和USB调试模式
- 在执行ADB命令之前,确保已经正确地连接和授权了设备,并且设备没有加密或锁屏
- 在输入ADB命令时,确保遵循了正确的语法和格式,不要缺少或多余任何参数或选项,并且参数或选项是合法的
- 在执行ADB命令时,确保有足够的权限来操作设备上的文件或目录,并且文件或目录是存在的
- 在执行ADB命令时,确保使用了正确的选项来指定要操作的设备,特别是当有多个设备连接时
- 在执行ADB命令时,确保使用了正确的路径来指定要传输的文件或目录,并且路径是有效的
- 如果遇到任何错误信息,尝试根据错误信息的内容,Bing/Google/Gpt来找出错误的原因和解决方法
主题 | 总结 |
ADB命令的错误处理 | ADB命令可能出现的错误类型有语法错误、连接错误、权限错误等; ADB命令会在终端上显示错误信息,通常以adb: error:开头,然后是具体的错误原因和相关信息;ADB命令会根据错误的类型和严重程度来处理错误,有些错误会导致ADB命令失败并退出,有些错误会导致ADB命令部分失败并继续,有些错误会导致ADB命令忽略并继续 |
感谢你阅读本文,如果你有任何问题或者建议,欢迎留言或者联系我。