adb,即Android Debug Bridge,它是Android开发/测试人员不可替代的强大工具
1) USB连接
通过 USB 连接来正常使用 adb 需要保证几点:
-
硬件状态正常。
包括 Android 设备处于正常开机状态,USB 连接线和各种接口完好。
-
Android 设备的开发者选项和 USB 调试模式已开启。
可以到「设置」-「开发者选项」-「Android 调试」查看。
如果在设置里找不到开发者选项,那需要通过一个彩蛋来让它显示出来:在「设置」-「关于手机」连续点击「版本号」7 次。
-
设备驱动状态正常。
这一点貌似在 Linux 和 Mac OS X 下不用操心,在 Windows 下有可能遇到需要安装驱动的情况,确认这一点可以右键「计算机」-「属性」,到「设备管理器」里查看相关设备上是否有黄色感叹号或问号,如果没有就说明驱动状态已经好了。否则可以下载一个手机助手类程序来安装驱动先。
-
通过 USB 线连接好电脑和设备后确认状态。
如果能看到
说明连接成功.
2) 无线连接(需借助USB线)
除了可以通过 USB 连接设备与电脑来使用 adb,也可以通过无线连接——虽然连接过程中也有需要使用 USB 的步骤,但是连接成功之后你的设备就可以在一定范围内摆脱 USB 连接线的限制啦!
操作步骤:
-
将 Android 设备与要运行 adb 的电脑连接到同一个局域网,比如连到同一个 WiFi。
-
将设备与电脑通过 USB 线连接。
应确保连接成功(可运行 看是否能列出该设备)。
-
让设备在 5555 端口监听 TCP/IP 连接:
-
断开 USB 连接。
-
找到设备的 IP 地址。
一般能在「设置」-「关于手机」-「状态信息」-「IP地址」找到,也可以使用下文提到的获取设备IP的方法用 adb 命令来查看。
-
通过 IP 地址连接设备。
这里的 就是上一步中找到的设备 IP 地址, <port>就是上面设置的5555端口。
-
拔掉USB线, 确认连接状态。
-
如果能看到
说明连接成功。
如果连接不了,请确认 Android 设备与电脑是连接到了同一个 WiFi,然后再次执行 那一步;
如果还是不行的话,通过 重新启动 adb 然后从头再来一次试试。
断开无线连接命令:
1) 启动
2) 停止
3) 查看adb版本
4) 查看已连接的设备
输出:
输出格式为[serialNumber][state], 其中state有如下几种:
- offline - 表示设备未连接成功或无响应
- device - 设备已连接. 需要注意这个状态并不标识Android系统以及完全启动和可操作, 在设备启动过程中设备实例就可连接到adb, 但启动完毕后系统才处于可操作状态
- no device - 没有设备/模拟器连接
5) 为命令指定目标设备

在多个设备/模拟器连接的情况下较常用的是 参数,serialNumber 可以通过 命令获取
6) 指定adb server的网络端口
默认端口是5037
7) 获取设备的IP
8)查看应用列表
在 的基础上可以加一些参数进行过滤查看不同的列表,支持的过滤参数如下:

9) 安装APK

10)卸载应用
表示应用的包名, 参数可选,表示卸载应用但保留数据和缓存目录。
示例:
11)清除应用数据与缓存
表示应用名包,这条命令的效果相当于在设置里的应用信息界面点击了「清除缓存」和「清除数据」。
示例:
12)查看前台Activity
13) 查看正在运行的Services
参数不是必须的,指定 表示查看与某个包名相关的 Services,不指定表示查看所有 Services。
不一定要给出完整的包名,比如运行 ,那么包名 、 和 等相关的 Services 都会列出来。
14) 与应用交互


15) 调起Activity
例如调起微信主界面:
调起 并传给它 string 数据键值对
16) 调起Service
例如调起微信的某Service
17) 发送广播
可以向所有组件广播,也可以只向指定组件广播。
例如,向所有组件广播 :
又例如,只向 广播 :
这类用法在测试的时候很实用,比如某个广播的场景很难制造,可以考虑通过这种方式来发送广播。
既能发送系统预定义的广播,也能发送自定义广播。如下是部分系统预定义广播及正常触发时机:

18) 强制停止应用
示例:
19) 文件管理
复制设备里的文件到电脑
其中 参数可以省略,默认复制到当前目录。
示例:
说明:设备上的文件路径可能需要 root 权限才能访问,如果你的设备已经 root 过,可以先使用 和 命令在 adb shell 里获取 root 权限后,先 将文件复制到 sdcard,然后
复制电脑里的文件到设备
示例:
说明:设备上的文件路径普通权限可能无法直接写入,如果你的设备已经 root 过,可以先 ,然后 和 在 adb shell 里获取 root 权限后,
20)模拟按键/输入
在 里有个很实用的命令叫 ,通过它可以做一些有趣的事情。
命令的完整 help 信息如下:


比如使用 命令,不同的 keycode 能实现不同的功能,完整的 keycode 列表详见 KeyEvent,摘引部分我觉得有意思的如下:

下面是input命令的一些用法举例
按电源键
菜单键
HOME键
返回键
增加音量
降低音量
静音开/关
播放/暂停
停止播放
播放下一首
播放上一首
恢复播放
暂停播放
可以通过上文讲述过的模拟电源键来切换点亮和熄灭屏幕,但如果明确地想要点亮或者熄灭屏幕,那可以使用如下方法。
点亮屏幕
熄灭屏幕
滑动解锁
如果锁屏没有密码,是通过滑动手势解锁,那么可以通过 来解锁。
命令(参数以机型 Nexus 5,向上滑动手势解锁举例)
参数 分别表示。
输入文本
在焦点处于某文本框时,可以通过 命令来输入文本。
21)查看日志
Android 系统的日志分为两部分,底层的 Linux 内核日志输出到 /proc/kmsg,Android 的日志输出到 /dev/log。
Android日志
常用用法列举如下:
按级别过滤日志
Android 的日志分为如下几个优先级(priority):


按某级别过滤日志则会将该级别及以上的日志输出。
示例:
会将 Warning、Error、Fatal 和 Silent 日志输出。
(注:在 macOS 下需要给 这样以 作为 tag 的参数加双引号,如 ,不然会报错 。)
按 tag 和级别过滤日志
可以由多个 组成。
比如,命令:
表示输出 tag 的 Info 以上级别日志,输出 tag 的 Debug 以上级别日志,及其它 tag 的 Silent 级别日志(即屏蔽其它 tag 日志)。
清空日志
内核日志


中括号里的 代表内核开始启动后的时间,单位为秒。
通过内核日志我们可以做一些事情,比如衡量内核启动时间,在系统启动完毕后的内核日志里找到 那一行前面的时间就是。
22)查看设备型号
输出示例:
23)电池状况
输出示例:


其中 代表最大电量, 代表当前电量。上面的输出表示还剩下 99% 的电量。
24)屏幕分辨率
输出示例:
该设备屏幕分辨率为 1080px * 2280px。
如果使用命令修改过,那输出可能是:
表明设备的屏幕分辨率原本是 1080px * 1920px,当前被修改为 480px * 1024px。
25)屏幕密度
输出示例:
表面该屏幕是480dpi, 当前被修改为440dpi
26)显示屏参数
输出示例:
其中 为 显示屏编号, 是初始分辨率和屏幕密度, 的高度比 里的要小,表示屏幕底部有虚拟按键,高度为 1920 - 1794 = 126px 合 42dp。
27)查看android_id
输出示例:
28)查看IMEI
在 Android 4.4 及以下版本可通过如下命令获取 IMEI:
输出示例:
其中的 就是 IMEI。
而在 Android 5.0 及以上版本里这个命令输出为空,得通过其它方式获取了(需要 root 权限):
输出示例:
把里面的有效内容提取出来就是 IMEI 了,比如这里的是 。
参考:adb shell dumpsys iphonesubinfo not working since Android 5.0 Lollipop
29)Android系统版本
输出示例:
30)IP地址
输出示例:
那么 就是设备 IP 地址。
在有的设备上这个命令没有输出,如果设备连着 WiFi,可以使用如下命令来查看局域网 IP:
输出示例:
或


如果以上命令仍然不能得到期望的信息,那可以试试以下命令(部分系统版本里可用):
输出示例:


可以看到网络连接名称、启用状态、IP 地址和 Mac 地址等信息。
31)Mac地址
输出示例:
这查看的是局域网 Mac 地址,移动网络或其它连接的信息可以通过前面的小节「IP 地址」里提到的 命令来查看。
32)CPU信息
输出示例:


这是 Nexus 5 的 CPU 信息,我们从输出里可以看到使用的硬件是 ,processor 的编号是 0 到 3,所以它是四核的,采用的架构是 。
33)内存信息
输出示例:
其中, 就是设备的总内存, 是当前空闲内存。
34)重启设备
35)修改分辨率
表示将分辨率修改为 480px * 1024px。
36)恢复分辨率
37)修改屏幕密度
标识将屏幕修改为160dpi
38)恢复屏幕密度
39)修改显示区域
四个数字分别表示距离左、上、右、下边缘的留白像素,以上命令表示将屏幕底部 200px 留白。
40)恢复显示区域
41)关闭USB调式模式
用命令恢复不了了,毕竟关闭了 USB 调试 adb 就连接不上 Android 设备了。
去设备上手动恢复吧:「设置」-「开发者选项」-「Android 调试」。
42)状态栏和导航栏的显示隐藏
可由如下几种键及其对应的值组成,格式为

例如:
表示设置在所有界面下都同时隐藏状态栏和导航栏。
表示设置在包名为 和 的应用里隐藏状态栏,在除了包名为 的所有应用里隐藏导航栏。
43)屏幕截图
然后将 png 文件导出到电脑:
可以使用 查看 命令的帮助信息,下面是两个有意义的参数及含义:

实测如果指定文件名以 结尾时可以省略 -p 参数;否则需要使用 -p 参数。如果不指定文件名,截图文件的内容将直接输出到 stdout。
直接一行命令截图并保存到电脑的方法:
Linux 和 Windows
Mac OS X
这个方法需要用到 gnu sed 命令,在 Linux 下直接就有,在 Windows 下 Git 安装目录的 bin 文件夹下也有。如果确实找不到该命令,可以下载 sed for Windows 并将 sed.exe 所在文件夹添加到 PATH 环境变量里。
而在 Mac 下使用系统自带的 sed 命令会报错:
需要安装 gnu-sed,然后使用 gsed 命令:
44)屏幕录制
录制屏幕以 mp4 格式保存到 /sdcard:
需要停止时按 Ctrl-C,默认录制时间和最长录制时间都是 180 秒。
如果需要导出到电脑:
可以使用 查看 命令的帮助信息,下面是常见参数及含义:

45)重新挂载 system 分区为可写
注:需要 root 权限。
/system 分区默认挂载为只读,但有些操作比如给 Android 系统添加命令、删除自带应用等需要对 /system 进行写操作,所以需要重新挂载它为可读写。
步骤:
#1. 进入 shell 并切换到 root 用户权限。
命令:
#2.查看当前分区挂载情况
命令:
输出示例


找到其中我们关注的带 /system 的那一行:
#3.重新挂载
命令:
这里的 就是我们从上一步的输出里得到的文件路径。
如果输出没有提示错误的话,操作就成功了,可以对 /system 下的文件为所欲为了。
46)查看链接过的WiFi密码
注:需要 root 权限。
输出示例:


即为我们在 WLAN 设置里看到的名称, 为密码, 为安全加密方式。
47)设置系统日期和时间
注:需要 root 权限。
表示将系统日期和时间更改为 2016 年 08 月 23 日 13 点 15 分 00 秒。
48)重启手机
49)监测设备是否已root
此时命令行提示符是 则表示没有 root 权限,是 则表示已 root。
50)使用Monkey进行压力测试
Monkey 可以生成伪随机用户事件来模拟单击、触摸、手势等操作,可以对正在开发中的程序进行随机压力测试。
简单用法:
表示向 指定的应用程序发送 500 个伪随机事件。
Monkey 的详细用法参考 官方文档。
51)开启/关闭WiFi
注:需要 root 权限。
有时需要控制设备的 WiFi 状态,可以用以下指令完成。
开启 WiFi:
关闭WiFi
若执行成功,输出为空;若未取得 root 权限执行此命令,将执行失败,输出 。
下面是刷机相关的命令
52)重启到Recovery模式
53)从Recovery模式重启到Android
54)重启到Fastboot模式
55)通过sideload更新系统
如果我们下载了 Android 设备对应的系统更新包到电脑上,那么也可以通过 adb 来完成更新。
以 Recovery 模式下更新为例:
#1.重启到Recovery模式
#2.在设备的 Recovery 界面上操作进入 -。
注:不同的 Recovery 菜单可能与此有差异,有的是一级菜单就有 。
#3.通过 adb 上传和更新系统
最后