来玩一下ADB

avatar
Android @奇舞团Android团队

前言

Android 调试桥(Android Debug Bridge,简称ADB)是 Android 的一个通用命令行工具。它可以帮助PC与模拟器实例或连接的 Android 设备进行通信。它为各种设备操作提供便利,如安装和调试应用,并提供对 Unix shell 的访问。

工作方式

ADB是客户端-服务端模式的程序,包含三个组件:

  1. 客户端:该组件发送命令,在开发计算机上运行。可以通过发出 ADB 命令从命令行终端调用客户端。
  2. 后台程序:该组件在设备上运行命令。后台程序在每个模拟器或设备实例上作为后台进程运行。
  3. 服务器:该组件管理客户端和后台程序之间的通信。服务器在开发计算机上作为后台进程运行。

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

dumpsys示例

logcat相关

Logcat 是一个命令行工具,用于转储系统消息日志,其中包括设备引发错误时的堆叠追踪以及从您的应用使用 Log 类编写的消息。

[adb] logcat [<option>] ... [<filter-spec>] ...

logcat命令参数

每个 Android 日志消息都有与其关联的标记和优先级,我们可以对日志进行过滤。
优先级由以下某个字符值表示(按从最低到最高优先级的顺序排列):

  • V — 详细(最低优先级)
  • D — 调试
  • I — 信息
  • W — 警告
  • E — 错误
  • F — 致命
  • S — 静默(最高优先级,不会打印任何内容)

过滤器表达式遵循 tag:priority ... 这个格式,其中 tag 表示感兴趣的标记,priority 表示将该标记报告的最低优先级。

adb logcat MainActivity:D *:S

该表达式将阻止除了带有标记“MainActivity”、优先级等于或高于“调试”的日志消息。最后一个元素 *:S 将所有标记的优先级设为“静默”,从而确保系统仅显示带有“MainActivity”标记的日志消息。

示例log

第三方工具

ADB插件

在Android Studio中可以添加一个ADB Idea插件,可以方便的在IDE中调用ADB命令。

ADB Idea 1

ADB Idea 2

logcat

Android Studio中已经提供了logcat显示区,这里再推荐一个logcat命令行工具: PID Cat

通过 WLAN 连接到设备

除了使用USB使用ADB,还可以通过WLAN使用,详情见:ADB文档(这个不算第三方工具)。

总结

ADB的命令非常丰富,远不止上述的那些。通过adb shell ls /system/bin可以查到可用的命令列表。我们日常使用ADB时不必刻意去记这些命令,使用次数多了也就熟了。当然,要使用复杂的功能还是得查资料的,毕竟脑瓜子记不住那么多细节。

参考资料

  1. adb文档
    developer.android.com/studio/comm…
  2. dumpsys文档
    developer.android.com/studio/comm…
  3. logcat文档
    developer.android.com/studio/comm…
  4. android adb常用命令收集
    www.jianshu.com/p/85066854c…
  5. Android adb 常用命令
    blog.csdn.net/Next_Second…
  6. ADB 常用命令
    wl9739.github.io/2017/05/22/…

关注微信公众号,最新技术干货实时推送

image