目录
移动设备因其尺寸规模小、计算存储能力不足、输入输出组件受限等原因,其运行环境与开发调试环境往往在不同的计算机系统(CPU)架构上完成。这一特点使得移动设备的开发、调试、管理模式与传统嵌入式系统十分相似,整体结构上,也是类似 “上位机 + 下位机” 模式,移动设备本身是 “下位机”,常运行于 ARM 架构上;基于 X86 的 PC 是上位机,用于下位机上运行软件的开发、调试和管理。在 “上位机” 与 “下位机” 之间,设计某种机制进行交互。
常见的移动设备体系有 Android 体系和 IOS 体系。在 Android 体系中,“上位机” 与 “下位机” 沟通的纽带,就是 ADB 软件,全名 Android Debug Bridge。
ADB 一个功能十分强大,各种设备行为都可以通过 ADB 进行驱动,如在移动设备上安装和调试 app 软件、提供了一个 shell 终端可以在移动设备上运行各种指令等等,这些都极大方便了移动设备的管理。
ADB 架构的设计
ADB 整体采用了 “client – server” 的架构。包含三类组件,
- a client
负责给移动设备发送指令。运行在 “上位机”,即开发机器上。
-
a daemon
负责在移动设备上执行指令。运行在 “下位机”,即移动设备上。
-
a server
负责构建通讯链路,建立开发机器到移动设备之间的通讯链路,核心任务是管理 client 到 daemon 的通讯。
两个进程之间要建立连接,无论连接采用哪些通讯的协议,其软件的架构模式都是采用 C/S 模式。即,一个进程担任 Server,监听服务请求;一个进程担任 Client,发出连接请求。连接的建立过程,一定是 Client 进程主动连接 Server 进程的过程。
作为整个 adb 架构的核心纽带,adb 体系的通讯链路由两个部分组成。一部分是,adb server 作为服务器与客户端 adb client 的连接;另一部分是,adb server 进程作为客户端,与 “下位机” 上的 adbd daemon 服务器的连接。
adb 系统运行流程
- 通过运行 adb 命令,启动一个 adb client
- adb client 会检查是否有 adb server 进程运行。如不存在,则启动 adb server 进程
- adb server 进程通过开发机器的 5037 端口监听与所有的 adb client 通信,所有 adb client 指令均发至 5037 端口
- adb server 进程创建与所有 “下位机”(移动设备和模拟器)的连接
- “下位机” 通过 adbd 值守进程,监听 adb server 进程的连接请求
- “下位机” 为移动设备时,默认使用 Unix domain socket 的 IPC 机制,监听 USB 的连接请求;可通过开启特定端口(通常使用 5555),监听 TCP/IP 连接请求
- “下位机” 为模拟器时,默认开启网络端口监听;监听端口通常使用 5555
- adb server 进程通过 USB 或 TCP/IP,“主动” 与 “下位机” 建立连接
- “下位机” 通过 adbd 值守进程,监听 adb server 进程的连接请求
ADB 指令体系的实现
adb 工具提供了丰富的指令体系,可对 android 移动设备进行各种控制与管理。adb 架构上 “adb client –> adb server –> devices (daemon)” 的三级体系设计,也决定了 adb 指令体系的特点。所有的指令都是由 adb client 发出,传递到 adb server 或 devices 来执行。因此,adb 的指令体系上大体可分为两类,针对多个设备的全局性指令和针对特定设备的局部指令。一个 adb server 在设计上可以连接多个 android 设备,面向多个设备的全局性指令的功能一般由 adb server 来实现,局部性指令的功能则由单个具体的设备实现。
下面对 adb 典型的指令进行总结梳理。
(1) 全局指令 – 针对全部设备进行控制
– 查看所有设备连接信息
一个 adb server 可以连接多个 “下位机”,要以宏观视角查看所有连接设备信息,须用全局指令来实现这一任务。
adb devices [ – l ]
可以,以上例子中 adb server 进程连接了 3 个 “下位机” 设备,分别是通过 USB 连接的移动设备 626b2194
,通过 wifi 连接的移动设备 192.168.16.251:5555
,通过 tcpip 连接的虚拟机 192.168.56.101:5555
。
– 启动/关闭 adb server
运行 adb 指令会自动启动 adb server,也可以通过专门的指令启动,
adb start-server
关闭 adb server,
adb kill-server
– tcp/ip 链路管理
adb server 使用 usb 和 tcp/ip 两类链路与 “下位机” 通讯,usb 链路会在物理连接完成后,自动建立;tcp/ip 链路则需要首先与特定设备建立 tcp/ip 连接。指令如下,
adb connect host [ : port ]
- 如不指定端口,则默认使用 5555 端口。
断开 tcp/ip 链路,使用如下指令,
adb disconnect [ host [ : port ] ]
- 如不指定 host,则断开所有 tcp/ip 连接的设备
- 如指定了 host,不指定端口,则默认使用 5555 端口
(2) 局部指令 – 针对某个具体设备进行控制
adb 的主要任务是对具体设备的控制与管理,所以其大量指令也是针对这一需求设计。
– 局部指令的前置要求:指定操作设备
在大多数情况下,“上位机” 控制与管理一台 “下位机”(设备或模拟器),这是最为简单、常见的场景,此时,所有的 adb client 局部指令也默认直接发送给那台唯一的 “下位机”。但有些情况下,一个 adb server 会连接多个设备,这种情况下,执行针对具体设备的指令前,首先需要(告知 adb server)确认指令执行针对的目标设备是哪一个。为此,adb 提供了专门的选项来指定操作设备。
参数 | 含义 |
---|---|
-d (device) | 指令 “直接” 发送给唯一连接的 USB 设备。 |
-e (emulator) | 指令发送给唯一连接的模拟器。 |
-s (specific) [ serial number ] | 指令发送给由 -s 指定序列号的设备。 |
-a (all) | 指令发送给 adb 连接的所有设备。 |
adb 也提供了环境变量 ANDROID_SERIAL
机制,来设置默认的连接设备的序列号。与 -s
选项同时使用时,-s
选项优先级更高。
– 安装/卸载 app
adb install/uninstall path_to_apk
– 重启 Android 设备
adb reboot
– 文件传入/传出移动设备
文件由 “移动设备 –> 开发机器”,
adb pull remote_path local_path
文件由 “开发机器 — >移动设备”,
adb push local_path remote_path
adb 的文件传输指令也是由 adb client 发出,以移动设备为中心,指令命名上围绕着对中心的操作而设计,所选取的指令名称都非常形象的反映了传输的特点:将文件由移动设备传出,是把文件从移动设备 “拉” 出来,所以用单词 pull 表示;将文件传入移动设备,是将文件 “推送” 进入移动设备,所以用单词 push 表示。
– 设置移动设备的链路监听状态
默认情况下,移动设备上 adbd 开启 USB 监听状态,也可以通过 adb 指令对移动设备的监听状态进行调整。
重启移动设备上 adbd daemon 的 USB 监听,
adb usb
重启移动设备上 adbd daemon 的 TCP 监听,
adb tcpip port
– 端口转发
将开发机器上端口转发至移动设备上的端口,
adb forward protocol : local_port protocol : remote_port
– 执行 shell 指令
adb shell [command]
不使用 command
参数时,默认开启一个交互式的、移动设备的终端 shell。通过该 shell,可以执行各种 Android 移动设备的 shell 指令。
Android 系统源于 Unix/Linux,因此,Android shell (adb shell) 可以运行绝大多数 Unix/Linux 的 shell 指令;同时,Android shell 也添加了一些自身独有的 shell 指令。
典型的 adb shell 指令有,
adb shell 指令 | 含义 |
---|---|
pm command | package manager。对 Android 设备中的软件包进行管理。 |
am command | activity manager。对 Android 设备中的 activity (intent) 进行管理。 |
dpm command | device policy manager。对 Android 设备中的 device policy 进行管理。 |
screencap filename | 对设备显示屏截取屏幕快照。 |
screenrecord filename | 对设备进行录屏。 |
ADB 调试环境的搭建与优化
ADB 工具下载
adb 工具包含在 Android SDK Platform-Tools 工具包中,该工具包隶属 Android SDK 工具链。可通过 Android Studio 中的 SDK Manager 或 sdkmanager 命令行工具下载完整的 Android SDK 工具链,也可以单独下载 Android SDK Platform-Tools 工具包。
移动设备无线调试环境的搭建
除了使用 USB 连接直接对移动设备进行调试外,adb 也支持通过 wifi 搭建无线调试环境。
构建 wifi 调试环境具体步骤如下(Android 10 及以下版本),
- 前置条件
- Android 设备和安装 adb 工具的开发主机(上位机)连接至同一个 wifi 网络,且网络层可连通
- 如连接的移动设备为可穿戴设备,关闭与其配对的手机的 Bluetooth 链路
- 搭建 wifi 调试环境
- 移动设备与 “上位机” 用 USB 方式连通
- 在 “上位机” 通过 USB 链路发送 adb 指令,来开启 “下位机(移动设备)” 的 tcp 监听端口
adb tcpip listening_port (eg. 5555)
- 切断 USB 链路
-
在 “上位机” 通过 adb 连接指令建立到 “下位机” 的 tcpip 链路
adb conncet device_ip : listening_port (eg. 192.168.16.168:5555)
- 搭建完成并验证
adb devices
无线调试环境可以规避硬件线缆和接口数量的制约,为移动设备的管理提供了更灵活的手段。
Reference
更多 adb shell 指令