前言
Android 调试桥(Android Debug Bridge,简称ADB)是 Android 的一个通用命令行工具。它可以帮助PC与模拟器实例或连接的 Android 设备进行通信。它为各种设备操作提供便利,如安装和调试应用,并提供对 Unix shell 的访问。
工作方式
ADB是客户端-服务端模式的程序,包含三个组件:
- 客户端:该组件发送命令,在开发计算机上运行。可以通过发出 ADB 命令从命令行终端调用客户端。
- 后台程序:该组件在设备上运行命令。后台程序在每个模拟器或设备实例上作为后台进程运行。
- 服务器:该组件管理客户端和后台程序之间的通信。服务器在开发计算机上作为后台进程运行。
ADB工具在sdk/platform-tools
目录下,一般都会加到环境变量中。
启动一个 ADB 客户端时,此客户端首先检查是否有已运行的 ADB 服务器进程。如果没有,它将启动服务器进程。当服务器启动时,它与本地 TCP 端口 5037 绑定,并侦听从 ADB 客户端发送的命令—所有 ADB 客户端均使用端口 5037 与 ADB 服务器通信。
然后,服务器设置与所有运行的模拟器/设备实例的连接。它通过扫描 5555 到 5585 之间(模拟器/设备使用的范围)的奇数号端口查找模拟器/设备实例。服务器一旦发现 ADB 后台程序,它将设置与该端口的连接。请注意,每个模拟器/设备实例将获取一对按顺序排列的端口,用于控制台连接的偶数号端口和用于 ADB 连接的奇数号端口。
如上所示,在端口 5555 与 ADB 连接的模拟器实例与侦听端口 5554 的控制台的实例相同。
当服务器已设置与所有模拟器实例的连接后,就可以使用 ADB 命令访问这些实例。由于服务器管理与模拟器/设备实例的连接,并处理来自多个 ADB 客户端的命令,因此,可以从任意客户端(或从某个脚本)控制任意模拟器/设备实例。
常用命令
可以通过adb help
来查看ADB的命令帮助,当然也可以Google了。这里只介绍日常开发和测试中使用频率较高的命令。
连接相关
// 输出所有连接的模拟器/设备实例的列表。
// offline — 实例未连接到 adb 或不响应。
// device — 实例现在已连接到 adb 服务器。
// no device — 未连接模拟器/设备。
adb devices
// 检查 adb 服务器进程是否在运行,如果未运行则启动它。
adb start-server
// 终止 adb 服务器进程。
adb kill-server
// 在目标模拟器/设备实例中启动远程 shell。多设备时要加 “-s 设备名”
adb shell
复制代码
安装卸载
// 安装apk
// 多设备时加 “-s”
// 覆盖安装加 “-r”
adb install xxx.apk
// 卸载指定APP
// 如果想保留缓存文件加 “-k”
adb uninstall 包名
复制代码
文件相关
// remote: 模拟器/设备实例(远程)上目标文件/目录的路径
// local:开发计算机(本地)目标文件/目录的路径
// 从模拟器或设备复制文件或目录(及其子目录)
adb pull remote local
// 将文件文件或目录(及其子目录)复制到模拟器或设备
adb push local remote
复制代码
am相关
在 adb shell 中,可以使用 Activity Manager (am) 工具发出命令以执行各种系统操作,如启动 Activity、强行停止进程、广播 intent、修改设备屏幕属性及其他操作。
// shell环境中,command为shell命令
am command
// 不进入shell时
adb shell am command
// 启动Activity
// -a 表示 action,-c 表示 category ,-d 表示 data_uri,-e 表示添加额外 Key-Value 信息
// 除了默认启动的 Activity 以外,打开其他的 Activity 时,需要在 AndroidManifest 文件中添加 android:exported="true" 属性
adb shell am start package/package-activity
// 启动Service
adb shell am startservice [options] intent
// 发送广播
adb shell am broadcast [options] intent
// 使用 Instrumentation 实例启动监控。通常,目标 component 是表单 test_package/runner_class
adb shell am instrument [options] component
// 强行停止与 package(应用的包名称)关联的所有应用
adb shell am force-stop package
// 终止与 package(应用的包名称)关联的所有进程。仅终止可安全终止且不会影响用户体验的进程。
adb shell am kill [options] package
复制代码
举例:
// 启动包名为com.zjx.sample.proguard的APP中的MainActivity
// Service和这个类似
adb shell am start com.zjx.sample.proguard/.MainActivity
// 模拟发送一个屏幕打开的广播
adb shell am broadcast -a adnroid.intent.action.ACTION_SCREEN_ON
// 强制关闭应用
adb shell am force-stop com.zjx.sample.proguard
复制代码
pm相关
在 adb shell 中,您可以使用软件包管理器 (pm) 工具发出命令,以对设备上安装的应用软件包进行操作和查询。
// 看是否在shell环境下,在则无需 adb shell
(adb shell) pm command
// 输出所有软件包,或者,仅输出包名称包含 filter 中的文本的软件包
adb shell pm list packages [options] filter
// 输出给定 package 的 APK 的路径
adb shell pm path package
// 删除与软件包关联的所有数据
adb shell pm clear package
复制代码
举例:
// 列出包名包含com.zjx的应用包名列表
adb shell pm list packages com.zjx
// 输出com.zjx.sample.proguard应用的路径
adb shell pm path com.zjx.sample.proguard
复制代码
截屏和录屏
虽然现在有很多截屏和录屏的软件,但是使用命令也是很方便的,而且效果不错。
// 截屏
adb shell screencap filename
// 录屏
// 要求:Android 4.4(API 级别 19)及更高版本
// 此实用程序将屏幕 Activity 录制到 MPEG-4 文件
// 按 Control + C 停止屏幕录制,否则,到三分钟或 --time-limit 设置的时间限制时,录制将自动停止。
// 可以任何支持的分辨率和所需的比特率进行录制,同时保留设备显示屏的纵横比
// 不支持在录制时旋转屏幕。如果在录制期间屏幕旋转了,则部分屏幕的录制将被切断
adb shell screenrecord [options] filename
复制代码
dumpsys相关
dumpsys功能很丰富,可以将系统数据转储到屏幕。可以通过adb shell service list
或者adb shell dumpsys -l
查看dumpsys支持的服务,常用的有:activity、package、window、input、alarm、meminfo等。
//查询AMS服务相关信息
adb shell dumpsys activity
//查询WMS服务相关信息
adb shell dumpsys window
//查询CPU情况
adb shell dumpsys cpuinfo
//查询内存情况
adb shell dumpsys meminfo
...
复制代码
举例:
// 打印com.zjx.sample.proguard应用的Activity信息
adb shell dumpsys activity com.zjx.sample.proguard
复制代码
logcat相关
Logcat 是一个命令行工具,用于转储系统消息日志,其中包括设备引发错误时的堆叠追踪以及从您的应用使用 Log 类编写的消息。
[adb] logcat [<option>] ... [<filter-spec>] ...
复制代码
每个 Android 日志消息都有与其关联的标记和优先级,我们可以对日志进行过滤。
优先级由以下某个字符值表示(按从最低到最高优先级的顺序排列):
- V — 详细(最低优先级)
- D — 调试
- I — 信息
- W — 警告
- E — 错误
- F — 致命
- S — 静默(最高优先级,不会打印任何内容)
过滤器表达式遵循 tag:priority ...
这个格式,其中 tag 表示感兴趣的标记,priority 表示将该标记报告的最低优先级。
adb logcat MainActivity:D *:S
复制代码
该表达式将阻止除了带有标记“MainActivity”、优先级等于或高于“调试”的日志消息。最后一个元素 *:S 将所有标记的优先级设为“静默”,从而确保系统仅显示带有“MainActivity”标记的日志消息。
第三方工具
ADB插件
在Android Studio中可以添加一个ADB Idea
插件,可以方便的在IDE中调用ADB命令。
logcat
Android Studio中已经提供了logcat显示区,这里再推荐一个logcat命令行工具: PID Cat。
通过 WLAN 连接到设备
除了使用USB使用ADB,还可以通过WLAN使用,详情见:ADB文档(这个不算第三方工具)。
总结
ADB的命令非常丰富,远不止上述的那些。通过adb shell ls /system/bin
可以查到可用的命令列表。我们日常使用ADB时不必刻意去记这些命令,使用次数多了也就熟了。当然,要使用复杂的功能还是得查资料的,毕竟脑瓜子记不住那么多细节。
参考资料
- adb文档
developer.android.com/studio/comm… - dumpsys文档
developer.android.com/studio/comm… - logcat文档
developer.android.com/studio/comm… - android adb常用命令收集
www.jianshu.com/p/85066854c… - Android adb 常用命令
blog.csdn.net/Next_Second… - ADB 常用命令
wl9739.github.io/2017/05/22/…