adb – Android 设备大管家


移动设备因其尺寸规模小、计算存储能力不足、输入输出组件受限等原因,其运行环境与开发调试环境往往在不同的计算机系统(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 的通讯。

    pic-1

    两个进程之间要建立连接,无论连接采用哪些通讯的协议,其软件的架构模式都是采用 C/S 模式。即,一个进程担任 Server,监听服务请求;一个进程担任 Client,发出连接请求。连接的建立过程,一定是 Client 进程主动连接 Server 进程的过程。

    作为整个 adb 架构的核心纽带,adb 体系的通讯链路由两个部分组成。一部分是,adb server 作为服务器与客户端 adb client 的连接;另一部分是,adb server 进程作为客户端,与 “下位机” 上的 adbd daemon 服务器的连接。

adb 系统运行流程

  1. 通过运行 adb 命令,启动一个 adb client
  2. adb client 会检查是否有 adb server 进程运行。如不存在,则启动 adb server 进程
    • adb server 进程通过开发机器的 5037 端口监听与所有的 adb client 通信,所有 adb client 指令均发至 5037 端口
  3. adb server 进程创建与所有 “下位机”(移动设备和模拟器)的连接
    • “下位机” 通过 adbd 值守进程,监听 adb server 进程的连接请求
      • “下位机” 为移动设备时,默认使用 Unix domain socket 的 IPC 机制,监听 USB 的连接请求;可通过开启特定端口(通常使用 5555),监听 TCP/IP 连接请求
      • “下位机” 为模拟器时,默认开启网络端口监听;监听端口通常使用 5555
    • adb server 进程通过 USB 或 TCP/IP,“主动” 与 “下位机” 建立连接

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 ]

pic-2

可以,以上例子中 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 调试环境
    1. 移动设备与 “上位机” 用 USB 方式连通
    2. 在 “上位机” 通过 USB 链路发送 adb 指令,来开启 “下位机(移动设备)” 的 tcp 监听端口

      adb tcpip listening_port (eg. 5555)

    3. 切断 USB 链路

    4. 在 “上位机” 通过 adb 连接指令建立到 “下位机” 的 tcpip 链路

      adb conncet device_ip : listening_port (eg. 192.168.16.168:5555)

    5. 搭建完成并验证

      adb devices

无线调试环境可以规避硬件线缆和接口数量的制约,为移动设备的管理提供了更灵活的手段。

Reference

  1. User guide – Android Debug Bridge
  2. manpage – adb

更多 adb shell 指令

  1. https://zhuanlan.zhihu.com/p/164504374
  2. https://www.makeuseof.com/practical-adb-commands-android/
  3. https://www.c-sharpcorner.com/blogs/useful-adb-commands-to-control-android-device-from-pc

发表评论

您的电子邮箱地址不会被公开。