ADB 实用命令

🍕 Android Debug Bridge是一种允许模拟器或已连接的Android设备进行通信的命令行工具,可为各种设备操作提供便利。

1 工作原理

  • 工作原理
    • Client端:运行在开发机器中,例如电脑,用来发送adb命令。
    • Daemon守护进程:运行在调试设备,例如手机、模拟器中,用来接收并执行adb命令。
    • Server端:运行在开发机器中,例如电脑,用来管理Client和手机端Daemon间的通信。
      • 电脑的命令行窗口输入adb命令,先执行Client端,Client端拿到命令后发送给Server端。
      • Server再传给Daemon,最后在手机上执行,例如:手机上安装一个应用会返回一个信息。
      • 将该信息传递给电脑的Server端,命令再将其传给Client端,最后显示在命令行。

1-1 安装ADB

  • 安装ADB
    • ADB工具下载:https://adbdownload.com/
    • 环境变量配置:Path,变量值为下载的ADB路径。
    • 验证是否安装成功,命令窗口下输入:adb help
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
> adb help
Android Debug Bridge version 1.0.41
Version 31.0.3-7562133
Installed as D:\...\adb.exe

global options:
-a listen on all network interfaces, not just localhost
-d use USB device (error if multiple devices connected)
-e use TCP/IP device (error if multiple TCP/IP devices available)
-s SERIAL use device with given serial (overrides $ANDROID_SERIAL)
-t ID use device with given transport id
-H name of adb server host [default=localhost]
-P port of adb server [default=5037]
-L SOCKET listen on given socket for adb server [default=tcp:localhost:5037]

general commands:
...

usb:
attach attach a detached USB device
detach detach from a USB device to allow use by other processes
environment variables:
$ADB_TRACE
comma-separated list of debug info to log:
all,adb,sockets,packets,rwx,usb,sync,sysdeps,transport,jdwp
$ADB_VENDOR_KEYS colon-separated list of keys (files or directories)
$ANDROID_SERIAL serial number to connect to (see -s)
$ANDROID_LOG_TAGS tags to be used by logcat (see logcat --help)
$ADB_LOCAL_TRANSPORT_MAX_PORT max emulator scan port (default 5585, 16 emus)
$ADB_MDNS_AUTO_CONNECT comma-separated list of mdns services to allow auto-connect (default adb-tls-connect)

1-2 调试模式

  • 调试模式
    • 使用USB将PC端和Android手机设备连接,再将手机设备的USB调试模式打开,不同型号手机调试模式位置不同。
    • 模拟器:Android Studio Emulator(官方)、Genymotion(国外软件)、网易mumu、雷电、夜神、逍遥等第三方模拟器。
    • 手机设备的调试模式开启后,打开PC端的命令行窗口中,输入adb devices,回车确认PC端是否正常连接手机设备。
    • 5037端口为adb的默认端口,若5037端口被占用,使用Adb时会因找不到设备而困扰,提供以下解决端口占用的思路。
1
2
3
4
5
6
7
8
9
10
11
> netstat -aon | findstr 5037                # 找到使用该端口的进程PID
TCP 127.0.0.1:5037 0.0.0.0:0 LISTENING 14216

> tasklist /fi "PID eq 14216" # 通过PID找到对应的进程名

Image Name PID Session Name Session# Mem Usage
========================= ======== ================ =========== ============
adb.exe 14216 Console 1 11,172 K

> taskkill /pid 14216 /f # 使用命令终止该命令的运行
SUCCESS: The process with PID 14216 has been terminated.

2 常用命令

  • 常用命令
    • 单一设备的adb命令语法:adb <command>
    • 多个设备的adb命令语法:adb [-e|-d|-s <serial-number>] <command>
      • -e:指定当前唯一运行的模拟器为命令目标。
      • -d:指定当前唯一通过USB连接的Android设备为命令目标。
      • serial-number:设备序列号,通过adb devices命令获取。
      • -s <serial-number>:指定相应设备序列号的设备或模拟器为命令目标,多设备或模拟器情况较常使用。

2-1 帮助信息

1
2
3
4
5
6
> adb help                                    # 显示adb的版本和帮助信息
> adb --help # 显示adb的版本和帮助信息
> adb version # 查看adb的版本信息
Android Debug Bridge version 1.0.41
Version 31.0.3-7562133
Installed as D:\...\adb.exe

2-2 开关服务

1
2
3
4
5
6
> adb start-server                            # 开启adb服务,无需执行此命令,运行时发现Server未启动会自动调起
* daemon not running; starting now at tcp:5037
* daemon started successfully

> adb -P 5037 start-server # 指定Server网络端口启动服务,默认端口为5037
> adb kill-server # 关掉adb服务

2-3 查看连接

  • 查看连接
    • 通过USB数据线,开启Android设备的调试模式进行连接:adb devices
    • WLAN连接(需USB线)
      • Android设备与电脑连同一WiFi上,再通过USB连接,命令adb tcpip 5555让设备在5555端口监听TCP/IP连接。
      • 断开USB,找到设备的IP地址,通过adb connect <device-ip-address>使用IP地址将Android设备与电脑连接。
      • 使用结束后,通过adb disconnect <device-ip-address>断开无线连接,adb usb可将WiFi连接转为USB连接。
    • WLAN连接(无需USB线,需root权限)
      • Android设备上安装一个终端模拟器,地址:Terminal Emulator for Android Downloads
      • 将Android设备与要运行adb的电脑连接到同一WiFi上,打开Android设备上的终端模拟器。
      • 输入su以root权限操作,再输入setprop service.adb.tcp.port 5555开启设备的5555端口。
      • 找到设备的IP,通过adb connect <device-ip-address>使用IP将Android设备与电脑连接起来。
    • adb get-state返回的状态信息类型
      • devices:设备或模拟器已经连接到adb服务器上了。
      • offline:设备或模拟器没有连接到adb服务器或无响应。
      • no devices/emulators found:没有设备或找不到模拟器。
1
2
3
4
5
6
7
8
9
10
11
> adb root                                   # root权限运行adbd
> adb devices # 查询已连接的设备或模拟器列表
List of devices attached
xxxxxxxxxxxxxxx device

> adb devices -l # 查询已连接的设备或模拟器具体信息
List of devices attached
xxxxxxxxxxxxxxx device product:PD2123 model:V2123A device:PD2123 transport_id:1

> adb get-state # 返回设备或模拟器的连接状态信息
device

2-4 安装应用

  • 安装应用
    • 三步骤:push apk文件到/data/local/tmp,调用pm install安装,删除tmp中对应的apk文件。
    • 单一设备的adb命令语法:adb install [-d] [-s] [-g] [-l] [-r] [-t] <apk-file>
      • -d:允许降级覆盖安装。
      • -s:将应用安装到sdcard。
      • -g:授予所有运行时权限。
      • -l:将应用安装到保护目录/mnt/asec。
      • -r:覆盖原来安装的软件,并保留数据。
      • -t
        • 允许安装AndroidManifest.xml里application指定android:testOnly="true"的应用。
        • 安装过程中如果遇到Failure输出代码为INSTALL_FAILED_TEST_ONLY,则使用该命令。
    • 多个设备的adb命令语法:adb -s <serial-number> install <apk-file>
    • 安装状态:Success(成功)、Failure(失败,对应的失败输出代码,如下所示)。
      • INSTALL_FAILED_INSUFFICIENT_STORAGE·············空间不足
      • INSTALL_FAILED_INVALID_APK······················无效的APK文件
      • INSTALL_FAILED_DUPLICATE_PACKAGE················已存在同名程序
      • INSTALL_FAILED_MEDIA_UNAVAILABLE················安装位置不可用
      • INSTALL_FAILED_VERIFICATION_TIMEOUT·············验证安装包超时
      • INSTALL_FAILED_VERIFICATION_FAILURE·············验证安装包失败
      • INSTALL_FAILED_REPLACE_COULDNT_DELETE···········替换时无法删除
      • INSTALL_FAILED_USER_RESTRICTED··················用户被限制安装应用
      • INSTALL_FAILED_TEST_ONLY························应用是test-only的,安装时未指定-t参数
      • INSTALL_FAILED_INVALID_URI······················无效的APK文件名,确保APK文件名无中文
      • INSTALL_FAILED_UID_CHANGED······················安装过该应用了,与本次分配的UID不一致
      • INSTALL_FAILED_INTERNAL_ERROR···················因系统问题而安装失败
      • INSTALL_FAILED_NO_SHARED_USER···················请求的共享用户不存在
      • INSTALL_FAILED_VERSION_DOWNGRADE················已安装应用的更高版本
      • INSTALL_FAILED_ACWF_INCOMPATIBLE················应用程序与设备不兼容
      • INSTALL_FAILED_ALREADY_EXISTS···················应用已存在,或没卸载干净
      • INSTALL_FAILED_OLDER_SDK························设备系统版本低于应用要求
      • INSTALL_FAILED_NEWER_SDK························设备系统版本高于应用要求
      • INSTALL_FAILED_MISSING_FEATURE··················应用使用了设备不可用的功能
      • INSTALL_FAILED_PACKAGE_CHANGED··················应用与调用程序期望的不一致
      • INSTALL_FAILED_DEXOPT···························dex优化验证失败,或空间不足
      • INSTALL_FAILED_DUPLICATE_PERMISSION·············尝试定义一个已存在的权限名称
      • INSTALL_FAILED_PERMISSION_MODEL_DOWNGRADE·······要安装的版本不支持运行时权限
      • INSTALL_FAILED_CONFLICTING_PROVIDER·············设备里已存在与应用同名的content provider
      • INSTALL_FAILED_CONTAINER_ERROR··················sdcard访问失败,应用签名与ROM一致被当作内置应用
      • INSTALL_FAILED_CPU_ABI_INCOMPATIBLE·············包含不兼容设备CPU应用程序二进制接口的native code
      • INSTALL_FAILED_NO_MATCHING_ABIS·················包含该设备的应用程序二进制接口不支持的native code
      • INSTALL_FAILED_MISSING_SHARED_LIBRARY···········安装包使用了设备上不可用的共享库
      • INSTALL_FAILED_SHARED_USER_INCOMPATIBLE·········请求的共享用户存在,但签名不一致
      • INSTALL_FAILED_UPDATE_INCOMPATIBLE··············安装过应用卸载时数据未移除或已安装应用但签名不一致
      • INSTALL_FAILED_INVALID_INSTALL_LOCATION·········不能安装指定位置,应用签名与ROM一致被当作内置应用
      • INSTALL_CANCELED_BY_USER························应用安装需在设备上确认,但未操作设备或点了取消
      • INSTALL_PARSE_FAILED_BAD_MANIFEST···············无法解析的AndroidManifest.xml文件
      • INSTALL_PARSE_FAILED_NOT_APK····················指定路径不是文件,或不是以.apk结尾
      • INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION·······解析器遇到异常
      • INSTALL_PARSE_FAILED_NO_CERTIFICATES············安装包没有签名
      • INSTALL_PARSE_FAILED_MANIFEST_MALFORMED·········解析manifest文件时遇到结构性错误
      • INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME···········manifest文件里没有或使用了无效包名
      • INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID·········manifest文件里指定了无效的共享用户ID
      • INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES··已安装该应用,且签名与APK文件不一致
      • INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING·······解析APK文件时遇到CertificateEncodingException
      • INSTALL_PARSE_FAILED_MANIFEST_EMPTY·············manifest里找不到,找instrumentation或application
      • Permission denied...sdcard...···················sdcard不可用
      • does not contain AndroidManifest.xml············无效的APK文件
      • is not a valid zip file·························无效的APK文件
      • No space left on device·························空间不足(清理空间)
      • unauthorized····································设备未授权允许调试
      • Offline·········································设备未连接成功(先将设备与adb连接成功)
      • protocol failure································设备已断开连接(先将设备与adb连接成功)
      • error: device not found·························没有连接成功的设备(先将设备与adb连接成功)
      • Unknown option: -s······························Android2.2以下不支持安装到sdcard(不使用-s参数)
      • signatures do not match the previously installed version; ignoring!:已安装该应用并且签名不一致。
1
2
3
4
5
6
> adb install -d demo-1.1.8.apk               # 允许降级覆盖安装demo-1.1.8.apk
Performing Streamed Install # 手机将弹窗安装确认,确认后才可以安装
Success

> adb install -g demo-1.1.9.apk # 授予demo-1.1.9.apk所有运行时权限
> adb install -t demo-1.2.0.apk # 允许安装指定android:testOnly="true"的应用

2-5 日志打印

  • 日志打印
    • Android系统的日志分为两部分,底层的Linux内核日志输出到/proc/kmsg,安卓的日志则输出到/dev/log。
    • 查看设备属性的基本命令格式:adb logcat [option] [filter-specs]Ctrl + C可以停止日志监控。
    • 级别过滤:adb logcat [filter-specs],MacOS用adb logcat "*:W",否则报错no matches found: *:W
      • *:V:过滤只显示(开发产品中的调试信息)Verbose及以上级别(优先级最低)。
      • *:D:过滤只显示(发布产品中的调试信息)Debug及以上级别。
      • *:I:过滤只显示(提示性的信息)Info及以上级别。
      • *:W:过滤只显示(警告信息)Warning及以上级别。
      • *:E:过滤只显示(一般的错误信息)Error及以上级别。
      • *:F:过滤只显示(严重的错误消息)Fatal及以上级别。
      • *:S:过滤只显示(不输出任何消息)Silent及以上级别(优先级最高)。
    • tag和级别过滤:adb logcat [tag:level] ... [tag:level] [tag:level]
    • 格式输出:adb logcat -v <format>,format指定日志输出格式,默认brief。
      • raw:<message>
      • tag:<priority>/<tag>: <message>
      • process:<priority>(<pid>) <message>
      • brief:<priority>/<tag>(<pid>): <message>
      • time:<datetime> <priority>/<tag>(<pid>): <message>
      • long:[<datetime> <pid>:<tid> <priority>/<tag>] <message>
      • threadtime:<datetime> <pid> <tid> <priority> <tag>: <message>
    • 加载一个可使用的日志缓冲区供查看:adb logcat -b <Buffer>
      • Radio:输出通信系统的log。
      • System:输出系统组件的log。
      • Event:输出Event模块的log。
      • Main:所有Java层的log以及不属于上面3层的log。
      • 缓冲区主要给系统组件使用,一般应用不需关心,应用的log都输出到Main缓冲区中。
      • 默认log输出,即在不指定缓冲区的情况下,是输出System缓冲区和Main缓冲区的log。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
> adb logcat *:W                             # 输出Warning、Error、Fatal和Silent日志
> adb logcat -v time # 打印时间
> adb logcat -v color # 使用不同的颜色来显示每个优先级
> adb logcat -v long *:S # 以long格式输出tag的Silent以上级别日志
--------- beginning of crash # 从这里开始是与崩溃相关的日志消息
--------- beginning of system # 从这里开始是系统日志消息
--------- beginning of main # 从这里开始是应用程序的主要日志消息

> adb logcat ActivityManager:I *:S # 输出ActivityManager的Info及其他tag的Silent以上级别日志
> adb logcat > log.log # 保存日志到PC端的log.log文件中,CTRL+C暂停输出
> adb logcat -d # 将日志显示在控制台,CTRL+C暂停输出
> adb logcat -c # 清空已存在的日志
> adb logcat -f <file-path> # 将日志输出到文件,可能出现文件系统是只读模式(不推荐)
logcat: Couldn't open output file: Read-only file system

> adb logcat -g # 打印指定日志缓冲区的大小
main: ring buffer is 4 MiB (3 MiB consumed), max entry is 5120 B, max payload is 4068 B
system: ring buffer is 4 MiB (3 MiB consumed), max entry is 5120 B, max payload is 4068 B
crash: ring buffer is 1 MiB (918 KiB consumed), max entry is 5120 B, max payload is 4068 B
kernel: ring buffer is 1 MiB (0 B consumed), max entry is 5120 B, max payload is 4068 B

2-6 文件传送

1
2
3
> adb uninstall [-k] <package-name>           # 卸载应用,-k参数可选,表示卸载应用但保留数据和缓存目录
> adb pull <remote> [local] # 将移动设备中的文件传送到PC上,remote是移动设备路径,local是PC路径
> adb push <local> <remote> # 将PC中的文件传送到移动设备端,local是PC路径,remote是移动设备路径

2-7 重启命令

1
2
3
> adb reboot recovery                         # 重启到Recovery模式
> adb reboot # 从Recovery重启到Android
> adb reboot bootloader # 重启到Fastboot模式

3 高级命令

  • 高级命令
    • Android系统是基于Linux内核开发的,支持常见的Linux命令。
    • 命令保存在手机的/system/bin文件中,在adb shell里可调用。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
> adb shell ls                               # PC端查看Android设备当前目录的所有内容
acct
apex
...
vgc

> abd shell # 进入Android设备目录
PD2123:/ $

> ls # 查看设备当前目录的所有内容
acct config default.prop init.environ.rc lost+found proc system
apex d dev init.vivo.common.rc metadata product system_ext
bin data etc init.vivo.rc mnt sdcard vendor
bugreports data_mirror factory init.vivo.soc.rc odm storage vgc
cache debug_ramdisk init linkerconfig oem sys

> cd /system/bin # 进入手机的/system/bin文件中
> ls # 查看保存在手机/system/bin文件中的Linux命令
> exit # 退出Android设备目录,回到PC

4 查看应用

  • 查看应用
    • 命令格式:adb shell pm list packages [-s] [-u] [-3] [-i] [-e] [-d] [-f] [--user USER_ID] [FILTER]
      • -s:只显示系统应用。
      • -u:包含已卸载应用。
      • -3:只显示第三方应用。
      • -i:显示应用的installer。
      • -e:只显示enabled的应用。
      • -d:只显示disabled的应用。
      • -f:显示应用关联的apk文件。
      • <FILTER>:包名包含<FILTER>字符串。
1
2
3
4
5
6
7
8
9
10
11
12
> adb shell pm list packages                 # 列出系统应用
package:com.vivo.weather.provider
package:com.vivo.carlauncher
...
package:com.qiyi.video

> adb shell pm list packages -s # 列出系统应用
> adb shell pm list packages -3 # 列出第三方应用
> adb shell pm list packages vivo # 查看包名包含字符串vivo的应用列表
> adb shell pm list packages | grep vivo # 过滤包名包含字符串vivo的应用列表(Linux)
> adb shell pm list packages | findstr vivo # 过滤包名包含字符串vivo的应用列表(Win)
> adb shell pm clear <package-name> # 清除应用数据及缓存

5 设备信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
> adb shell getprop ro.product.model         # 查看设备型号
> adb shell getprop ro.build.version.release # 查看Android系统版本
> adb shell dumpsys wifi # 查看无限网络信息
> adb shell dumpsys power # 查看电源管理相关信息
> adb shell dumpsys battery # 查看电池状况,scale指最大电量,level指当前电量
> adb shell dumpsys cpuinfo # 查看当前设备CPU使用情况,获取的是一段时间的均值
> adb shell dumpsys meminfo # 查看进程占用情况,即内存信息
> adb shell dumpsys window displays # 查看显示屏参数
> adb shell wm size # 查看屏幕分辨率
> adb shell wm density # 查看屏幕密度
> adb shell settings get secure android_id # 查看android_id
> adb shell ifconfig "| grep Mask" # 查看手机IP地址
> adb shell cat /proc/cpuinfo # 查看CPU使用情况
> adb shell cat /proc/meminfo # 查看内存信息,MemTotal设备总内存,MemFree当前空闲内存
> adb shell df # 获取Android系统各个分区的相关信息

6 实用功能

1
2
3
4
5
6
> adb exec-out screencap -p > sc.png          # 截图保存到电脑,如果adb版本较老,则无法使用exec-out命令
> adb shell screencap -p /sdcard/sc.png # 截图保存到设备里
> adb shell screenrecord /sdcard/filename.mp4 # 录制屏幕以mp4格式保存到/sdcard,Ctrl+C停止录屏
> adb shell monkey -p <package-name> -v 500 # Monkey压力测试,向包名指定的应用程序发送500个伪随机事件
> adb shell ps # 进程,USER所属用户,PID进程ID,PPID父进程ID,NAME进程名
> adb shell top # 实时资源占用,PR优先级,S进程状态(R/S/T/Z),#THR线程数

ADB 实用命令
https://stitch-top.github.io/2022/09/02/ce-shi-gong-ju/tt05-adb-diao-shi-gong-ju/tt01-adb-shi-yong-ming-ling/
作者
Dr.626
发布于
2022年9月2日 23:21:00
许可协议