adb -d install app.apk
d
代表device
,具体含义为指定 ADB 命令应该作用于唯一连接的 USB 设备。
这个参数通常用于以下场景:
-d
可以确保命令只作用于通过 USB 连接的物理设备。-d
可以确保命令只针对物理设备执行。-d
可以避免 ADB 搜索其他可能的连接(如网络设备或模拟器)。adb -e install app.apk
e
代表emulator
, 用于连接唯一运行的模拟器实例。
这个参数通常用于以下场景:
-e
可以确保命令只作用于模拟器。-e
可以快速指向该模拟器,而不需要指定模拟器的名称或端口。-e
参数可以简化这个过程。adb -s install app.apk
-s
参数代表 “serial”, 用于连接指定序列号的设备。
这个参数通常用于以下场景:
-s
可以精确指定要操作的设备。-s
可以确保命令作用于正确的设备。-s
参数非常有用。adb -t shell
-t
参数代表 “transport_id”, 作用于特定传输 ID 的设备。
这个参数通常用于以下场景:
-t
来指定特定的传输通道。当然这个transport_id
是一个内部序列号,不像设备序列号那样容易获取或识别。它主要用于一些比较特殊的状况,大多数日常 Android 开发和调试工作不需要使用它。
adb -H 192.168.1.12 devices
-H
参数代表 “host”, 用于指定运行的主机名或 IP 地址。
这个参数通常用于以下场景:
使用 -H
参数时需要注意:
-P
参数来指定端口号。adb -P 5037 devices
-P
参数代表 “port”, 指定要连接的 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 会话。
注意事项:
-P
参数,ADB 会尝试连接到这个默认端口。-P
参数通常与 -H
参数一起使用,特别是在连接到远程 ADB 服务器时。adb -L tcp:xxx
-L
参数代表 “listen”,用于指定一个地址和端口,让 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 --one-device install app.apk
只在单个设备上执行,即使有多个设备连接到计算机。经常看到错误日志more than one devices
的问题,那么就可以使用one-device
参数了。
使用场景是:
自动化脚本:确保脚本在单一设备环境中运行。
快速测试:当你知道只应该有一个设备连接时,可以使用此参数进行快速检查。
adb --exit-on-write-error push large_file.dat /sdcard/
遇到写入错误时,立即退出 ADB 命令. 比如以上命令是尝试将 large_file.dat 推送到设备的 /sdcard/ 目录。如果在传输过程中遇到任何写入错误,命令将立即退出。
使用场景:
大文件传输:确保大文件完整无误地传输到设备。
自动化脚本:在文件同步或安装过程中快速捕获并响应错误。
关键数据操作:当数据完整性至关重要时。
这个参数在需要严格控制数据完整性的情况下特别有用,比如在系统更新、重要数据备份或其他关键文件传输操作中。它提供了一种快速失败的机制,有助于及时发现和处理传输错误。
adb connect 127.0.0.1:2333 adb disconnect 127.0.0.1:2333
通过 Wi-Fi 或以太网连接到 Android 设备,而不是使用 USB 连接. 如果不指定端口,默认端口是5555
adb pair : [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
来建立实际的调试连接。
forward
是一个用于设置端口转发的 ADB 命令。它允许你将主机(可以理解为电脑)上的端口转发到连接的 Android 设备或模拟器上的端口。
主要用途:
基本语法:
adb forward
其中 是主机上的规范,是设备上的规范。
常见的规范类型为:
tcp:
: TCP 端口localabstract:
: Android 的抽象 Unix 域套接字localreserved:
: 保留的 Unix 域套接字localfilesystem:
: Unix 域套接字dev:
: 字符设备使用实例:
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: 如果指定的本地规范已经被使用,则不重新绑定它。
用于列出所有已设置的端口转发规则的 ADB 命令。
$ adb forward --list emulator-5554 tcp:5000 tcp:6000 1234567890ABCDEF tcp:8080 tcp:9090
输出的每一行都包含三个部分:设备序列号、本地规范和远程规范。
与forward 功能一致,但是转发方向是相反的,用于设置从 Android 设备到主机(电脑)的端口转发。
adb reverse
其中
是设备上的规范,
是主机上的规范。
使用场景:
使用例子:
adb reverse tcp:8081 tcp:8081
意味着将设备上的 8081 端口转发到主机上的 8081 端口。熟悉 React Native 开发的人应该经常用这个命令。
当然后面的 --remove
, --remove-all
和--no-rebind
功能与forward
功能一致。
用于检查设备 mDNS(多播 DNS)服务状态的 ADB 命令,主要用于无线调试相关的功能。
主要用途:
使用场景:
如果 mDNS 服务正常运行并广播,可能会显示类似 “OK” 或详细的状态信息;如果存在问题,会显示错误信息或状态说明
使用方式:
adb mdns check
用于列出设备上当前广播的 mDNS(多播 DNS)服务,主要用于无线调试和网络服务发现相关的功能。
主要用途:
列出设备上当前正在广播的 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 开发).
将文件或目录从计算机复制到 Android 设备:
push [--sync] [-z ALGORITHM] [-Z] LOCAL... REMOTE
[--sync]
意义:同步模式
功能:只复制新的或已修改的文件,跳过已存在且未更改的文件
用途:提高效率,特别是在推送大量文件或频繁更新时
[-z ALGORITHM]
意义:压缩传输
功能:使用指定的算法压缩数据进行传输
ALGORITHM 可以是:
brotli
lz4
zstd
用途:减少传输时间,特别是在网络带宽有限的情况下
[-Z]
意义:禁用压缩
功能:即使默认启用了压缩,也强制不使用压缩
用途:当传输已经压缩的文件(如 zip、jpeg)时,避免不必要的压缩处理
LOCAL...
意义:本地源文件或目录
功能:指定要推送的本地文件或目录
注意:...
表示可以指定多个本地源
REMOTE
pull [-a] [-z ALGORITHM] [-Z] REMOTE... LOCAL
从 Android 设备拉取(复制)文件或目录到本地计算机。详细解析这些参数:
[-a]
意义:保留文件时间戳
功能:保持原文件的时间戳不变,而不是使用当前时间
用途:在需要保持文件原始时间属性的情况下很有用,如备份或同步操作
[-z ALGORITHM]
意义:压缩传输
功能:使用指定的算法压缩数据进行传输
ALGORITHM 可以是:
brotli
lz4
zstd
用途:减少传输时间,特别是在网络带宽有限的情况下
[-Z]
意义:禁用压缩
功能:即使默认启用了压缩,也强制不使用压缩
用途:当传输已经压缩的文件(如 zip、jpeg)时,避免不必要的压缩处理
REMOTE...
意义:Android 设备上的源文件或目录
功能:指定要拉取的设备上的文件或目录
注意:...
表示可以指定多个远程源
LOCAL
用于在本地开发机和 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
注意事项:
用于在连接的 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...]
使用实例:
使用自定义转义字符:
adb shell -e ^
强制使用原始终端模式执行命令:
adb shell -T "ps | grep com.example.app"
禁用远程 shell 协议执行命令:
adb shell -x "echo Hello > /sdcard/test.txt"
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 文件路径
实例:
基本安装:
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
但是需要注意的事项为:
-p
选项时要确保安装的 APK 组合是有效的,否则可能导致应用无法正常运行;install-multiple
命令在处理现代 Android 应用分发格式(如 App Bundles)时特别有用,它允许开发者更灵活地管理复杂的应用结构和不同的设备配置。当然,我们还可以同时安装不同包名的app,命令为:
install-multi-package [-lrtsdpg] [--instant] PACKAGE...
举例为:
adb install-multi-package app1.apk app2.apk app3.apk
卸载指定的应用
adb uninstall -k packagename
-k : 保留缓存文件和数据文件夹
一个非常有用的 Android 调试工具,用于生成设备的详细诊断报告。这个命令会收集大量的系统信息和日志,对于开发者和技术支持人员来说非常有价值。
主要用法很简单,直接
adb bugreport
用于收集设备的全面诊断信息,并生成一个包含系统状态、日志和其他重要数据的报告。
主要生成包括:
是与 Java Debug Wire Protocol (JDWP) 相关的一个重要调试工具,用于列出和操作设备上可调试的 Java 进程。命令为:
adb jdwp
直接输出andorid的logcat
adb logcat
即可查看android logcat日志
命令用于禁用 Android 设备上的 dm-verity(设备映射完整性验证)。这是一个高级命令,主要用于开发和测试目的。
命令行为:
adb disable-verify
dm-verity 简介:
一种 Linux 内核安全特性
用于验证块设备(如系统分区)的完整性
防止未经授权的系统修改
使用场景:
系统级开发和测试
修改系统文件或分区
安装某些需要系统级修改的应用或模块
执行效果:
禁用后,系统将不再验证系统分区的完整性
允许对系统分区进行写入操作
注意事项:
需要设备已解锁 bootloader
通常需要 root 权限
会降低设备的安全性
可能导致 OTA 更新失败
重要警告:
禁用 dm-verity 可能使设备更容易受到攻击
不建议在个人使用的设备上禁用
相关命令:
adb enable-verity
: 重新启用 dm-verity
adb reboot
: 在禁用/启用 verity 后需要重启设备
使用步骤:
a. 确保设备已解锁 bootloader 并启用 USB 调试
b. 执行 adb disable-verity
c. 重启设备:adb reboot
keygen FILE
命令用于生成 ADB(Android Debug Bridge)认证密钥。这个命令在 ADB 安全性和设备认证方面扮演着重要角色,使用方式如下:
adb keygen FILE
功能:
生成一个新的 ADB 私钥-公钥对
将生成的密钥保存到指定的文件中
参数:
生成的文件:
私钥文件:指定的 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 keygen ~/.android/adbkey
这将在 ~/.android/
目录下生成 adbkey
(私钥)和 adbkey.pub
(公钥)文件。
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
命令来处理多设备情况返回当前连接的 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
用于获取连接的 Android 设备的序列号
adb get-serialno
返回当前连接的 Android 设备的唯一序列号, 没有设备连接返回"unknown".
获取连接的 Android 设备的设备路径。这个命令提供了设备在系统中的物理连接路径信息.
adb get-devpath
对于 USB 连接的设备,可能返回类似 usb:337641472X ,对于模拟器或无线连接的设备,可能返回 unknown
.
用于重新挂载设备的文件系统,通常是为了获得对系统分区的写入权限。
adb remount adb remount -R
功能:
-R
选项:
使用场景:
先决条件:
安全影响:
使用步骤:
a. 确保设备已root且USB调试已启用
b. 执行 adb remount
c. 如果使用 -R
,设备将自动重启
常见用途:
注意事项:
与其他命令结合:
通常与 adb push
和 adb pull
一起使用来修改系统文件
例如:
basic
复制
adb remount adb push modified_file.so /system/lib/
恢复方法:
在开发中的应用:
区别于普通root:
潜在风险:
最佳实践:
用于重启 Android 设备,并可以指定重启到特定模式。这是一个非常有用的命令,特别是在开发、测试和设备维护过程中。
adb rebot [mode]
用于在 Android 设备上安装系统更新包(OTA 包)的 ADB 命令。这是一种直接通过电脑向设备安装系统更新的方法,特别适用于无法通过正常 OTA 更新或想要手动安装特定版本系统的情况。
adb sideload
使用步骤:
a. 将设备重启到 Recovery 模式
b. 在 Recovery 菜单中选择 “Apply update from ADB”
c. 在计算机上执行 adb sideload
命令
先决条件:
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 前为设备充足电
保持良好的 USB 连接,避免中断
在执行更新后验证系统的完整性
用于获取 Android 设备 root 权限的 ADB 命令
root的反向操作,用于退出ADB的root模式。这个命令在完成需要 root 权限的操作后恢复正常的非 root 状态时很有用。
用于特定情况下重新启动usb链接
adb usb
主要功能是:
使用场景:
adb tcp/ip PORT
用于设置无线 ADB 连接的重要命令,允许开发者通过 Wi-Fi 网络连接到 Android 设备,而不是传统的 USB 连接。
主要功能如下:
使用场景:
执行步骤:
a. 通过 USB 连接设备
b. 运行 adb tcpip 5555
c. 断开 USB 连接
d. 使用 adb connect IP_ADDRESS:5555
建立无线连接
优点:
注意事项:
在脚本中应用:
adb tcpip 5555 adb connect 192.168.1.100:5555 # 执行无线调试操作 adb disconnect 192.168.1.100:5555
用于管理adb服务器的重要命令,用于解决ADB连接问题和重置ADB状态问题。
adb kill-server
停止当前运行的 ADB 服务器进程
adb restart-server
停止当前的 ADB 服务器,然后立即启动一个新的服务器
在脚本中使用:
adb kill-server sleep 2 adb start-server # 或者直接使用 adb restart-server
adb reconnect
尝试重新连接当前已断开或不稳定的 ADB 连接, 对所有连接的设备执行重新连接操作.
用于控制 ADB 的调试输出级别,设置方法为:
export ADB_TRACE=1
可能的值:
用途:
指定默认的 Android 设备,设置方法为:
export ANDROID_SERIAL=
在有多个设备连接时,无需每次指定设备
export ANDROID_ADB_SERVER_PORT=
指定 ADB 服务器使用的端口
export ADB_VENDOR_KEYS=
指定 ADB 厂商密钥的路径
export ANDROID_HOME=
指定 Android SDK 的安装路径
export PATH=$PATH:$ANDROID_HOME/platform-tools
包含 ADB 可执行文件的路径
export ADB_LOCAL_TRANSPORT_MAX_PORT=
设置本地传输的最大端口号
export ADB_MDNS_AUTO_CONNECT=1
控制 ADB 是否自动连接到 mDNS 发现的设备
下一篇:【网络协议】ISIS