文章目录
- 1. -d
- 2. -e
- 3. -s
- 4. -t
- 5. -H
- 6. -P
- 7. -L
- 8. --one-device
- 9. --exit-on-write-error
- 10. connect / disconnect
- 11. pair
- 12. forward
- 13. forward --list
- 14. reverse
- 15. mdns check
- 16. mdns services
- 17. push
- 18. pull
- 19. sync
- 20.shell
- 21. install
- 22. uninstall
- 23. bugreport
- 24. jdwp
- 25. logcat
- 26. disable-verity / enable-verity
- 27. keygen FILE
- 28. wait-for[-TRANSPORT]-STATE...
- 29. get-state
- 30. get-serialno
- 31. get-devpath
- 32. remount -R
- 33. reboot
- 34. sideload
- 35. root
- 36. unroot
- 37. usb
- 38. tcp/ip PORT
- 39. Restart-server/kill-server
- 40. reconnect
- adb环境变量详解
1. -d
adb -d install app.apk
d
代表device
,具体含义为指定 ADB 命令应该作用于唯一连接的 USB 设备。
这个参数通常用于以下场景:
- 多设备环境:当你有多个 Android 设备(或模拟器)连接到计算机时,使用
-d
可以确保命令只作用于通过 USB 连接的物理设备。 - 排除模拟器:当你同时运行模拟器和连接了物理设备时,使用
-d
可以确保命令只针对物理设备执行。 - 提高效率:在只有一个 USB 设备连接的情况下,使用
-d
可以避免 ADB 搜索其他可能的连接(如网络设备或模拟器)。
2. -e
adb -e install app.apk
e
代表emulator
, 用于连接唯一运行的模拟器实例。
这个参数通常用于以下场景:
- 多设备环境:当你同时有物理设备和模拟器运行时,使用
-e
可以确保命令只作用于模拟器。 - 多模拟器环境:如果你只运行了一个模拟器实例,使用
-e
可以快速指向该模拟器,而不需要指定模拟器的名称或端口。 - 测试和开发:在进行应用开发和测试时,经常需要在模拟器上运行命令,
-e
参数可以简化这个过程。
3. -s
adb -s install app.apk
-s
参数代表 “serial”, 用于连接指定序列号的设备。
这个参数通常用于以下场景:
- 多设备环境:当你同时连接了多个 Android 设备或模拟器时,使用
-s
可以精确指定要操作的设备。 - 自动化脚本:在编写自动化测试或部署脚本时,使用
-s
可以确保命令作用于正确的设备。 - 特定设备操作:当你需要在多个设备中对特定设备执行操作时,
-s
参数非常有用。
4. -t
adb -t <transport_id> shell
-t
参数代表 “transport_id”, 作用于特定传输 ID 的设备。
这个参数通常用于以下场景:
- 高级调试:当设备有多个传输通道时(例如,同时通过 USB 和网络连接),可以使用
-t
来指定特定的传输通道。 - 特殊开发环境:在某些复杂的开发或测试环境中,可能需要精确控制 ADB 使用的传输通道。
- 系统级开发:对 Android 系统本身进行开发或调试时,可能会用到这个参数。
当然这个transport_id
是一个内部序列号,不像设备序列号那样容易获取或识别。它主要用于一些比较特殊的状况,大多数日常 Android 开发和调试工作不需要使用它。
5. -H
adb -H 192.168.1.12 devices
-H
参数代表 “host”, 用于指定运行的主机名或 IP 地址。
这个参数通常用于以下场景:
- 远程调试:当 ADB 服务器运行在远程机器上,而不是本地机器时。
- 网络环境:在复杂的网络设置中,可能需要明确指定 ADB 服务器的位置。
- 自定义开发环境:某些特殊的开发或测试环境可能需要连接到特定主机上的 ADB 服务器。
使用 -H
参数时需要注意:
- 默认情况下,ADB 客户端连接到本地(localhost)的 ADB 服务器。
- 使用远程 ADB 服务器时,需要确保网络连接正常,且远程主机允许 ADB 连接。
- 在某些情况下,可能还需要配合使用
-P
参数来指定端口号。
6. -P
adb -P 5037 devices
-P
参数代表 “port”, 指定要连接的 ADB 服务器的端口号。
这个参数通常用于以下场景:
- 自定义端口:当 ADB 服务器运行在非默认端口上时(adb默认端口是5037)。
- 多 ADB 服务器:在同一台机器上运行多个 ADB 服务器实例,每个使用不同的端口。
- 网络调试:通过网络连接到远程 ADB 服务器时,可能需要指定特定的端口。
- 防火墙配置:在某些网络环境中,可能只有特定端口允许 ADB 通信。
adb -P 5037 devices
这条命令会连接到本地运行在 5037 端口(ADB 的默认端口)上的 ADB 服务器,并列出连接的设备。
adb -H 192.168.1.100 -P 5555 shell
这条命令会连接到 IP 地址为 192.168.1.100,端口号为 5555 的 ADB 服务器,并在连接的设备上启动一个 shell 会话。
注意事项:
- ADB 的默认端口是 5037。如果不指定
-P
参数,ADB 会尝试连接到这个默认端口。 -P
参数通常与-H
参数一起使用,特别是在连接到远程 ADB 服务器时。- 使用非默认端口时,需要确保该端口未被其他服务占用,并且在必要的防火墙中开放。
7. -L
adb -L tcp:xxx
-L
参数代表 “listen”,用于指定一个地址和端口,让 ADB 服务器监听这个地址和端口上的连接。
这个参数主要用于以下场景:
- 远程调试:允许其他机器通过网络连接到这个ADB服务器;
- 自定义网络配置:在特定的网络环境中,可能需要ADB服务器监听特定的地址或者端口;
- 安全性考虑:可以限制ADB服务器只监听特定的网络接口。
adb -L tcp:5037
这条命令会让 ADB 服务器监听所有网络接口的 5037 端口(ADB 的默认端口)。
adb -L tcp:192.168.1.100:5555
这条命令会让 ADB 服务器只在 IP 地址 192.168.1.100 的 5555 端口上监听连接。
注意事项:
- 使用
-L
参数时,ADB 服务器会重新启动并开始监听指定的地址和端口。 - 这个参数主要用于 ADB 服务器的配置,而不是用于执行常规的 ADB 命令。
- 使用此参数可能会带来安全风险,因为它可能允许网络上的其他设备连接到你的 ADB 服务器。在使用时应确保网络环境是安全的。
- 在某些情况下,你可能需要配合使用防火墙规则来控制对这个端口的访问。
8. --one-device
adb --one-device install app.apk
只在单个设备上执行,即使有多个设备连接到计算机。经常看到错误日志more than one devices
的问题,那么就可以使用one-device
参数了。
使用场景是:
自动化脚本:确保脚本在单一设备环境中运行。
快速测试:当你知道只应该有一个设备连接时,可以使用此参数进行快速检查。
9. --exit-on-write-error
adb --exit-on-write-error push large_file.dat /sdcard/
遇到写入错误时,立即退出 ADB 命令. 比如以上命令是尝试将 large_file.dat 推送到设备的 /sdcard/ 目录。如果在传输过程中遇到任何写入错误,命令将立即退出。
使用场景:
大文件传输:确保大文件完整无误地传输到设备。
自动化脚本:在文件同步或安装过程中快速捕获并响应错误。
关键数据操作:当数据完整性至关重要时。
这个参数在需要严格控制数据完整性的情况下特别有用,比如在系统更新、重要数据备份或其他关键文件传输操作中。它提供了一种快速失败的机制,有助于及时发现和处理传输错误。
10. connect / disconnect
adb connect 127.0.0.1:2333 adb disconnect 127.0.0.1:2333
通过 Wi-Fi 或以太网连接到 Android 设备,而不是使用 USB 连接. 如果不指定端口,默认端口是5555
11. pair
adb pair <ip_address>:<port> [pairing code]
用于与 Android 11(API 级别 30)及更高版本的设备进行无线调试配对。这是一个更安全的无线调试方法。
使用步骤:
a. 在 Android 设备上启用无线调试(在开发者选项中)。
b. 在设备上获取配对码和 IP 地址:端口。
c. 在电脑上使用 adb pair
命令进行配对。
使用实例:
adb pair 192.168.1.100:37000
然后按提示输入设备显示的配对码。或者直接在命令中包含配对码:
adb pair 192.168.1.100:37000 123456
注意事项:
仅适用于 Android 11 及更高版本。
配对过程有时间限制,通常需要在设备显示配对码后的短时间内完成。
配对成功后,还需要使用
adb connect
来建立实际的调试连接。
12. forward
forward
是一个用于设置端口转发的 ADB 命令。它允许你将主机(可以理解为电脑)上的端口转发到连接的 Android 设备或模拟器上的端口。
主要用途:
- 创建从主机(电脑)到 Android 设备的端口转发;
- 允许主机(电脑)上运行的应用与设备上的服务进行通信。
基本语法:
adb forward <local> <remote>
其中 是主机上的规范,是设备上的规范。
常见的规范类型为:
tcp:<port>
: TCP 端口localabstract:<unix domain socket name>
: Android 的抽象 Unix 域套接字localreserved:<unix domain socket name>
: 保留的 Unix 域套接字localfilesystem:<unix domain socket name>
: Unix 域套接字dev:<character device name>
: 字符设备
使用实例:
adb forward tcp:27042 tcp:27042
将主机上的 27042 端口转发到设备上的 27042 端口, 这个命令就是frida
框架需要的命令
adb forward tcp:6100 localabstract:debug_socket
将主机上的 6100 端口转发到设备上名为 “debug_socket” 的抽象 Unix 域套接字.
另外
adb forward --remove:用于删除特定的转发规则。 adb forward --remove-all:用于删除所有转发规则。 adb forward --no-rebind: 如果指定的本地规范已经被使用,则不重新绑定它。
13. forward --list
用于列出所有已设置的端口转发规则的 ADB 命令。
$ adb forward --list emulator-5554 tcp:5000 tcp:6000 1234567890ABCDEF tcp:8080 tcp:9090
输出的每一行都包含三个部分:设备序列号、本地规范和远程规范。
14. reverse
与forward 功能一致,但是转发方向是相反的,用于设置从 Android 设备到主机(电脑)的端口转发。
adb reverse <remote> <local>
其中 <remote>
是设备上的规范,<local>
是主机上的规范。
使用场景:
- Web 开发:允许设备上的应用访问主机上运行的开发服务器。
- 调试:使设备能够连接到主机上运行的调试工具。
- 测试:设备上的应用可以访问主机上的模拟服务。
使用例子:
adb reverse tcp:8081 tcp:8081
意味着将设备上的 8081 端口转发到主机上的 8081 端口。熟悉 React Native 开发的人应该经常用这个命令。
当然后面的 --remove
, --remove-all
和--no-rebind
功能与forward
功能一致。
15. mdns check
用于检查设备 mDNS(多播 DNS)服务状态的 ADB 命令,主要用于无线调试相关的功能。
主要用途:
- 检查设备上的 mDNS 服务是否正在运行和广播;
- 用于无线调试功能的诊断。
使用场景:
- 设置无线调试时的故障排除
- 验证设备是否准备好进行无线配对和连接
- 诊断无线 ADB 连接问题
如果 mDNS 服务正常运行并广播,可能会显示类似 “OK” 或详细的状态信息;如果存在问题,会显示错误信息或状态说明
使用方式:
adb mdns check
16. mdns services
用于列出设备上当前广播的 mDNS(多播 DNS)服务,主要用于无线调试和网络服务发现相关的功能。
主要用途:
列出设备上当前正在广播的 mDNS 服务。
用于诊断和验证无线调试和其他网络服务。
使用场景:
- 验证无线调试服务是否正在广播
- 检查设备上其他使用 mDNS 的应用或服务
- 网络服务发现和诊断
$ adb mdns services registered service: _adb-tls-connect._tcp. 'ABCD1234' port=37401 registered service: _dartobservatory._tcp. 'Dart VM Observatory' port=54321
这个输出显示了两个服务:一个是 ADB 无线调试服务,另一个是 Dart VM Observatory(常见于 Flutter 开发).
17. push
将文件或目录从计算机复制到 Android 设备:
push [--sync] [-z ALGORITHM] [-Z] LOCAL... REMOTE
[--sync]
意义:同步模式
功能:只复制新的或已修改的文件,跳过已存在且未更改的文件
用途:提高效率,特别是在推送大量文件或频繁更新时
[-z ALGORITHM]
意义:压缩传输
功能:使用指定的算法压缩数据进行传输
ALGORITHM 可以是:
brotli
lz4
zstd
用途:减少传输时间,特别是在网络带宽有限的情况下
[-Z]
意义:禁用压缩
功能:即使默认启用了压缩,也强制不使用压缩
用途:当传输已经压缩的文件(如 zip、jpeg)时,避免不必要的压缩处理
LOCAL...
意义:本地源文件或目录
功能:指定要推送的本地文件或目录
注意:
...
表示可以指定多个本地源
REMOTE
- 意义:远程目标路径
- 功能:指定 Android 设备上的目标位置
18. pull
pull [-a] [-z ALGORITHM] [-Z] REMOTE... LOCAL
从 Android 设备拉取(复制)文件或目录到本地计算机。详细解析这些参数:
[-a]
意义:保留文件时间戳
功能:保持原文件的时间戳不变,而不是使用当前时间
用途:在需要保持文件原始时间属性的情况下很有用,如备份或同步操作
[-z ALGORITHM]
意义:压缩传输
功能:使用指定的算法压缩数据进行传输
ALGORITHM 可以是:
brotli
lz4
zstd
用途:减少传输时间,特别是在网络带宽有限的情况下
[-Z]
意义:禁用压缩
功能:即使默认启用了压缩,也强制不使用压缩
用途:当传输已经压缩的文件(如 zip、jpeg)时,避免不必要的压缩处理
REMOTE...
意义:Android 设备上的源文件或目录
功能:指定要拉取的设备上的文件或目录
注意:
...
表示可以指定多个远程源
LOCAL
- 意义:本地目标路径
- 功能:指定文件或目录在本地计算机上的保存位置
19. sync
用于在本地开发机和 Android 设备之间同步文件系统。这个命令主要用于系统级开发,如定制 ROM 或系统应用开发。使用模式如下:
sync [-l] [-z ALGORITHM] [-Z] [all|data|odm|oem|product|system|system_ext|vendor]
参数如下:
[-l]
意义:列表模式(List only)
功能:只列出要同步的文件,但不实际执行同步操作
用途:预览将要同步的内容,用于检查和验证
[-z ALGORITHM]
意义:压缩传输
功能:使用指定的算法压缩数据进行传输
ALGORITHM 可以是:
brotli
lz4
zstd
用途:减少传输时间,特别是在同步大量数据时
[-Z]
意义:禁用压缩
功能:即使默认启用了压缩,也强制不使用压缩
用途:当同步已压缩的文件时,避免不必要的压缩处理
同步选项:
all
: 同步所有分区data
: 同步 /data 分区odm
: 同步 /odm 分区(设备特定的修改)oem
: 同步 /oem 分区(原始设备制造商修改)product
: 同步 /product 分区(产品特定的配置)system
: 同步 /system 分区system_ext
: 同步 /system_ext 分区(系统扩展)vendor
: 同步 /vendor 分区(供应商特定的修改)
使用实例:
列出需要同步的系统文件:
adb sync -l system
使用压缩同步所有分区:
adb sync -z zstd all
同步 vendor 分区但不使用压缩:
adb sync -Z vendor
同步 data 分区:
adb sync data
注意事项:
- 权限要求:
- 同步系统分区通常需要设备有 root 权限或处于解锁状态。
- 对于生产设备,许多分区可能是只读的,无法同步。
- 使用场景:
- 主要用于系统开发、ROM 定制和 OEM 开发。
- 不适用于常规应用开发或用户级操作。
- 数据安全:
- 同步操作可能会覆盖设备上的现有数据,使用时需谨慎。
20.shell
用于在连接的 Android 设备上启动一个交互式 shell 会话或执行特定的 shell 命令。这是一个非常强大的工具,允许开发者直接与 Android 设备的底层系统交互。我们来看一下其详细参数:
adb shell [-e ESCAPE] [-n] [-Tt] [-x] [COMMAND...]
[-e ESCAPE]
意义:设置escape字符
功能:指定用于终止 adb shell 会话的转义字符
默认值:
~
(波浪号)用途:当默认的转义字符与您的输入冲突时,可以自定义
[-n]
意义:不读取或执行 rc 文件
功能:启动 shell 时不读取和执行 shell 的启动文件(如 .bashrc)
用途:获得一个"干净"的 shell 环境,不受本地配置影响
[-T]
意义:强制使用原始终端模式
功能:禁用 PTY(伪终端)分配
用途:在某些脚本或自动化场景中有用,可以避免某些终端相关的问题
[-t]
意义:强制使用终端模式
功能:强制分配一个 PTY
用途:确保获得一个完整的交互式 shell
[-x]
意义:禁用远程 shell 协议
功能:使用简单的 stdin/stdout 传输,而不是更高级的 shell 协议
用途:在某些兼容性问题或调试场景中有用
[COMMAND...]
- 意义:要在设备上执行的 shell 命令
- 功能:直接执行指定的命令,而不是启动交互式 shell
- 用途:快速执行单个或一系列命令
使用实例:
使用自定义转义字符:
adb shell -e ^
强制使用原始终端模式执行命令:
adb shell -T "ps | grep com.example.app"
禁用远程 shell 协议执行命令:
adb shell -x "echo Hello > /sdcard/test.txt"
21. install
adb install
命令用于将 Android 应用程序(APK 文件)安装到连接的 Android 设备上。详细参数为:
adb install [-lrtsdg] [--instant] PACKAGE
-l
: 锁定应用程序意义:将应用程序安装到 /data/app-private
用途:使应用程序无法被备份或移动到外部存储
-r
: 替换已存在的应用程序意义:如果应用程序已经存在,则重新安装并保留其数据
用途:更新已安装的应用程序
-t
: 允许安装测试 APK意义:允许安装标记为测试的应用程序
用途:用于安装专门用于测试的 APK 版本
-s
: 将应用程序安装到 sdcard意义:将应用程序安装到外部存储(如 SD 卡)而不是内部存储
用途:当设备内部存储空间不足时使用
-d
: 允许版本降级意义:允许安装比当前安装版本更低版本的应用程序
用途:测试旧版本或特定版本的应用程序
-g
: 授予应用程序清单中列出的所有权限意义:自动授予应用程序请求的所有权限,无需用户确认
用途:简化测试过程,避免手动授权步骤
--instant
: 将应用程序作为即时应用安装意义:安装即时应用版本
用途:用于测试和部署即时应用
PACKAGE
: 要安装的 APK 文件路径- 意义:指定要安装的 APK 文件的位置
- 可以是设备上的路径,也可以是本地计算机上的路径
实例:
基本安装:
adb install app.apk
替换已存在的应用:
adb install -r app.apk
安装测试 APK 并自动授予权限:
adb install -t -g test_app.apk
允许降级安装:
adb install -d older_version.apk
另外,在存在install-multiple
命令:
install-multiple [-lrtsdpg] [--instant] PACKAGE...
用于同时安装多个 APK文件到 Android 设备上,其命令已经介绍,举个例子:
adb install-multiple base.apk split_config.arm64_v8a.apk split_config.en.apk
但是需要注意的事项为:
- 这个命令主要用于处理拆分 APK 或应用包(App Bundles)生成的多个 APK 文件;
- 所有指定的 APK 必须属于同一个应用(具有相同的包名);
- 使用
-p
选项时要确保安装的 APK 组合是有效的,否则可能导致应用无法正常运行; - 安装多个 APK 可能需要更长的时间,特别是在较旧或性能较低的设备上;
- 不是所有 Android 设备或 ADB 版本都支持所有这些选项,使用前可能需要验证兼容性;
install-multiple
命令在处理现代 Android 应用分发格式(如 App Bundles)时特别有用,它允许开发者更灵活地管理复杂的应用结构和不同的设备配置。
当然,我们还可以同时安装不同包名的app,命令为:
install-multi-package [-lrtsdpg] [--instant] PACKAGE...
举例为:
adb install-multi-package app1.apk app2.apk app3.apk
22. uninstall
卸载指定的应用
adb uninstall -k packagename
-k : 保留缓存文件和数据文件夹
23. bugreport
一个非常有用的 Android 调试工具,用于生成设备的详细诊断报告。这个命令会收集大量的系统信息和日志,对于开发者和技术支持人员来说非常有价值。
主要用法很简单,直接
adb bugreport
用于收集设备的全面诊断信息,并生成一个包含系统状态、日志和其他重要数据的报告。
主要生成包括:
- 系统日志(logcat)
- 系统属性
- 进程列表
- 内存使用情况
- CPU 使用情况
- 网络统计
- 电池统计
- 崩溃报告
- 安装的应用列表
- 硬件信息
- 等等…
24. jdwp
是与 Java Debug Wire Protocol (JDWP) 相关的一个重要调试工具,用于列出和操作设备上可调试的 Java 进程。命令为:
adb jdwp
25. logcat
直接输出andorid的logcat
adb logcat
即可查看android logcat日志
26. disable-verity / enable-verity
命令用于禁用 Android 设备上的 dm-verity(设备映射完整性验证)。这是一个高级命令,主要用于开发和测试目的。
命令行为:
adb disable-verify
dm-verity 简介:
一种 Linux 内核安全特性
用于验证块设备(如系统分区)的完整性
防止未经授权的系统修改
使用场景:
系统级开发和测试
修改系统文件或分区
安装某些需要系统级修改的应用或模块
执行效果:
禁用后,系统将不再验证系统分区的完整性
允许对系统分区进行写入操作
注意事项:
需要设备已解锁 bootloader
通常需要 root 权限
会降低设备的安全性
可能导致 OTA 更新失败
重要警告:
禁用 dm-verity 可能使设备更容易受到攻击
不建议在个人使用的设备上禁用
相关命令:
adb enable-verity
: 重新启用 dm-verityadb reboot
: 在禁用/启用 verity 后需要重启设备
使用步骤:
a. 确保设备已解锁 bootloader 并启用 USB 调试
b. 执行adb disable-verity
c. 重启设备:adb reboot
27. keygen FILE
keygen FILE
命令用于生成 ADB(Android Debug Bridge)认证密钥。这个命令在 ADB 安全性和设备认证方面扮演着重要角色,使用方式如下:
adb keygen FILE
功能:
生成一个新的 ADB 私钥-公钥对
将生成的密钥保存到指定的文件中
参数:
- FILE: 指定生成的密钥文件的路径和名称
生成的文件:
私钥文件:指定的 FILE
公钥文件:FILE.pub
用途:
用于 ADB 客户端和 Android 设备之间的安全认证
替换默认的 ADB 密钥对
安全性:
增强 ADB 连接的安全性
允许自定义和管理 ADB 认证密钥
使用场景:
设置新的开发环境
增强 ADB 连接的安全性
在多个开发者之间共享一个通用的 ADB 密钥
密钥工作原理:
私钥保存在开发机器上
公钥需要添加到 Android 设备的授权密钥列表中
后续步骤:
生成密钥后,需要将公钥添加到 Android 设备
通常通过将公钥复制到设备的
/data/misc/adb/adb_keys
文件中
注意事项:
生成新密钥后,可能需要重新授权 ADB 连接
保护生成的私钥文件的安全,不要分享给他人
相关命令:
adb pubkey
: 显示 ADB 公钥adb connect
: 使用新密钥连接到设备
最佳实践:
定期更新 ADB 密钥以提高安全性
在共享开发环境中使用自定义密钥
妥善保管生成的私钥文件
密钥管理:
可以为不同项目或环境生成不同的密钥对
在多人开发团队中,可以使用共享的密钥对
故障排除:
如果新密钥不工作,确保公钥正确添加到设备
检查 ADB 服务器是否正在使用新密钥
安全建议:
- 不要在不受信任的网络上使用 ADB
- 定期检查已授权的 ADB 密钥列表
使用实例:
adb keygen ~/.android/adbkey
这将在 ~/.android/
目录下生成 adbkey
(私钥)和 adbkey.pub
(公钥)文件。
28. wait-for[-TRANSPORT]-STATE…
wait-for-[TRANSPORT]-STATE
命令是一个非常有用的工具,用于等待设备进入特定状态。这个命令在自动化脚本和持续集成/持续部署(CI/CD)流程中特别有价值。让我们详细解析这个命令:
基本语法:
adb wait-for-[TRANSPORT]-STATE
TRANSPORT 选项:
device
: 等待任何设备usb
: 只等待 USB 连接的设备local
: 只等待通过 TCP/IP 连接的设备
STATE 选项:
device
: 设备已连接并可用recovery
: 设备处于恢复模式sideload
: 设备处于 sideload 模式bootloader
: 设备处于 bootloader 模式disconnect
: 设备断开连接
功能:
阻塞执行,直到指定的设备状态出现
当设备进入指定状态时,命令返回
使用场景:
自动化测试脚本
设备刷机流程
CI/CD 管道中的设备操作
常见用法示例:
等待任何设备连接:
adb wait-for-device
等待 USB 设备进入 recovery 模式:
adb wait-for-usb-recovery
等待本地(TCP/IP)设备连接:
adb wait-for-local-device
超时行为:
命令默认没有超时限制,会一直等待直到条件满足
可以通过脚本或其他方式设置超时逻辑
脚本集成:
常用于 shell 脚本中,在执行其他 ADB 命令之前确保设备就绪
例如:
adb wait-for-device && adb shell some_command
调试用途:
帮助开发者跟踪设备状态变化
在复杂的设备操作流程中提供同步点
注意事项:
如果有多个设备连接,命令可能会对第一个匹配条件的设备响应
在使用
local
选项时,确保已正确设置 TCP/IP 连接
与其他命令结合:
常与
adb reboot
等命令配合使用例如,重启到 recovery 并等待:
adb reboot recovery && adb wait-for-recovery
在 CI/CD 中的应用:
确保设备在执行测试或部署前处于正确状态
提高自动化流程的稳定性
故障排除:
如果命令似乎卡住,检查设备连接和状态
确保 ADB 服务器正在运行
最佳实践:
在脚本中加入适当的超时机制
考虑添加错误处理逻辑,以应对设备未能进入预期状态的情况
高级用法:
- 可以结合
adb devices
命令来处理多设备情况 - 在复杂的刷机或恢复流程中作为检查点
- 可以结合
29. get-state
返回当前连接的 Android 设备的状态
adb get-state
可能的输出状态:
device
: 设备已连接且可用offline
: 设备已连接但不可用unknown
: 设备状态未知bootloader
: 设备处于 bootloader 模式recovery
: 设备处于恢复模式sideload
: 设备处于 sideload 模式unauthorized
: 设备已连接但未授权 ADB 连接
使用场景:
快速检查设备状态
在脚本中用于条件判断
故障排除过程中确认设备连接状态
特点:
- 简洁:只返回一个单词的状态
- 快速:执行速度快,适合频繁检查
- 可靠:提供设备的当前状态的准确信息
可以来个脚本:
if [ "$(adb get-state)" = "device" ]; then echo "设备已就绪,开始操作" # 执行其他 ADB 命令 else echo "设备未就绪,请检查连接" fi
30. get-serialno
用于获取连接的 Android 设备的序列号
adb get-serialno
返回当前连接的 Android 设备的唯一序列号, 没有设备连接返回"unknown".
31. get-devpath
获取连接的 Android 设备的设备路径。这个命令提供了设备在系统中的物理连接路径信息.
adb get-devpath
对于 USB 连接的设备,可能返回类似 usb:337641472X ,对于模拟器或无线连接的设备,可能返回 unknown
.
32. remount -R
用于重新挂载设备的文件系统,通常是为了获得对系统分区的写入权限。
adb remount adb remount -R
功能:
- 重新挂载系统分区为可读写模式
- 允许修改系统文件
-R
选项:- 在重新挂载后立即重启设备
使用场景:
- 系统级开发和调试
- 修改系统文件或应用
- 进行需要root权限的操作
先决条件:
- 设备必须已root
- bootloader必须解锁
- 在某些情况下,可能需要禁用 dm-verity
安全影响:
- 降低设备安全性,允许系统文件被修改
- 可能导致设备无法通过安全验证
使用步骤:
a. 确保设备已root且USB调试已启用
b. 执行adb remount
c. 如果使用-R
,设备将自动重启常见用途:
- 修改系统应用或框架
- 安装或替换系统级应用
- 进行底层系统调试
注意事项:
- 不当使用可能导致设备变砖
- 可能影响OTA更新
- 在生产设备上使用极其危险
与其他命令结合:
通常与
adb push
和adb pull
一起使用来修改系统文件例如:
basic
复制
adb remount adb push modified_file.so /system/lib/
恢复方法:
- 重启设备通常会恢复只读状态
- 完全恢复可能需要重新刷入系统镜像
在开发中的应用:
- 测试系统级修改
- 调试系统服务和框架
区别于普通root:
- 普通root允许获取超级用户权限
- remount允许直接修改系统分区
潜在风险:
- 可能导致系统不稳定
- 增加安全漏洞风险
- 可能违反设备保修条款
最佳实践:
- 仅在开发设备上使用
- 在使用前备份重要数据
- 在完成必要操作后立即重启设备
33. reboot
用于重启 Android 设备,并可以指定重启到特定模式。这是一个非常有用的命令,特别是在开发、测试和设备维护过程中。
adb rebot [mode]
- 可用的重启模式:
- 默认(不带参数):正常重启到系统
- bootloader:重启到 bootloader 模式
- recovery:重启到 recovery 模式
- sideload:重启到 sideload 模式
- sideload-auto-reboot:进入 sideload 模式后自动重启
34. sideload
用于在 Android 设备上安装系统更新包(OTA 包)的 ADB 命令。这是一种直接通过电脑向设备安装系统更新的方法,特别适用于无法通过正常 OTA 更新或想要手动安装特定版本系统的情况。
adb sideload <path_to_update.zip>
使用步骤:
a. 将设备重启到 Recovery 模式
b. 在 Recovery 菜单中选择 “Apply update from ADB”
c. 在计算机上执行adb sideload
命令先决条件:
- 设备必须处于 Recovery 模式
- ADB 调试必须启用
- 计算机上必须安装 ADB 工具
OTA 包要求:
- 必须是针对特定设备型号的正确 OTA 包
- 通常是 .zip 格式的文件
使用场景:
- 手动更新系统版本
- 安装官方 OTA 更新
- 在自动 OTA 更新失败时使用
优点:
- 无需完整的系统镜像
- 可以跳过等待 OTA 推送
- 适用于无法正常接收 OTA 更新的设备
注意事项:
- 确保使用正确的 OTA 包,否则可能导致设备问题
- 建议在操作前备份重要数据
- 过程中不要断开设备连接
常见错误:
- 签名验证失败:通常是由于使用了不兼容或被修改的 OTA 包
- 空间不足:确保设备有足够的存储空间
安全考虑:
- 只使用来自可信源的 OTA 包
- 避免使用未经验证的第三方 OTA 包
与其他命令的结合:
adb reboot recovery # 手动在设备上选择 "Apply update from ADB" adb sideload update.zip
在脚本中的应用:
adb reboot recovery sleep 30 # 等待设备进入 recovery 模式 adb sideload path/to/update.zip
故障排除:
- 如果 sideload 失败,检查 OTA 包的完整性
- 确保设备型号和 OTA 包匹配
- 检查 ADB 连接是否稳定
与传统刷机的区别:
- Sideload 通常只更新系统,不会清除用户数据
- 比完整的系统刷写更安全和快速
最佳实践:
在执行 sideload 前为设备充足电
保持良好的 USB 连接,避免中断
在执行更新后验证系统的完整性
35. root
用于获取 Android 设备 root 权限的 ADB 命令
36. unroot
root的反向操作,用于退出ADB的root模式。这个命令在完成需要 root 权限的操作后恢复正常的非 root 状态时很有用。
37. usb
用于特定情况下重新启动usb链接
adb usb
主要功能是:
- 重新启动USB连接;
- 主要用于从无线(TCP/IP)模式切换回USB模式
使用场景:
- 当设备当前通过 Wi-Fi 连接到 ADB 时
- 需要从无线调试切换回 USB 调试时
38. tcp/ip PORT
adb tcp/ip PORT
用于设置无线 ADB 连接的重要命令,允许开发者通过 Wi-Fi 网络连接到 Android 设备,而不是传统的 USB 连接。
主要功能如下:
- 将 ADB 守护进程(adbd)重启到指定的 TCP 端口
- 使设备准备好接受无线 ADB 连接
使用场景:
- 远程调试 Android 设备
- 在不使用 USB 线的情况下连接设备
- 同时操作多个设备
执行步骤:
a. 通过 USB 连接设备
b. 运行adb tcpip 5555
c. 断开 USB 连接
d. 使用adb connect IP_ADDRESS:5555
建立无线连接优点:
- 提供更大的移动自由度
- 允许在不同位置的设备间快速切换
- 便于在多个设备上同时工作
注意事项:
- 设备必须与电脑在同一个 Wi-Fi 网络
- 需要知道设备的 IP 地址
- 可能存在安全风险,应在受信任的网络中使用
在脚本中应用:
adb tcpip 5555 adb connect 192.168.1.100:5555 # 执行无线调试操作 adb disconnect 192.168.1.100:5555
39. Restart-server/kill-server
用于管理adb服务器的重要命令,用于解决ADB连接问题和重置ADB状态问题。
adb kill-server
停止当前运行的 ADB 服务器进程
adb restart-server
停止当前的 ADB 服务器,然后立即启动一个新的服务器
在脚本中使用:
adb kill-server sleep 2 adb start-server # 或者直接使用 adb restart-server
40. reconnect
adb reconnect
尝试重新连接当前已断开或不稳定的 ADB 连接, 对所有连接的设备执行重新连接操作.
adb环境变量详解
1. ADB_TRACE
用于控制 ADB 的调试输出级别,设置方法为:
export ADB_TRACE=1
可能的值:
- 1: 基本信息
- 2: 详细信息
- 3: 更详细的信息
- 4: 最详细的调试信息
用途:
- 调试 ADB 连接问题
- 了解 ADB 内部工作过程
- 排查复杂的设备通信问题
2. ANDROID_SERIAL
指定默认的 Android 设备,设置方法为:
export ANDROID_SERIAL=<device_serial_number>
在有多个设备连接时,无需每次指定设备
3. ANDROID_ADB_SERVER_PORT
export ANDROID_ADB_SERVER_PORT=<port_number>
指定 ADB 服务器使用的端口
4. ADB_VENDOR_KEYS
export ADB_VENDOR_KEYS=<path_to_keys>
指定 ADB 厂商密钥的路径
5. ANDROID_HOME
export ANDROID_HOME=<path_to_android_sdk>
指定 Android SDK 的安装路径
6. 包含 ADB 可执行文件的路径
export PATH=$PATH:$ANDROID_HOME/platform-tools
包含 ADB 可执行文件的路径
7. ADB_LOCAL_TRANSPORT_MAX_PORT
export ADB_LOCAL_TRANSPORT_MAX_PORT=<max_port_number>
设置本地传输的最大端口号
8. export ADB_MDNS_AUTO_CONNECT=1
export ADB_MDNS_AUTO_CONNECT=1
控制 ADB 是否自动连接到 mDNS 发现的设备