ADB详解及常用命令
Android开发对于ADB想来是不会陌生的,对于ADB的相关知识和使用我们需要熟练掌握。
一、ADB的认识
1. ADB组成
Android Debug Bridge,Android调试桥接器,简称ADB,是用于管理模拟器或真机状态的万能工具。说人话就是:ADB是PC和移动终端通信的桥梁,它采用了C/S模型,由三部分组成。
借用一张图:
2. 服务端部分,是运行在开发用电脑上的后台进程,用于管理客户端与运行在模拟器或真机的守护进程通信。
1. adb client(客户端)
client是运行在PC端的组件,可以在命令行中运行adb命令来调用该客户端,通常的ADB插件、DDMS、豌豆荚等工具都可以调用ADB。
每当我们发起一个ADB命令时,就会开启一个client程序,client开启后就会去检测后台是否已存在server程序在运行,如无存在则开启一个adb-server进程。我们常见的打开Android Studio开发工具时,会帮你自动开启一个client。
client与模拟器是一对多的关系,连接多个手机也只有一个client。client都是通过5037端口与adb-server进行通讯的。
2. adb daemon(adb后台程序)
daemon守护进程,该组件作为一个后台进程运行在模拟器/真实Android设备中。
在PC命令行中中输入的ADB命令,通过Server与daemon的通信,将命令传至daemon,实际命令是在daemon中运行。
daemon使用端口的范围是5554-5585,每个模拟器/设备连接到PC端时,总会开启这样一个后台进程(client会帮助检查),并且为其分配了两个连续的端口,比如:
- Emulator1, console: 5554
偶数端口用于控制台与终端设备进行连接交互 - Emulator1, adb: 5555
奇数端口是用来Server与模拟器、手机进行连接通信的
因为每个设备都分一组两个端口,所以adb连接手机的最大数量为16。
3. adb server(服务器)
Server,该组件管理客户端和后台程序之间的通信,作为一个后台的程序运行在开发PC端。当一个server开启的时候,会自动绑定并且监听5037端口,接收client通过该端口发送过来的命令。
同时server还会对5555-5585间的奇数端口进行扫描,进行对已连接设备的定位。server将client中命令传至daemon.
2. ADB 通信原理
ADB组件是通过TCP/IP协议建立长连接实现通信的。其通信流程大致如下:
- ADB客户端启动后,会主动寻找并尝试连接ADB Server服务进程,如果Server未启动,则client启动一个server。 随后clent 与server 通过本地端口5037进行通信。
- Server通过扫描5555—5585之间的奇数端口来搜寻模拟器或手机,一旦发现adb daemon,则通过该端口建立连接。
- Server可以从多个client接收ADB命令,然后将命令传至连接的多个daemon,在daemon中运行命令达到控制手机/模拟器的效果。
3. ADB连接方式
1) 手机数据线连接
我们Android手机线一般有两种,USB type-C和USB micro。这种方式很常见,不说了。
USB micro数据口
USB type-C数据口
2) USB type-A数据线连接
首选认识下USB type-A数据口,它就是我们常见电脑上的USB口,见图如下:
这种连接方式一般Android开发碰不到,他在一些Android柜台机,广告机中有可能是这样连接的。这种连接线两头都是一模一样的这种USB type-A数据口,常被叫做双公头数据线。

一般都是如上设置,即可建立连接
3) 网络连接
网络连接就是通过让Android终端与电脑处于同一网络内,将设备设置为TCP模式进行连接。让Android 设备与PC处于同一网络,可以是通过网线或者wifi连接。手机要打开开发者模式
其连接流程如下:
-
检查网络同一
在电脑上cmd命令行工具中ping Android设备IP,如果未丢失数据,说明两者在同一网络中。
-
设置设备TCP模式
在adb.exe所在目录输入命令 adb tcpip 5555,将Android设备设置成TCP/IP连接模式
如果失败了,一般是adb 被别的程序占用了,一般要关掉如360手机助手,豌豆荚等程序然后重启adb -
连接设备
输入命令 adb connect 192.168.31.34,如图连接成功,拔掉数据线你会发现设备与PC还是连着的。
如果connect被拒绝,关闭干扰软件,关闭ADB,重新连接。
**注意:**
1) 想要断开连接的命令是adb disconnect 192.168.31.34
2) wifi连接模式至少需要让Android设备与PC用数据线连接一次
3)我们常用的Android studio wifi连接插件其实就是基于如上原理,只是自动帮我们完成了一些ADB命令的键入,直接按钮点击连接就好。
我用华为Honor 9测试,插件 ADB Wifi好像无法使用,插件Android Wifi ADB布局画面也不美观。Android studio进行开发,那么我给你推荐WIFI ADB ULTIMATE这款wifi连接插件,界面美观,功能强大。
4. 手机IP确认
有时候你可能不知道手机的IP地址是多少,这时候有5种方法可以获取:
- 通过路由器管理页面查看WLAN,查看IP地址
- 通过手机设置》关于手机查看


- 通过adb命令 adb shell ifconfig wlan0,获取连接的手机IP

- 通过adb命令 adb shell netcfg,获取连接的手机IP

- 在wifi 设置页面中查看IP地址


二、ADB的安装
如果只是想对ADB工具及命令进行了解,而不想安装类似Android Studio这样的工具,那么请下载ADB
比如我下载文件后解压放在E盘,那么使用步骤:
- 打开cmd,输入命令 E:
- 输入 cd E:\adb_1.0.41,进入adb目录中
- 输入adb version,如下,adb的信息如下,想要进行其他操作,请查看下面的ADB命令

三、ADB命令
注意:1. 《 》 代表内容需要自己更具实际情况更改2. 【 】 代表内容是可选项,可以不填写
1. adb 普通命令
adb -s / -e / -d 指定对某个连接成功的设备执行命令
-s: 指定要操作的设备;
-e: 默认操作模拟器;
-d:默认操作硬件设备;
-s、-e、-d 是跟在adb后面的限制符,如adb -s emulator-5556 install helloWorld.apk
这条命令就是往emulator-5556模拟器安装apk文件。 它的原始普通命令是 adb install helloWorld.apk
1) ADB信息
| 命令模式 | 说明 | 示例 |
|---|---|---|
| adb pwd | 打印当前路径 | |
| adb ls | 查看当前 | |
| adb devices | 列举当前连接的调试设备 | |
| adb get-serialno | 获取当前连接设备信息, 只能当连接一个设备时使用,并拿到设备的序列号 | |
| adb get-state | 获取设备的状态 ,有 3 钟 | device:设备正常连接 ;offline:连接出现异常,设备无响应 ; unknown:没有连接设备 |
| adb bugreport | 查看bug报告 | |
| adb help | 调出adb命令提示 |
2)操作类
| 命令模式 | 说明 | 示例 |
|---|---|---|
| adb pull -a remote-path local-path | 从设备拷贝文件或文件夹到电脑 | -a:保留文件时间戳及属性 ;remote-path:为手机端文件路径; local-path:为文件复制到的路径 |
| adb push loacal-path remote-path | 将文件或文件夹(包括文件夹的子目录)拷贝到设备 | adb push /Users/littlejie/Desktop/log.txt /dev |
| adb reboot | 重启机器 | adb -s xxx reboot 重启连接成功的指定设备。 |
| adb reboot recovery | 重启进入recovery模式 | |
| adb reboot bootloader | 重启到bootloader,即刷机模式 | |
| adb forward tcp:8000 tcp:9000 | 执行此命令后, PC端的8000端口会被adb监听, 这个时候我们只需要往8000端口写数据, 这个数据就会发送到手机端的9000端口上 | 一般用来主机和移送设备进行额外的数据传输 |
- adb remount 将system分区重新挂载为可读写分区
3 ) ADB 远程
| 命令模式 | 说明 | 示例 |
|---|---|---|
| adb version | 查看版本 | |
| adb tcpip 5555 | 设置连接设备为TCP模式 | |
| adb usb | 切换到usb模式 | |
| adb start/kill -server | 启动/杀死adb 的Server | |
| adb connect/disconnect 《192.168.1.101》 | 通过局域网远程调试ADB终端 | |
| adb install 【-r/-s】 test.apk | 安装apk文件 | -r:保留数据和缓存文件,重新安装apk ; -s:安装apk到sd卡 |
| adb uninstall 【-k】 com.tencent.mobileqq | 卸载apk | 有-k 则不删除程序运行所产生的数据和缓存目录。 |
4) log 命令
adb logcat -* * 代表不同flag,如下图
| 标识 | 说明 |
|---|---|
| "-s"选项 | 设置输出日志的标签, 只显示该标签的日志; |
| "-f"选项 | 将日志输出到文件, 默认输出到标准输出流中, -f 参数执行不成功; |
| "-r"选项 : | 按照每千字节输出日志, 需要 -f 参数, 不过这个命令没有执行成功; |
| "-n"选项 | 设置日志输出的最大数目, 需要 -r 参数, 这个执行 感觉 跟 adb logcat 效果一样; |
| "-v"选项 | 设置日志的输出格式, 注意只能设置一项; |
| "-c"选项 | 清空所有的日志缓存信息; |
| "-d"选项 | 将缓存的日志输出到屏幕上, 并且不会阻塞; |
| "-t"选项 | 输出最近的几行日志, 输出完退出, 不阻塞; |
| "-g"选项 | 查看日志缓冲区信息; |
| "-b"选项 | 加载一个日志缓冲区, 默认是 main, 下面详解; |
| "-B"选项 | 以二进制形式输出日志; |
logcat定义表
| 命令模式 | 说明 | 示例 |
|---|---|---|
| adb logcat | 打印信息 | |
| adb logcat | grep 【-i】 | 显示包含的logcat ,【并忽略大小写】 | |
| adb logcat -c | 清楚手机的log buffer | |
| adb logcat -b | 打印指定buffer的log信息 | |
| adb logcat -d | 读完所有log后返回,而不会一直等待 | |
| adb logcat -f | 输出log到指定文件 | |
| log adb logcat -s xys | 打印xys标签 | adb -s 192.168.56.101:5555 logcat -s xys 打印192.168.56.101:5555设备里的xys标签log |
| adb logcat -s ActivityManager | findstr “START”** 打印在ActivityManager标签里包含start的日志 | |
| logcat -t | 打印最近的指定条数count的logcat | |
| adb logcat -v format | 格式化输出log |
format有多种格式,如下:
adb logcat -v time 显示时间
adb logcat -v process |grep 8607 查看PID是:8607进程的日志
brief — 显示优先级/标记和原始进程的PID (默认格式)
process — 仅显示进程PID
tag — 仅显示优先级/标记
thread — 仅显示进程:线程和优先级/标记
raw — 显示原始的日志信息,没有其他的元数据字段
time — 显示日期,调用时间,优先级/标记,PID
long —显示所有的元数据字段并且用空行分隔消息内容
2. adb shell命令
adb 命令是 adb 这个程序自带的一些命令,而 adb shell 则是调用的 Android 系统中的命令,这些 Android 特有的命令都放在了 Android 设备的 system/bin 目录下。想要执行shell命令,有两种方法:
- 先进入shell模式输入命令,如先
adb shell进入调试设备的shell 界面,然后dumpsys power - 直接执行
adb shell dumpsys power
两种方式的实际效果是一摸一样的。
进入Shell模式后,如果现实"#",说明该设备拥有root权限,如果现实"$",说明该设备未拥有root权限。

1) adb shell am
am全称activity manager,你能使用am去模拟各种系统的行为,例如去启动一个activity,强制停止进程,发送广播进程,修改设备屏幕属性等等。
| 命令模式 | 说明 | 示例 |
|---|---|---|
| am start [options] intent | am即activity manager. 该命令用来执行一些系统动作 | |
| am broadcast | 发送一个广播 | |
| am start -a android.settings.INPUT_METHOD_SETTINGS | 使用Action方式打开系统设置-输入法设置 | |
| am start -n 《包名》/.《类名》 | 开始某个Activit或Intent | |
| am start -n com.android.camera/.Camera} | 使用组件名方式启动照相机功能 | |
| am start -n | 启动指定包名的应用 | |
| am start -a android.intent.action.CALL-d tel:10086 | 打开拨号界面,并传递一个DATA_URI数据给拨号界面 | |
| am start -a android.intent.action.VIEW -d http://www.jianshu.cn/ | 打开简书的官网页 | |
| am startservice <包名/.Service名> | 使用ComponentName 方式启动一个Service | |
| am stopservice 《包名/.Service名》 | 停止一个service | |
| am force-stop | 强制结束应用 | |
| adb shell am kill | 杀死app 进程 | |
| adb shell am monitor | 监控程序的crash和anr错误 |
2)shell pm
pm全称package manager,你能使用pm命令去模拟Android行为或者查询设备上的应用等
| 命令模式 | 说明 | 示例 |
|---|---|---|
| pm list packages [option filter ] | 列出当前已安装的应用包名, 根据filter可以搜索你需要的包名 | |
| pm list permission-groups | 查看所有可用的权限 | |
| pm list permissions [options] group | 查看某个权限组下边所有的权限 | |
| shell pm path | 查看某个apk安装路径 | |
| pm clear | 删除和这个包有关联的所有数据 | |
| pm set-install-location location | 改变apk默认安装位置(只能在已root设备使用,未root设备会报java.lang.SecurityException异常) | |
| pm get-install-location | 获取系统默认安装位置 | |
| pm install test.apk | 安装apk | |
| pm uninstall 《package》 卸载指定包名应用 |
3) shell input
这个命令可以向 Android 设备发送按键事件
| 命令模式 | 说明 | 示例 |
|---|---|---|
| input text “发送内容” | 不能发送中文 | |
input keyevent KEYCODE |
发送按键事件 ,KEYCODE表在文尾 |
input keyevent KEYCODE_HOME 模拟按下Home键 |
| input tap | 对屏幕发送一个触摸事件 | input tap 500 500 点击屏幕上坐标为 500 500 的位置 |
| adb shell input swipe | 滑动事件 | input swipe 800 600 100 600 从右往左滑动屏幕》 |
4)设备信息
| KeyCode值 | 对应按键名 |
|---|---|
| 亮度 | /sys/class/leds/lcd-backlight/brightness |
| CPU | /sys/devices/system/cpu/cpu0/cpufreq |
| GPU | /sys/class/ kgsl/kgsl-3d0/gpuclk |
| 限频 | cat /data/pmlist.config |
| 电流 | cat /sys/class/power_supply/battery/current_now |
| 获取设备信息 | cat /system/build.prop 【grep】 |
| 获取手机MAC地址 | cat /sys/class/net/wlan0/address |
| 查看wifi密码 | cat /data/misc/wifi/*.conf |
| 获取连接设备的IP地址 | ifconfig wlan0 |
| 查看连接设备的IP地址 | netcfg |
| 获取手机内存信息 | cat /proc/meminfo |
| 获取手机存储信息 | df |
| 获取手机内部存储信息 | df /data |
| 获取系统版本 | getprop ro.build.version.release |
| 获取系统api版本 | getprop ro.build.version.sdk |
| 获取手机设备型号 | getprop ro.product.model |
| 获取手机厂商名称 | getprop ro.product.brand |
| 列出设备上的输入法 | adb shell ime list -s |
| 查看Power | dumpsys power |
| 获取Android设备屏幕分辨率 | dumpsys window (或 grep mUnrestrictedScreen) |
| WIFI | data/misc/wifi/wpa_supplicant.conf |
| 持有wake_lock | echo a> sys/power/wake_lock |
| 释放wake_lock | echo a> sys/power/wake_unlock |
| 查看Wakeup_source | cat sys/kernel/debug/wakeup_sources |
| Display(关闭AD) | mv /data/misc/display/calib.cfg /data/misc/display/calib.cfg.bak 重启 |
5)进程、Service及状态
| 命令模式 | 说明 | 示例 |
|---|---|---|
| su root | 获取root权限 | 一般Android板子可以,手机一般不行 |
| service list | 查看后台services信息 | |
| dumpsys services [] | 查看正在运行的Services | |
| dumpsys activity [] | 查看正在运行的Activity | |
| procrank | 查看运行进程 | |
| kill 366 | 关闭或杀掉进程 | |
| ps | 列出当前运行的进程 | adb shell ps -x [PID] 查看指定进程状态 |
| cat /proc/1460/maps | 查看进程的文件结构 | 1460进程的PID |
| cat /proc/1460/status | 查看进程的状态 | 1460进程的PID |
| 关闭cabc | echo 0 > /sys/device/virtual/graphics/fb0/cabc_onoff | |
| 打开cabc | echo 3 > /sys/device/virtual/graphics/fb0/cabc_onoff |
6)shell 文件操作
| 命令模式 | 说明 | 示例 |
|---|---|---|
| ls | 列出目录下的文件和文件夹 | |
| du -sh * | 查看目录下的文件大小 | |
| cat <folder/file> | 查看文件内容 | |
| chmod777 | 设置文件的权限 | |
| cd | 进入文件夹,等同于dos中的cd 命令 | |
| rename | 重命名文件 | |
| rm 【 -r 】 /system/avi.apk | 删除指定路径文件的文件或者文件夹 | |
| mv | 移动文件到新的目录 | |
| mkdir path/foldelname | 新建文件夹 |
7)其他命令
| 命令模式 | 说明 | 示例 |
|---|---|---|
| adb shell screencap /sdcard/screen.png | 截图当前页面并保存到指定目录 | |
| adb shell screenrecord | 录屏。Android4.4 及以上才能使用 | |
| adb shell bugreport | 打印dumpsys、dumpstate、logcat的输出,也是用于分析错误 | adb shell dumpsys > D:\bugreport.log |
| adb shell monkey -v -p your.package.name 500 | 跑monkey | adb -s 192.168.244.151:5555 shell monkey -v -p com.bolexim 500 |
| adb shell top | 查看占用内存排序 | 1) adb shell top -m 6 查看占用内存前6的app ; 2)adb shell top -n 1 刷新一次内存信息,然后返回 |
| 当出现read-only 且 remount命令不管用时 | adb shell mount -o rw,remount / | |
| 进入9008模式 | adb reboot edl | |
| 查看高通gpio | sys/class/private/tlmm 或者 sys/private/tlmm | |
| 查看gpio占用情况 | sys/kernle/debug/gpio | |
| systrace | sdk/tools/monitor | |
| 限频 | echo /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq 1497600 | |
| LPM | echo N > /sys/modue/lpm_levels/parameters/sleep_disabled |
四、 KEYCODE表
这个是按键与KEYCODE对应键值表如下
| KeyCode值 | 对应按键名 |
|---|---|
| 0 | KEYCODE_UNKNOWN |
| 1 | KEYCODE_MENU |
| 2 | KEYCODE_SOFT_RIGHT |
| 3 | KEYCODE_HOME |
| 4 | KEYCODE_BACK |
| 5 | KEYCODE_CALL |
| 6 | KEYCODE_ENDCALL |
| 7 | KEYCODE_0 |
| 8 | KEYCODE_1 |
| 9 | KEYCODE_2 |
| 10 | KEYCODE_3 |
| 11 | KEYCODE_4 |
| 12 | KEYCODE_5 |
| 13 | KEYCODE_6 |
| 14 | KEYCODE_7 |
| 15 | KEYCODE_8 |
| 16 | KEYCODE_9 |
| 17 | KEYCODE_STAR |
| 18 | KEYCODE_POUND |
| 19 | KEYCODE_DPAD_UP |
| 20 | KEYCODE_DPAD_DOWN |
| 21 | KEYCODE_DPAD_LEFT |
| 22 | KEYCODE_DPAD_RIGHT |
| 23 | KEYCODE_DPAD_CENTER |
| 24 | KEYCODE_VOLUME_UP |
| 25 | KEYCODE_VOLUME_DOWN |
| 26 | KEYCODE_POWER |
| 27 | KEYCODE_CAMERA |
| 28 | KEYCODE_CLEAR |
| 29 | KEYCODE_A |
| 30 | KEYCODE_B |
| 31 | KEYCODE_C |
| 32 | KEYCODE_D |
| 33 | KEYCODE_E |
| 34 | KEYCODE_F |
| 35 | KEYCODE_G |
| 36 | KEYCODE_H |
| 37 | KEYCODE_I |
| 38 | KEYCODE_J |
| 39 | KEYCODE_K |
| 40 | KEYCODE_L |
| 41 | KEYCODE_M |
| 42 | KEYCODE_N |
| 43 | KEYCODE_O |
| 44 | KEYCODE_P |
| 45 | KEYCODE_Q |
| 46 | KEYCODE_R |
| 47 | KEYCODE_S |
| 48 | KEYCODE_T |
| 49 | KEYCODE_U |
| 50 | KEYCODE_V |
| 51 | KEYCODE_W |
| 52 | KEYCODE_X |
| 53 | KEYCODE_Y |
| 54 | KEYCODE_Z |
| 55 | KEYCODE_COMMA |
| 56 | KEYCODE_PERIOD |
| 57 | KEYCODE_ALT_LEFT |
| 58 | KEYCODE_ALT_RIGHT |
| 59 | KEYCODE_SHIFT_LEFT |
| 60 | KEYCODE_SHIFT_RIGHT |
| 61 | KEYCODE_TAB |
| 62 | KEYCODE_SPACE |
| 63 | KEYCODE_SYM |
| 64 | KEYCODE_EXPLORER |
| 65 | KEYCODE_ENVELOPE |
| 66 | KEYCODE_ENTER |
| 67 | KEYCODE_DEL |
| 68 | KEYCODE_GRAVE |
| 69 | KEYCODE_MINUS |
| 70 | KEYCODE_EQUALS |
| 71 | KEYCODE_LEFT_BRACKET |
| 72 | KEYCODE_RIGHT_BRACKET |
| 73 | KEYCODE_BACKSLASH |
| 74 | KEYCODE_SEMICOLON |
| 75 | KEYCODE_APOSTROPHE |
| 76 | KEYCODE_SLASH |
| 77 | KEYCODE_AT |
| 78 | KEYCODE_NUM |
| 79 | KEYCODE_HEADSETHOOK |
| 80 | KEYCODE_FOCUS |
| 81 | KEYCODE_PLUS |
| 82 | KEYCODE_MENU |
| 83 | KEYCODE_NOTIFICATION |
| 84 | KEYCODE_SEARCH |
用代码写这个表格太爽歪歪了。
总结
感觉是最全的ADB讲解了,从ADB的基本原理结构》安装》命令使用。如果您还没看懂或学会使用,请留言Call me,由我来帮你洗脑讲解。
ADB 的使用,尤其是ADB shell的使用对我们的Android开发帮助是很大的,尤其是越深度的发展技术路线。
博客书写不易,如觉得文章还行,千万别忘记点赞 收藏 ^ _ ^ !
推荐链接
来源:oschina
链接:https://my.oschina.net/u/4271231/blog/4305075









