Android 深入学习ADB调试原理(1)

简介: Android 深入学习ADB调试原理(1)

本文介绍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是设备的端口号,默认为5555
  • adb 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命令忽略并继续

感谢你阅读本文,如果你有任何问题或者建议,欢迎留言或者联系我。

相关实践学习
使用CLup和iSCSI共享盘快速体验PolarDB for PostgtreSQL
在Clup云管控平台中快速体验创建与管理在iSCSI共享盘上的PolarDB for PostgtreSQL。
AnalyticDB PostgreSQL 企业智能数据中台:一站式管理数据服务资产
企业在数据仓库之上可构建丰富的数据服务用以支持数据应用及业务场景;ADB PG推出全新企业智能数据平台,用以帮助用户一站式的管理企业数据服务资产,包括创建, 管理,探索, 监控等; 助力企业在现有平台之上快速构建起数据服务资产体系
相关文章
|
1月前
|
Android开发 移动开发 小程序
binder机制原理面试,安卓app开发教程
binder机制原理面试,安卓app开发教程
binder机制原理面试,安卓app开发教程
|
1月前
|
监控 Unix 应用服务中间件
Android-音视频学习系列-(八)基于-Nginx-搭建(rtmp、http)直播服务器
Android-音视频学习系列-(八)基于-Nginx-搭建(rtmp、http)直播服务器
|
1天前
|
安全 API Android开发
Android打开USB调试命令
【6月更文挑战第20天】
|
1月前
|
Shell Android开发
ADB更改Android设备屏幕显示方向
ADB更改Android设备屏幕显示方向
48 5
|
1月前
|
Android开发 异构计算 前端开发
Android显示原理,安卓自定义view面试
Android显示原理,安卓自定义view面试
|
1月前
|
存储 定位技术 开发工具
Android 开发前的设计,Android之内存泄漏调试学习与总结
Android 开发前的设计,Android之内存泄漏调试学习与总结
|
1月前
|
Android开发
Flutter完整开发实战详解(六、 深入Widget原理),2024百度Android岗面试真题收录解析
Flutter完整开发实战详解(六、 深入Widget原理),2024百度Android岗面试真题收录解析
|
1月前
|
Java Android开发 Dart
50家大厂面试万字精华总结android编程基础学习
50家大厂面试万字精华总结android编程基础学习
|
20天前
|
Shell 开发工具 Android开发
|
1月前
|
算法 安全 Java
2024年Android最新知识体系最强总结(全方面覆盖Android知识结构,BAT面试&学习进阶)
2024年Android最新知识体系最强总结(全方面覆盖Android知识结构,BAT面试&学习进阶)