用了 adb 这么久,看了这篇才明白

本贴最后更新于 1569 天前,其中的信息可能已经事过境迁

什么是 ADB

Adb 的全称为 Android Debug Bridge:Android 调试桥,是一个 Android 的命令行工具,可以用来连接并监控调试模拟器或实际的移动设备。adb 命令便于执行各种设备操作(例如安装和调试应用),并提供对 Unix shell(可用来在设备上运行各种命令)的访问权限。它是一种客户端-服务器程序,包括以下三个组件:

  • 客户端(adb client):在 PC 运行,用于发送命令。客户端在开发计算机上运行。您可以通过发出 adb 命令从命令行终端调用客户端,发送命令时,首先检测 PC 上有没有启动 Server,如果后台没有 Server,则自动启动一个 Server,然后将命令发送到 Server,并不关心命令发送过去以后会怎样。
  • 守护进程 (adbd):在设备上运行命令。守护进程在每个设备上作为后台进程运行。当手机正确俩捏到 PC 上,并且 adb server 能够连接上 daemon 时,server 将手机的状态标记为 online,否则为 offline,这意味着 server 发现了一个新设备,但是不能成功连接到 daemon。
  • 服务器(adb server):在 PC 运行,管理客户端和守护进程之间的通信。服务器在开发计算机上作为后台进程运行。ADB Server 维护着一个“已连接的设备的列表”,并且为每一个设备标记了一个状态:offline,bootloader,recovery 或者 online;Server 一直在做一些循环和等待,以协调 client 和 Server 还有 daemon 之间的通信

adb 包含在 Android SDK 平台工具软件包中,可以通过 Android Studio 的 SDK Manager 下载,也可以下载单独的软件包进行安装,adb 在会在 adk 目录//platform-tools/目录下。

ADB 原理

当启动某个 adb 客户端时,客户端会先检查是否有 adb 服务器进程正在运行。如果没有,它将启动服务器进程。服务器在启动后会与本地 TCP 端口 5037 绑定,并监听 adb 客户端发出的命令 - 所有 adb 客户端均通过端口 5037 与 adb 服务器通信。然后,服务器会与所有正在运行的设备建立连接。它通过扫描 5555 到 5585 之间(该范围供前 16 个模拟器使用)的奇数号端口查找模拟器。服务器一旦发现 adb 守护进程 (adbd),便会与相应的端口建立连接。

adb client 与 adb server 之间是通过 tcp 进行通信,adb server 和 adbd 通过 usb 或者 tcp 进行通信。ADB Server 对本地的 TCP5037 端口进行监听,等待 ADB Client 的命令。ADB Client 每个命令都包含两个部分,前一部分包含固定四个字节,以十六进制的方式指明指令的长度,后一部分才是真正的指令内容。

总结:在终端输入 adb 命令后都发生了什么

  1. adb client 调用 adb 命令
  2. adb 进程 fork 出一个子进程作为 adb server
  3. adb server 查找当前可连接的设备
  4. server 在 5037 端口监听来自 adb client 的请求
  5. adb server 处理请求,比如 adb version 就是 server 可以直接处理的,处理不掉的发给 device,比如 adb devices
  6. adbd 拿到请求后交给 java 虚拟器进程
  7. adbd 将结果返回给 adb server
  8. adb server 将结果返回给 adb client

用了 adb 这么久,看了这篇才明白

ADB 常用的一些命令

  • adb start-server 启动 adb server
  • adb kill-server 关闭 adb server
  • adb devices 获取连接的设备
  • adb install path_to_apk 安装 apk,加-r 参数表示覆盖安装
  • adb pull remote local 从 Android 设备上获取文件到本地
  • adb push local remote 从本地推送文件到 Android 设备上
  • adb uninstall pkg_name 移除此应用软件包。添加 -k 选项可保存数据和缓存目录
  • adb bugreport path 将 bugreport 输出到指定路径,可以用此命令获取各应用耗电量,然后用 battry-history 工具进行分析
  • adb logcat 查看系统运行日志
  • adb get-serialno 获取设备序列号
  • adb shell 在目标设备中启动远程交互式 shell,例如执行 am、pm、dumpsys 命令
  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    333 引用 • 323 回帖 • 67 关注
  • ADB
    12 引用 • 11 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 865480187qq

    这就没啦 😂

  • 其他回帖
  • adlered 1

    帖子原创性不高呀,多创作些自己的博客,把别人的博客放到自己的博客就没意思了 🤣