🍕 Android Debug Bridge是一种允许模拟器或已连接的Android设备进行通信的命令行工具,可为各种设备操作提供便利。
1 工作原理
工作原理
Client端:运行在开发机器中,例如电脑,用来发送adb命令。
Daemon守护进程:运行在调试设备,例如手机、模拟器中,用来接收并执行adb命令。
Server端:运行在开发机器中,例如电脑,用来管理Client和手机端Daemon间的通信。
电脑的命令行窗口输入adb命令,先执行Client端,Client端拿到命令后发送给Server端。
Server再传给Daemon,最后在手机上执行,例如:手机上安装一个应用会返回一个信息。
将该信息传递给电脑的Server端,命令再将其传给Client端,最后显示在命令行。
1-1 安装ADB
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线程数