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

本文涉及的产品
阿里云百炼推荐规格 ADB PostgreSQL,4核16GB 100GB 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命令忽略并继续

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

相关实践学习
阿里云百炼xAnalyticDB PostgreSQL构建AIGC应用
通过该实验体验在阿里云百炼中构建企业专属知识库构建及应用全流程。同时体验使用ADB-PG向量检索引擎提供专属安全存储,保障企业数据隐私安全。
AnalyticDB PostgreSQL 企业智能数据中台:一站式管理数据服务资产
企业在数据仓库之上可构建丰富的数据服务用以支持数据应用及业务场景;ADB PG推出全新企业智能数据平台,用以帮助用户一站式的管理企业数据服务资产,包括创建, 管理,探索, 监控等; 助力企业在现有平台之上快速构建起数据服务资产体系
相关文章
|
2月前
|
安全 Android开发 Kotlin
Android经典实战之SurfaceView原理和实践
本文介绍了 `SurfaceView` 这一强大的 UI 组件,尤其适合高性能绘制任务,如视频播放和游戏。文章详细讲解了 `SurfaceView` 的原理、与 `Surface` 类的关系及其实现示例,并强调了使用时需注意的线程安全、生命周期管理和性能优化等问题。
160 8
|
3月前
|
Shell Linux 开发工具
"开发者的救星:揭秘如何用adb神器征服Android设备,开启高效调试之旅!"
【8月更文挑战第20天】Android Debug Bridge (adb) 是 Android 开发者必备工具,用于实现计算机与 Android 设备间通讯,执行调试及命令操作。adb 提供了丰富的命令行接口,覆盖从基础设备管理到复杂系统操作的需求。本文详细介绍 adb 的安装配置流程,并列举实用命令示例,包括设备连接管理、应用安装调试、文件系统访问等基础功能,以及端口转发、日志查看等高级技巧。此外,还提供了常见问题的故障排除指南,帮助开发者快速解决问题。掌握 adb 将极大提升 Android 开发效率,助力项目顺利推进。
87 0
|
21天前
|
缓存 Java 数据库
Android的ANR原理
【10月更文挑战第18天】了解 ANR 的原理对于开发高质量的 Android 应用至关重要。通过合理的设计和优化,可以有效避免 ANR 的发生,提升应用的性能和用户体验。
48 8
|
2月前
|
Java Maven 开发工具
第一个安卓项目 | 中国象棋demo学习
本文是作者关于其第一个安卓项目——中国象棋demo的学习记录,展示了demo的运行结果、爬坑记录以及参考资料,包括解决Android Studio和maven相关问题的方法。
第一个安卓项目 | 中国象棋demo学习
|
1月前
|
XML 前端开发 Android开发
Android View的绘制流程和原理详细解说
Android View的绘制流程和原理详细解说
35 3
|
1月前
|
Web App开发 编解码 视频直播
视频直播技术干货(十二):从入门到放弃,快速学习Android端直播技术
本文详细介绍了Android端直播技术的全貌,涵盖了从实时音视频采集、编码、传输到解码与播放的各个环节。文章还探讨了直播中音视频同步、编解码器选择、传输协议以及直播延迟优化等关键问题。希望本文能为你提供有关Andriod端直播技术的深入理解和实践指导。
44 0
|
2月前
|
ARouter 测试技术 API
Android经典面试题之组件化原理、优缺点、实现方法?
本文介绍了组件化在Android开发中的应用,详细阐述了其原理、优缺点及实现方式,包括模块化、接口编程、依赖注入、路由机制等内容,并提供了具体代码示例。
45 2
|
2月前
|
编解码 前端开发 Android开发
Android经典实战之TextureView原理和高级用法
本文介绍了 `TextureView` 的原理和特点,包括其硬件加速渲染的优势及与其他视图叠加使用的灵活性,并提供了视频播放和自定义绘制的示例代码。通过合理管理生命周期和资源,`TextureView` 可实现高效流畅的图形和视频渲染。
224 12
|
1月前
|
Java 调度 Android开发
Android面试题之Kotlin中async 和 await实现并发的原理和面试总结
本文首发于公众号“AntDream”,详细解析了Kotlin协程中`async`与`await`的原理及其非阻塞特性,并提供了相关面试题及答案。协程作为轻量级线程,由Kotlin运行时库管理,`async`用于启动协程并返回`Deferred`对象,`await`则用于等待该对象完成并获取结果。文章还探讨了协程与传统线程的区别,并展示了如何取消协程任务及正确释放资源。
23 0
|
2月前
|
Android开发
Android学习 —— 测试init.rc中的条件触发的处理顺序
Android学习 —— 测试init.rc中的条件触发的处理顺序