ADB安装
ADB概述
ADB(Android Debug Bridge)是 Android SDK(软件开发工具包)中的一个命令行工具,用于与 Android 设备通信和调试。它提供了一组命令,允许开发者在开发和调试应用程序时与 Android 设备进行交互。以下是 ADB 的一些主要功能。
| 功能 | 说明 |
|---|---|
| 安装和卸载应用程序 | 通过ADB,开发者可以将本地计算机上的APK文件安装到连接的Android设备上,并可以从设备上卸载已安装的应用程序。 |
| 文件传输 | ADB允许将文件从本地计算机复制到设备或从设备复制到本地计算机。这对于在设备上查看、编辑和备份文件非常有用。 |
| 启动和停止应用程序 | ADB可以通过发送命令来启动或停止Android设备上的应用程序。 |
| 日志查看 | 通过adb logcat命令,开发者可以查看Android设备上的系统日志和应用程序日志,以进行调试和错误排查。 |
| 设备状态监控 | ADB允许开发者获取设备的状态信息,如设备的型号、操作系统版本、电池状态等。 |
| 端口转发 | 通过ADB,可以将设备上的端口与本地计算机上的端口进行映射,以便进行端口转发和调试网络通信。 |
| 设备截图 | 使用ADB,可以获取Android设备屏幕的截图。 |
| 设备重启 | 通过ADB,可以重启连接的Android设备。 |
| 远程调试 | ADB支持通过网络连接到设备,使开发者可以在无需物理连接的情况下调试设备。 |
| Shell 访问 | 通过adb shell命令,可以在Android设备上运行交互式的命令行 Shell,执行各种命令和脚本。 |
Linux安装ADB
(1) 方法1-apt方式安装
sudo apt install adb
注:使用该方法安装的不一定是Google官方的最新版本的adb工具。遇到手机中adb版本较新的情况时可能会出现adb命令或fastboot命令不兼容的情况,如提示”adb server version (41) doesn’t match this client (39)”。
可以通过手动下载并配置环境变量的方式安装adb,如下方法。
(2) 方法2-手动下载并配置环境变量
下载地址:SDK 平台工具版本——developer.android
下载完成后将解压文件夹移动到某目录,如将解压后的platform-tools文件夹命名为ADB,并移动到/path/Software中,接下来将/path/Software/ADB添加到环境变量。
# 授予文件夹执行权限
sudo chmod a+x /path/Software/ADB
# 打开/etc/profile
sudo gedit /etc/profile
# 将路径添加到环境变量,写入以下语句
export PATH=$PATH:/path/Software/ADB
# 使修改在当前终端立即生效
source /etc/profile
注:新开终端后不生效,如果要全局生效需要重新登录或重启。
# 验证是否成功
adb --version
Windows安装ADB
- 下载Android SDK并解压到路径
- 找到platform-tools文件夹
- 将platform-tools路径加入到系统变量path中
于是便可以在Windows终端中使用adb命令。
ADB工作原理
ADB的各个组件
ADB (Android Debug Bridge,安卓调试桥) 是一种功能多样的命令行工具。它可以让PC与Android设备进行通信,ADB命令可用于执行各种设备操作(例如安装和调试应用),并提供对 Unix shell(可用来在设备上运行各种命令)的访问权限,它是一种C/S架构的程序,主要包括三个组件。
(1) 客户端
如Shell,主要用于发送命令,ADB Client在开发机器上运行,你可以通过发出ADB命令从命令行终端调用客户端,客户端的主要工作是:解析如push、shell、install等命令的参数,做必要预处理,然后转移为指令或数据,发送给ADB Server。
(2) 服务器 (ADB Server)
是运行在PC上的一个后台进程,它有两个作用:
- 检测USB端口感知设备的连接和拔除,以及模拟器实例的启动或停止;
- 将ADB Client的请求通过USB或者TCP的方式发送到对应的adbd上。
ADB Server维护着一个“已连接的设备的链表”,并且为每一个设备标记了一个状态:offline,bootloader,recovery或者online。Server一直在做一些循环和等待,监听从 Clients 发来的命令,协调Client和Server还有Daemon之间的通信。
(3) ADB Daemon(ADB守护程序,简称adbd)
adbd是运行在Android设备(真机/模拟器)后台的一个进程,它是由init进程启动的,并且系统一开机就已经启动,它的主要作用是处理来自ADBServer的命令行请求,然后获取对应Android设备的信息,再将结果返回给ADB Server。
ADB指令分类
Client通过发送指令的方式,给到ADB Server端,ADB Server端进行判定,是否需要转发到adbd进行处理。
(1) Client处理的指令
部分指令,可以直接在Client端直接处理。如:
adb version
adb help
(2) Server处理的指令
需要和ADB Server通信,但是不需要和adbd通信的指令,如adb devices
(3) adbd处理的指令
其余大部分的指令都需要adbd进行处理。
ADB命令执行流程
如下:
| 序号 | 动作 |
|---|---|
| 1 | 通过Android Studio工具或者命令行界面直接或间接的调用某个adb命令,比如adb install或者adb devices; |
| 2 | 这时候adb进程会检查是否启动了ADB Server。如果未启动,则fork出一个子进程作为ADB Server,而这个fork出的进程将常驻PC端,监听来自Client端的请求; |
| 3 | ADB Server查找当前连接的真机或者模拟器,并接收来自Client端发出的请求; |
| 4 | ADB Server处理请求:如果是本地能直接处理的请求比如:adb devices就直接处理,如果是本地处理不了的请求就会转发给连接的真机或者模拟器来进行处理,可以通过数据线和TCP/IP的方式通信; |
| 5 | 位于真机或者模拟器后台的adbd进程接收到请求后,通过JDWP协议转发给对应的Java虚拟机进程处理; |
| 6 | adbd将处理后的结果返回给ADB Server,这时候我们就在命令行界面中看到展示结果了。 |
ADB端口
当启动某个ADB Client时,Client会先检查是否有ADB Server进程正在运行。如果没有,它将启动Server进程。Server在启动后会与本地TCP 端口5037绑定,并监听ADB Client发出的命令,并且所有ADB客户端均通过端口5037与ADB Server通信。
然后,Server会与所有正在运行的设备建立连接。它通过扫描 5555 到 5585 之间(该范围供前16个模拟器使用)的奇数号端口查找模拟器。Server一旦发现ADB Daemon进程 (adbd),便会与相应的端口建立连接。请注意,每个模拟器都使用一对按顺序排列的端口:
- 偶数端口:控制台连接,即用于Server与设备进行交互的,可以让Server直接从设备中读取数据;
- 奇数端口:奇数端口是用来与设备的adbd进行连接通信的。首先Server通过奇数端口来确定运行的虚拟机或设备的实例。当Server发现一个ADB Daemon进程,就通过这个端口建立连接
例如:
模拟器 1,控制台:5554
模拟器 1,adbd:5555
模拟器 2,控制台:5556
模拟器 2,adbd:5557
……
Server与所有设备均建立连接后,便可以使用ADB命令访问这些设备。由于Server管理与设备的连接,并处理来自多个ADB客户端的命令,因此可以从任意客户端(或从某个脚本)控制任意设备。