adb参数详解

1. -d
adb -d install app.apk

d代表device,具体含义为指定 ADB 命令应该作用于唯一连接的 USB 设备。

这个参数通常用于以下场景:

  1. 多设备环境:当你有多个 Android 设备(或模拟器)连接到计算机时,使用 -d 可以确保命令只作用于通过 USB 连接的物理设备。
  2. 排除模拟器:当你同时运行模拟器和连接了物理设备时,使用 -d 可以确保命令只针对物理设备执行。
  3. 提高效率:在只有一个 USB 设备连接的情况下,使用 -d 可以避免 ADB 搜索其他可能的连接(如网络设备或模拟器)。
2. -e
adb -e install app.apk

e代表emulator, 用于连接唯一运行的模拟器实例。

这个参数通常用于以下场景:

  1. 多设备环境:当你同时有物理设备和模拟器运行时,使用 -e 可以确保命令只作用于模拟器。
  2. 多模拟器环境:如果你只运行了一个模拟器实例,使用 -e 可以快速指向该模拟器,而不需要指定模拟器的名称或端口。
  3. 测试和开发:在进行应用开发和测试时,经常需要在模拟器上运行命令,-e 参数可以简化这个过程。
3. -s
adb -s install app.apk

-s 参数代表 “serial”, 用于连接指定序列号的设备。

这个参数通常用于以下场景:

  1. 多设备环境:当你同时连接了多个 Android 设备或模拟器时,使用 -s 可以精确指定要操作的设备。
  2. 自动化脚本:在编写自动化测试或部署脚本时,使用 -s 可以确保命令作用于正确的设备。
  3. 特定设备操作:当你需要在多个设备中对特定设备执行操作时,-s 参数非常有用。
4. -t
adb -t <transport_id> shell

-t 参数代表 “transport_id”, 作用于特定传输 ID 的设备。

这个参数通常用于以下场景:

  1. 高级调试:当设备有多个传输通道时(例如,同时通过 USB 和网络连接),可以使用 -t 来指定特定的传输通道。
  2. 特殊开发环境:在某些复杂的开发或测试环境中,可能需要精确控制 ADB 使用的传输通道。
  3. 系统级开发:对 Android 系统本身进行开发或调试时,可能会用到这个参数。

当然这个transport_id是一个内部序列号,不像设备序列号那样容易获取或识别。它主要用于一些比较特殊的状况,大多数日常 Android 开发和调试工作不需要使用它。

5. -H
adb -H 192.168.1.12 devices

-H 参数代表 “host”, 用于指定运行的主机名或 IP 地址。

这个参数通常用于以下场景:

  1. 远程调试:当 ADB 服务器运行在远程机器上,而不是本地机器时。
  2. 网络环境:在复杂的网络设置中,可能需要明确指定 ADB 服务器的位置。
  3. 自定义开发环境:某些特殊的开发或测试环境可能需要连接到特定主机上的 ADB 服务器。

使用 -H 参数时需要注意

  1. 默认情况下,ADB 客户端连接到本地(localhost)的 ADB 服务器。
  2. 使用远程 ADB 服务器时,需要确保网络连接正常,且远程主机允许 ADB 连接。
  3. 在某些情况下,可能还需要配合使用 -P 参数来指定端口号。
6. -P
adb -P 5037 devices

-P 参数代表 “port”, 指定要连接的 ADB 服务器的端口号。

这个参数通常用于以下场景:

  1. 自定义端口:当 ADB 服务器运行在非默认端口上时(adb默认端口是5037)。
  2. 多 ADB 服务器:在同一台机器上运行多个 ADB 服务器实例,每个使用不同的端口。
  3. 网络调试:通过网络连接到远程 ADB 服务器时,可能需要指定特定的端口。
  4. 防火墙配置:在某些网络环境中,可能只有特定端口允许 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 会话。

注意事项

  1. ADB 的默认端口是 5037。如果不指定 -P 参数,ADB 会尝试连接到这个默认端口。
  2. -P 参数通常与 -H 参数一起使用,特别是在连接到远程 ADB 服务器时。
  3. 使用非默认端口时,需要确保该端口未被其他服务占用,并且在必要的防火墙中开放。
7. -L
adb -L tcp:xxx

-L 参数代表 “listen”,用于指定一个地址和端口,让 ADB 服务器监听这个地址和端口上的连接。

这个参数主要用于以下场景:

  1. 远程调试:允许其他机器通过网络连接到这个ADB服务器;
  2. 自定义网络配置:在特定的网络环境中,可能需要ADB服务器监听特定的地址或者端口;
  3. 安全性考虑:可以限制ADB服务器只监听特定的网络接口。
adb -L tcp:5037

这条命令会让 ADB 服务器监听所有网络接口的 5037 端口(ADB 的默认端口)。

adb -L tcp:192.168.1.100:5555

这条命令会让 ADB 服务器只在 IP 地址 192.168.1.100 的 5555 端口上监听连接。

注意事项:

  1. 使用 -L 参数时,ADB 服务器会重新启动并开始监听指定的地址和端口。
  2. 这个参数主要用于 ADB 服务器的配置,而不是用于执行常规的 ADB 命令。
  3. 使用此参数可能会带来安全风险,因为它可能允许网络上的其他设备连接到你的 ADB 服务器。在使用时应确保网络环境是安全的。
  4. 在某些情况下,你可能需要配合使用防火墙规则来控制对这个端口的访问。
8. --one-device
adb --one-device install app.apk

只在单个设备上执行,即使有多个设备连接到计算机。经常看到错误日志more than one devices的问题,那么就可以使用one-device参数了。

使用场景是:

  1. 自动化脚本:确保脚本在单一设备环境中运行。

  2. 快速测试:当你知道只应该有一个设备连接时,可以使用此参数进行快速检查。

9. --exit-on-write-error
adb --exit-on-write-error push large_file.dat /sdcard/

遇到写入错误时,立即退出 ADB 命令. 比如以上命令是尝试将 large_file.dat 推送到设备的 /sdcard/ 目录。如果在传输过程中遇到任何写入错误,命令将立即退出。

使用场景:

  1. 大文件传输:确保大文件完整无误地传输到设备。

  2. 自动化脚本:在文件同步或安装过程中快速捕获并响应错误。

  3. 关键数据操作:当数据完整性至关重要时。

这个参数在需要严格控制数据完整性的情况下特别有用,比如在系统更新、重要数据备份或其他关键文件传输操作中。它提供了一种快速失败的机制,有助于及时发现和处理传输错误。

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

注意事项:

  1. 仅适用于 Android 11 及更高版本。

  2. 配对过程有时间限制,通常需要在设备显示配对码后的短时间内完成。

  3. 配对成功后,还需要使用 adb connect 来建立实际的调试连接。

12. forward

forward 是一个用于设置端口转发的 ADB 命令。它允许你将主机(可以理解为电脑)上的端口转发到连接的 Android 设备或模拟器上的端口。

主要用途:

  1. 创建从主机(电脑)到 Android 设备的端口转发;
  2. 允许主机(电脑)上运行的应用与设备上的服务进行通信。

基本语法:

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 命令,主要用于无线调试相关的功能。

主要用途:

  1. 检查设备上的 mDNS 服务是否正在运行和广播;
  2. 用于无线调试功能的诊断。

使用场景:

  1. 设置无线调试时的故障排除
  2. 验证设备是否准备好进行无线配对和连接
  3. 诊断无线 ADB 连接问题

如果 mDNS 服务正常运行并广播,可能会显示类似 “OK” 或详细的状态信息;如果存在问题,会显示错误信息或状态说明

使用方式:

adb mdns check
16. mdns services

用于列出设备上当前广播的 mDNS(多播 DNS)服务,主要用于无线调试和网络服务发现相关的功能。

主要用途:

  1. 列出设备上当前正在广播的 mDNS 服务。

  2. 用于诊断和验证无线调试和其他网络服务。

使用场景:

  1. 验证无线调试服务是否正在广播
  2. 检查设备上其他使用 mDNS 的应用或服务
  3. 网络服务发现和诊断
$ 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
  1. [--sync]

    • 意义:同步模式

    • 功能:只复制新的或已修改的文件,跳过已存在且未更改的文件

    • 用途:提高效率,特别是在推送大量文件或频繁更新时

  2. [-z ALGORITHM]

    • 意义:压缩传输

    • 功能:使用指定的算法压缩数据进行传输

    • ALGORITHM 可以是:

      • brotli
      • lz4
      • zstd
    • 用途:减少传输时间,特别是在网络带宽有限的情况下

  3. [-Z]

    • 意义:禁用压缩

    • 功能:即使默认启用了压缩,也强制不使用压缩

    • 用途:当传输已经压缩的文件(如 zip、jpeg)时,避免不必要的压缩处理

  4. LOCAL...

    • 意义:本地源文件或目录

    • 功能:指定要推送的本地文件或目录

    • 注意:... 表示可以指定多个本地源

  5. REMOTE

    • 意义:远程目标路径
    • 功能:指定 Android 设备上的目标位置
18. pull
pull [-a] [-z ALGORITHM] [-Z] REMOTE... LOCAL

从 Android 设备拉取(复制)文件或目录到本地计算机。详细解析这些参数:

  1. [-a]

    • 意义:保留文件时间戳

    • 功能:保持原文件的时间戳不变,而不是使用当前时间

    • 用途:在需要保持文件原始时间属性的情况下很有用,如备份或同步操作

  2. [-z ALGORITHM]

    • 意义:压缩传输

    • 功能:使用指定的算法压缩数据进行传输

    • ALGORITHM 可以是:

      • brotli
      • lz4
      • zstd
    • 用途:减少传输时间,特别是在网络带宽有限的情况下

  3. [-Z]

    • 意义:禁用压缩

    • 功能:即使默认启用了压缩,也强制不使用压缩

    • 用途:当传输已经压缩的文件(如 zip、jpeg)时,避免不必要的压缩处理

  4. REMOTE...

    • 意义:Android 设备上的源文件或目录

    • 功能:指定要拉取的设备上的文件或目录

    • 注意:... 表示可以指定多个远程源

  5. LOCAL

    • 意义:本地目标路径
    • 功能:指定文件或目录在本地计算机上的保存位置
19. sync

用于在本地开发机和 Android 设备之间同步文件系统。这个命令主要用于系统级开发,如定制 ROM 或系统应用开发。使用模式如下:

 sync [-l] [-z ALGORITHM] [-Z] [all|data|odm|oem|product|system|system_ext|vendor]

参数如下:

  1. [-l]

    • 意义:列表模式(List only)

    • 功能:只列出要同步的文件,但不实际执行同步操作

    • 用途:预览将要同步的内容,用于检查和验证

  2. [-z ALGORITHM]

    • 意义:压缩传输

    • 功能:使用指定的算法压缩数据进行传输

    • ALGORITHM 可以是:

      • brotli
      • lz4
      • zstd
    • 用途:减少传输时间,特别是在同步大量数据时

  3. [-Z]

    • 意义:禁用压缩

    • 功能:即使默认启用了压缩,也强制不使用压缩

    • 用途:当同步已压缩的文件时,避免不必要的压缩处理

  4. 同步选项:

    • all: 同步所有分区
    • data: 同步 /data 分区
    • odm: 同步 /odm 分区(设备特定的修改)
    • oem: 同步 /oem 分区(原始设备制造商修改)
    • product: 同步 /product 分区(产品特定的配置)
    • system: 同步 /system 分区
    • system_ext: 同步 /system_ext 分区(系统扩展)
    • vendor: 同步 /vendor 分区(供应商特定的修改)

使用实例:

  1. 列出需要同步的系统文件:

    adb sync -l system
    
  2. 使用压缩同步所有分区:

    adb sync -z zstd all
    
  3. 同步 vendor 分区但不使用压缩:

    adb sync -Z vendor
    
  4. 同步 data 分区:

    adb sync data
    

注意事项

  1. 权限要求:
    • 同步系统分区通常需要设备有 root 权限或处于解锁状态。
    • 对于生产设备,许多分区可能是只读的,无法同步。
  2. 使用场景:
    • 主要用于系统开发、ROM 定制和 OEM 开发。
    • 不适用于常规应用开发或用户级操作。
  3. 数据安全:
    • 同步操作可能会覆盖设备上的现有数据,使用时需谨慎。
20.shell

用于在连接的 Android 设备上启动一个交互式 shell 会话或执行特定的 shell 命令。这是一个非常强大的工具,允许开发者直接与 Android 设备的底层系统交互。我们来看一下其详细参数:

adb shell [-e ESCAPE] [-n] [-Tt] [-x] [COMMAND...] 
  1. [-e ESCAPE]

    • 意义:设置escape字符

    • 功能:指定用于终止 adb shell 会话的转义字符

    • 默认值:~(波浪号)

    • 用途:当默认的转义字符与您的输入冲突时,可以自定义

  2. [-n]

    • 意义:不读取或执行 rc 文件

    • 功能:启动 shell 时不读取和执行 shell 的启动文件(如 .bashrc)

    • 用途:获得一个"干净"的 shell 环境,不受本地配置影响

  3. [-T]

    • 意义:强制使用原始终端模式

    • 功能:禁用 PTY(伪终端)分配

    • 用途:在某些脚本或自动化场景中有用,可以避免某些终端相关的问题

  4. [-t]

    • 意义:强制使用终端模式

    • 功能:强制分配一个 PTY

    • 用途:确保获得一个完整的交互式 shell

  5. [-x]

    • 意义:禁用远程 shell 协议

    • 功能:使用简单的 stdin/stdout 传输,而不是更高级的 shell 协议

    • 用途:在某些兼容性问题或调试场景中有用

  6. [COMMAND...]

    • 意义:要在设备上执行的 shell 命令
    • 功能:直接执行指定的命令,而不是启动交互式 shell
    • 用途:快速执行单个或一系列命令

使用实例:

  1. 使用自定义转义字符:

    adb shell -e ^
    
  2. 强制使用原始终端模式执行命令:

    adb shell -T "ps | grep com.example.app"
    
  3. 禁用远程 shell 协议执行命令:

    adb shell -x "echo Hello > /sdcard/test.txt"
    
21. install

adb install 命令用于将 Android 应用程序(APK 文件)安装到连接的 Android 设备上。详细参数为:

adb install [-lrtsdg] [--instant] PACKAGE
  1. -l: 锁定应用程序

    • 意义:将应用程序安装到 /data/app-private

    • 用途:使应用程序无法被备份或移动到外部存储

  2. -r: 替换已存在的应用程序

    • 意义:如果应用程序已经存在,则重新安装并保留其数据

    • 用途:更新已安装的应用程序

  3. -t: 允许安装测试 APK

    • 意义:允许安装标记为测试的应用程序

    • 用途:用于安装专门用于测试的 APK 版本

  4. -s: 将应用程序安装到 sdcard

    • 意义:将应用程序安装到外部存储(如 SD 卡)而不是内部存储

    • 用途:当设备内部存储空间不足时使用

  5. -d: 允许版本降级

    • 意义:允许安装比当前安装版本更低版本的应用程序

    • 用途:测试旧版本或特定版本的应用程序

  6. -g: 授予应用程序清单中列出的所有权限

    • 意义:自动授予应用程序请求的所有权限,无需用户确认

    • 用途:简化测试过程,避免手动授权步骤

  7. --instant: 将应用程序作为即时应用安装

    • 意义:安装即时应用版本

    • 用途:用于测试和部署即时应用

  8. PACKAGE: 要安装的 APK 文件路径

    • 意义:指定要安装的 APK 文件的位置
    • 可以是设备上的路径,也可以是本地计算机上的路径

实例:

  1. 基本安装:

    adb install app.apk
    
  2. 替换已存在的应用:

    adb install -r app.apk
    
  3. 安装测试 APK 并自动授予权限:

    adb install -t -g test_app.apk
    
  4. 允许降级安装:

    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

但是需要注意的事项为:

  1. 这个命令主要用于处理拆分 APK 或应用包(App Bundles)生成的多个 APK 文件;
  2. 所有指定的 APK 必须属于同一个应用(具有相同的包名);
  3. 使用 -p 选项时要确保安装的 APK 组合是有效的,否则可能导致应用无法正常运行;
  4. 安装多个 APK 可能需要更长的时间,特别是在较旧或性能较低的设备上;
  5. 不是所有 Android 设备或 ADB 版本都支持所有这些选项,使用前可能需要验证兼容性;
  6. 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
  1. dm-verity 简介:

    • 一种 Linux 内核安全特性

    • 用于验证块设备(如系统分区)的完整性

    • 防止未经授权的系统修改

  2. 使用场景:

    • 系统级开发和测试

    • 修改系统文件或分区

    • 安装某些需要系统级修改的应用或模块

  3. 执行效果:

    • 禁用后,系统将不再验证系统分区的完整性

    • 允许对系统分区进行写入操作

  4. 注意事项:

    • 需要设备已解锁 bootloader

    • 通常需要 root 权限

    • 会降低设备的安全性

    • 可能导致 OTA 更新失败

  5. 重要警告:

    • 禁用 dm-verity 可能使设备更容易受到攻击

    • 不建议在个人使用的设备上禁用

  6. 相关命令:

    • adb enable-verity: 重新启用 dm-verity

    • adb reboot: 在禁用/启用 verity 后需要重启设备

  7. 使用步骤:
    a. 确保设备已解锁 bootloader 并启用 USB 调试
    b. 执行 adb disable-verity
    c. 重启设备:adb reboot

27. keygen FILE

keygen FILE 命令用于生成 ADB(Android Debug Bridge)认证密钥。这个命令在 ADB 安全性和设备认证方面扮演着重要角色,使用方式如下:

adb keygen FILE
  1. 功能:

    • 生成一个新的 ADB 私钥-公钥对

    • 将生成的密钥保存到指定的文件中

  2. 参数:

    • FILE: 指定生成的密钥文件的路径和名称
  3. 生成的文件:

    • 私钥文件:指定的 FILE

    • 公钥文件:FILE.pub

  4. 用途:

    • 用于 ADB 客户端和 Android 设备之间的安全认证

    • 替换默认的 ADB 密钥对

  5. 安全性:

    • 增强 ADB 连接的安全性

    • 允许自定义和管理 ADB 认证密钥

  6. 使用场景:

    • 设置新的开发环境

    • 增强 ADB 连接的安全性

    • 在多个开发者之间共享一个通用的 ADB 密钥

  7. 密钥工作原理:

    • 私钥保存在开发机器上

    • 公钥需要添加到 Android 设备的授权密钥列表中

  8. 后续步骤:

    • 生成密钥后,需要将公钥添加到 Android 设备

    • 通常通过将公钥复制到设备的 /data/misc/adb/adb_keys 文件中

  9. 注意事项:

    • 生成新密钥后,可能需要重新授权 ADB 连接

    • 保护生成的私钥文件的安全,不要分享给他人

  10. 相关命令:

    • adb pubkey: 显示 ADB 公钥

    • adb connect: 使用新密钥连接到设备

  11. 最佳实践:

    • 定期更新 ADB 密钥以提高安全性

    • 在共享开发环境中使用自定义密钥

    • 妥善保管生成的私钥文件

  12. 密钥管理:

    • 可以为不同项目或环境生成不同的密钥对

    • 在多人开发团队中,可以使用共享的密钥对

  13. 故障排除:

    • 如果新密钥不工作,确保公钥正确添加到设备

    • 检查 ADB 服务器是否正在使用新密钥

  14. 安全建议:

    • 不要在不受信任的网络上使用 ADB
    • 定期检查已授权的 ADB 密钥列表

使用实例:

adb keygen ~/.android/adbkey

这将在 ~/.android/ 目录下生成 adbkey(私钥)和 adbkey.pub(公钥)文件。

28. wait-for[-TRANSPORT]-STATE…

wait-for-[TRANSPORT]-STATE 命令是一个非常有用的工具,用于等待设备进入特定状态。这个命令在自动化脚本和持续集成/持续部署(CI/CD)流程中特别有价值。让我们详细解析这个命令:

  1. 基本语法:

    adb wait-for-[TRANSPORT]-STATE
    
  2. TRANSPORT 选项:

    • device: 等待任何设备

    • usb: 只等待 USB 连接的设备

    • local: 只等待通过 TCP/IP 连接的设备

  3. STATE 选项:

    • device: 设备已连接并可用

    • recovery: 设备处于恢复模式

    • sideload: 设备处于 sideload 模式

    • bootloader: 设备处于 bootloader 模式

    • disconnect: 设备断开连接

  4. 功能:

    • 阻塞执行,直到指定的设备状态出现

    • 当设备进入指定状态时,命令返回

  5. 使用场景:

    • 自动化测试脚本

    • 设备刷机流程

    • CI/CD 管道中的设备操作

  6. 常见用法示例:

    • 等待任何设备连接:

      adb wait-for-device
      
    • 等待 USB 设备进入 recovery 模式:

      adb wait-for-usb-recovery
      
    • 等待本地(TCP/IP)设备连接:

      adb wait-for-local-device
      
  7. 超时行为:

    • 命令默认没有超时限制,会一直等待直到条件满足

    • 可以通过脚本或其他方式设置超时逻辑

  8. 脚本集成:

    • 常用于 shell 脚本中,在执行其他 ADB 命令之前确保设备就绪

    • 例如:

      adb wait-for-device && adb shell some_command
      
  9. 调试用途:

    • 帮助开发者跟踪设备状态变化

    • 在复杂的设备操作流程中提供同步点

  10. 注意事项:

    • 如果有多个设备连接,命令可能会对第一个匹配条件的设备响应

    • 在使用 local 选项时,确保已正确设置 TCP/IP 连接

  11. 与其他命令结合:

    • 常与 adb reboot 等命令配合使用

    • 例如,重启到 recovery 并等待:

      adb reboot recovery && adb wait-for-recovery
      
  12. 在 CI/CD 中的应用:

    • 确保设备在执行测试或部署前处于正确状态

    • 提高自动化流程的稳定性

  13. 故障排除:

    • 如果命令似乎卡住,检查设备连接和状态

    • 确保 ADB 服务器正在运行

  14. 最佳实践:

    • 在脚本中加入适当的超时机制

    • 考虑添加错误处理逻辑,以应对设备未能进入预期状态的情况

  15. 高级用法:

    • 可以结合 adb devices 命令来处理多设备情况
    • 在复杂的刷机或恢复流程中作为检查点
29. get-state

返回当前连接的 Android 设备的状态

adb get-state
  1. 可能的输出状态:

    • device: 设备已连接且可用

    • offline: 设备已连接但不可用

    • unknown: 设备状态未知

    • bootloader: 设备处于 bootloader 模式

    • recovery: 设备处于恢复模式

    • sideload: 设备处于 sideload 模式

    • unauthorized: 设备已连接但未授权 ADB 连接

  2. 使用场景:

    • 快速检查设备状态

    • 在脚本中用于条件判断

    • 故障排除过程中确认设备连接状态

  3. 特点:

    • 简洁:只返回一个单词的状态
    • 快速:执行速度快,适合频繁检查
    • 可靠:提供设备的当前状态的准确信息

可以来个脚本:

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
  1. 功能:

    • 重新挂载系统分区为可读写模式
    • 允许修改系统文件
  2. -R 选项:

    • 在重新挂载后立即重启设备
  3. 使用场景:

    • 系统级开发和调试
    • 修改系统文件或应用
    • 进行需要root权限的操作
  4. 先决条件:

    • 设备必须已root
    • bootloader必须解锁
    • 在某些情况下,可能需要禁用 dm-verity
  5. 安全影响:

    • 降低设备安全性,允许系统文件被修改
    • 可能导致设备无法通过安全验证
  6. 使用步骤:
    a. 确保设备已root且USB调试已启用
    b. 执行 adb remount
    c. 如果使用 -R,设备将自动重启

  7. 常见用途:

    • 修改系统应用或框架
    • 安装或替换系统级应用
    • 进行底层系统调试
  8. 注意事项:

    • 不当使用可能导致设备变砖
    • 可能影响OTA更新
    • 在生产设备上使用极其危险
  9. 与其他命令结合:

    • 通常与 adb pushadb pull 一起使用来修改系统文件

    • 例如:

      basic

      复制

      adb remount
      adb push modified_file.so /system/lib/
      
  10. 恢复方法:

    • 重启设备通常会恢复只读状态
    • 完全恢复可能需要重新刷入系统镜像
  11. 在开发中的应用:

    • 测试系统级修改
    • 调试系统服务和框架
  12. 区别于普通root:

    • 普通root允许获取超级用户权限
    • remount允许直接修改系统分区
  13. 潜在风险:

    • 可能导致系统不稳定
    • 增加安全漏洞风险
    • 可能违反设备保修条款
  14. 最佳实践:

    • 仅在开发设备上使用
    • 在使用前备份重要数据
    • 在完成必要操作后立即重启设备
33. reboot

用于重启 Android 设备,并可以指定重启到特定模式。这是一个非常有用的命令,特别是在开发、测试和设备维护过程中。

adb rebot [mode]
  1. 可用的重启模式:
    • 默认(不带参数):正常重启到系统
    • bootloader:重启到 bootloader 模式
    • recovery:重启到 recovery 模式
    • sideload:重启到 sideload 模式
    • sideload-auto-reboot:进入 sideload 模式后自动重启
34. sideload

用于在 Android 设备上安装系统更新包(OTA 包)的 ADB 命令。这是一种直接通过电脑向设备安装系统更新的方法,特别适用于无法通过正常 OTA 更新或想要手动安装特定版本系统的情况。

adb sideload <path_to_update.zip>
  1. 使用步骤:
    a. 将设备重启到 Recovery 模式
    b. 在 Recovery 菜单中选择 “Apply update from ADB”
    c. 在计算机上执行 adb sideload 命令

  2. 先决条件:

    • 设备必须处于 Recovery 模式
    • ADB 调试必须启用
    • 计算机上必须安装 ADB 工具
  3. OTA 包要求:

    • 必须是针对特定设备型号的正确 OTA 包
    • 通常是 .zip 格式的文件
  4. 使用场景:

    • 手动更新系统版本
    • 安装官方 OTA 更新
    • 在自动 OTA 更新失败时使用
  5. 优点:

    • 无需完整的系统镜像
    • 可以跳过等待 OTA 推送
    • 适用于无法正常接收 OTA 更新的设备
  6. 注意事项:

    • 确保使用正确的 OTA 包,否则可能导致设备问题
    • 建议在操作前备份重要数据
    • 过程中不要断开设备连接
  7. 常见错误:

    • 签名验证失败:通常是由于使用了不兼容或被修改的 OTA 包
    • 空间不足:确保设备有足够的存储空间
  8. 安全考虑:

    • 只使用来自可信源的 OTA 包
    • 避免使用未经验证的第三方 OTA 包
  9. 与其他命令的结合:

    adb reboot recovery
    # 手动在设备上选择 "Apply update from ADB"
    adb sideload update.zip
    
  10. 在脚本中的应用:

    adb reboot recovery
    sleep 30  # 等待设备进入 recovery 模式
    adb sideload path/to/update.zip
    
  11. 故障排除:

    • 如果 sideload 失败,检查 OTA 包的完整性
    • 确保设备型号和 OTA 包匹配
    • 检查 ADB 连接是否稳定
  12. 与传统刷机的区别:

    • Sideload 通常只更新系统,不会清除用户数据
    • 比完整的系统刷写更安全和快速
  13. 最佳实践:

    • 在执行 sideload 前为设备充足电

    • 保持良好的 USB 连接,避免中断

    • 在执行更新后验证系统的完整性

35. root

用于获取 Android 设备 root 权限的 ADB 命令

36. unroot

root的反向操作,用于退出ADB的root模式。这个命令在完成需要 root 权限的操作后恢复正常的非 root 状态时很有用。

37. usb

用于特定情况下重新启动usb链接

adb usb

主要功能是:

  1. 重新启动USB连接;
  2. 主要用于从无线(TCP/IP)模式切换回USB模式

使用场景:

  1. 当设备当前通过 Wi-Fi 连接到 ADB 时
  2. 需要从无线调试切换回 USB 调试时
38. tcp/ip PORT
adb tcp/ip PORT

用于设置无线 ADB 连接的重要命令,允许开发者通过 Wi-Fi 网络连接到 Android 设备,而不是传统的 USB 连接。

  1. 主要功能如下:

    • 将 ADB 守护进程(adbd)重启到指定的 TCP 端口
    • 使设备准备好接受无线 ADB 连接
  2. 使用场景:

    • 远程调试 Android 设备
    • 在不使用 USB 线的情况下连接设备
    • 同时操作多个设备
  3. 执行步骤:
    a. 通过 USB 连接设备
    b. 运行 adb tcpip 5555
    c. 断开 USB 连接
    d. 使用 adb connect IP_ADDRESS:5555 建立无线连接

  4. 优点:

    • 提供更大的移动自由度
    • 允许在不同位置的设备间快速切换
    • 便于在多个设备上同时工作
  5. 注意事项:

    • 设备必须与电脑在同一个 Wi-Fi 网络
    • 需要知道设备的 IP 地址
    • 可能存在安全风险,应在受信任的网络中使用
  6. 在脚本中应用:

    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 发现的设备

相关推荐

  1. adb参数详解

    2024-07-12 19:32:06       21 阅读
  2. adb 使用详细指令

    2024-07-12 19:32:06       27 阅读
  3. ADB命令详解与用法

    2024-07-12 19:32:06       32 阅读
  4. LSTM参数详解

    2024-07-12 19:32:06       50 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-12 19:32:06       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-12 19:32:06       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-12 19:32:06       58 阅读
  4. Python语言-面向对象

    2024-07-12 19:32:06       69 阅读

热门阅读

  1. Git常用命令

    2024-07-12 19:32:06       24 阅读
  2. 力扣2211.统计道路上的碰撞次数

    2024-07-12 19:32:06       23 阅读
  3. js【详解】声明常量和变量 const let var

    2024-07-12 19:32:06       26 阅读
  4. CVE漏洞爬虫脚本

    2024-07-12 19:32:06       20 阅读
  5. 掌握Postman的API请求模板:一键生成,效率倍增

    2024-07-12 19:32:06       24 阅读
  6. Vue中的Mixins与钩子函数:理解合并与调用

    2024-07-12 19:32:06       24 阅读
  7. Todo List

    2024-07-12 19:32:06       21 阅读
  8. ARM/Linux嵌入式面经(十):极氪

    2024-07-12 19:32:06       18 阅读
  9. 【网络安全】一文带你了解什么是【sql注入】

    2024-07-12 19:32:06       19 阅读
  10. Flowable工作流引擎核心事件详细解释说明

    2024-07-12 19:32:06       26 阅读
  11. SQL 视图

    2024-07-12 19:32:06       20 阅读