菜单

ADB 接口

相关源文件

scrcpy 中的 ADB 接口提供了一个全面的抽象层,用于通过 Android 调试桥 (ADB) 与 Android 设备进行通信。该子系统处理所有与 ADB 相关的操作,包括设备发现、命令执行、连接管理和文件传输。它使 scrcpy 能够在客户端(计算机)和服务器(Android 设备)之间建立必要的通道。

有关 ADB 连接建立后客户端-服务器通信如何工作的更多信息,请参阅 客户端组件服务器组件

核心组件

ADB 接口包含三个主要组件

  1. ADB 命令接口 - 提供执行各种 ADB 命令的函数
  2. 设备管理 - 处理设备发现、选择和元数据
  3. 进程执行 - 用于 ADB 操作的与平台无关的进程执行

组件架构

来源: app/src/adb/adb.h1-128 app/src/adb/adb_device.h1-49 app/src/adb/adb_parser.h1-30 app/src/util/process.h1-179

ADB 命令执行

ADB 接口使用进程执行抽象来运行 ADB 命令。它提供了一种标准化的方法来

  1. 执行命令并捕获输出
  2. 处理命令行参数构建
  3. 一致地处理错误

命令执行流程

来源: app/src/adb/adb.c227-230 app/src/adb/adb.c203-225

关键命令函数

ADB 接口提供了用于常见 ADB 操作的全面函数集

功能描述关键参数
sc_adb_execute()通用 ADB 命令执行命令参数,标志
sc_adb_start_server()启动 ADB 服务器中断处理程序,标志
sc_adb_kill_server()终止 ADB 服务器中断处理程序,标志
sc_adb_forward()将本地端口转发到设备套接字序列号,端口,套接字名称,标志
sc_adb_reverse()反向 - 将设备套接字转发到本地端口序列号,套接字名称,端口,标志
sc_adb_push()将文件推送到设备序列号,本地路径,远程路径,标志
sc_adb_install()安装 APK序列号,APK 路径,标志
sc_adb_tcpip()在设备上启用 TCP/IP 模式序列号,端口,标志
sc_adb_connect()通过 TCP/IP 连接到设备IP:端口,标志
sc_adb_disconnect()断开与 TCP/IP 设备的连接IP:端口,标志

来源: app/src/adb/adb.c227-452 app/src/adb/adb.h39-95

设备管理

ADB 接口提供了用于发现、过滤和选择 scrcpy 要连接的 Android 设备的功能。

设备选择流程

来源: app/src/adb/adb.c606-696 app/src/adb/adb.h27-37

设备表示

ADB 接口使用 sc_adb_device 结构来表示设备,其中包含

  • 序列号:唯一设备标识符(例如,序列号或 IP:端口)
  • 状态:设备状态(例如,“device”、“unauthorized”)
  • 型号:设备型号名称
  • 已选:指示设备是否被选中的标志

它还将设备分为三种类型

  • USB 设备:物理 USB 连接
  • TCP/IP 设备:通过网络连接
  • 模拟器:Android 模拟器实例

来源: app/src/adb/adb_device.h10-21 app/src/adb/adb_device.c29-43

设备发现和输出解析

ADB 接口解析 ADB 命令的输出以发现设备及其属性。

设备解析流程

系统解析 adb devices -l 的输出以发现已连接的设备

  1. 执行 adb devices -l 命令
  2. 解析输出以提取设备信息
  3. 构建 sc_adb_device 结构的向量
  4. 应用设备选择标准

示例 adb devices -l 输出

List of devices attached
0123456789abcdef	device usb:2-1 product:MyProduct model:MyModel device:MyDevice transport_id:1
192.168.1.1:5555	device product:MyWifiProduct model:MyWifiModel device:MyWifiDevice transport_id:2

来源: app/src/adb/adb.c454-505 app/src/adb/adb_parser.c11-163

设备属性检测

ADB 接口还可以检索特定的设备属性

  • IP 地址:解析 ip route 命令输出以查找设备的 IP 地址
  • SDK 版本:通过 getprop ro.build.version.sdk 获取 Android SDK 版本

这些属性用于启用无线连接等功能,并处理特定版本的行为。

来源: app/src/adb/adb.c699-792 app/src/adb/adb_parser.c165-229

连接设置

ADB 接口负责建立客户端和设备之间的必要连接。

端口转发/反向连接设置

来源: app/src/adb/adb.c248-329 doc/develop.md308-322

服务器部署流程

ADB 接口负责将服务器组件部署到设备

  1. 使用 sc_adb_push() 将服务器 JAR 推送到设备
  2. 使用 sc_adb_forward()sc_adb_reverse() 设置端口转发
  3. 使用适当的参数在设备上执行服务器

来源: app/src/adb/adb.c331-360 doc/develop.md110-140

平台特定实现细节

ADB 接口使用了一个平台无关的进程执行系统,该系统具有平台特定的实现。

跨平台进程执行

功能Unix 实现Windows 实现
进程创建使用 fork()execvp()使用 CreateProcessW()
命令构建直接将参数作为数组传递通过适当的转义连接参数
管道处理使用 Unix 管道使用带有句柄继承的 Windows 管道
进程等待使用 waitid()使用 WaitForSingleObject()
进程终止使用 kill()SIGKILL使用 TerminateProcess()

来源: app/src/sys/unix/process.c15-236 app/src/sys/win/process.c12-260

错误处理与报告

ADB 接口集成了全面的错误处理

  1. 命令执行错误:报告 ADB 命令执行失败的情况
  2. 缺少二进制文件错误:ADB 未找到时的特殊处理
  3. 安装建议:安装 ADB 的平台特定建议
  4. 设备状态错误:未经授权设备的详细错误消息

来源: app/src/adb/adb.c104-155 app/src/adb/adb.c584-603

ADB 可执行文件配置

ADB 接口在初始化时确定 ADB 可执行文件的路径

  1. 检查环境变量中的 ADB 路径
  2. 使用 PATH 中的默认 "adb" 命令
  3. 对于便携版构建,使用相对于 scrcpy 可执行文件的本地路径

这使得 ADB 安装位置和便携式部署更加灵活。

来源: app/src/adb/adb.c31-58