adb(Android Debug Bridge)是 Android 开发中不可或缺的命令行工具,它允许开发者与设备进行通信,执行各种调试和管理操作。结合 am(Activity Manager)命令,我们可以通过 adb 启动或停止应用组件(如 Activity、Service),发送广播,甚至进行端口转发。本文将详细介绍如何使用 adb 命令来操作这些组件,并给出具体示例。

博主博客

准备工作

  • 确保已安装 Android SDK Platform-Tools,并配置好环境变量,使 adb 命令可用。
  • 通过 USB 连接 Android 设备,并在设备上开启“开发者选项”和“USB 调试”。
  • 执行 adb devices 确认设备已成功连接。

一、启动 Activity

使用 am start 命令可以启动一个指定的 Activity。基本语法如下:

adb shell am start -n <包名>/<活动类全名>
  • 包名:应用的包名(例如 com.android.browser)。
  • 活动类全名:要启动的 Activity 完整类名(例如 com.android.browser.BrowserActivity)。

示例:启动系统浏览器

adb shell am start -n com.android.browser/com.android.browser.BrowserActivity

说明:如果 Activity 需要额外参数(如 -d 指定数据 URI,-a 指定 Action),也可以添加到命令中。例如:

adb shell am start -a android.intent.action.VIEW -d http://www.example.com

二、关闭 Activity(强制停止应用)

通过 am force-stop 可以强制停止某个应用(及其所有组件)。语法:

adb shell am force-stop <包名>

示例:关闭浏览器应用

adb shell am force-stop com.android.browser

三、启动 Service

启动 Service 使用 am startservice 命令。语法:

adb shell am startservice -n <包名>/<服务类全名>

示例:启动一个自定义 Service(假设包名为 com.android.traffic,服务为 maniservice

adb shell am startservice -n com.android.traffic/com.android.traffic.maniservice

注意:Service 必须在应用的 AndroidManifest.xml 中声明,并且如果 Service 需要特定权限或 Intent 参数,可以通过 --es(字符串 extra)等方式传递。

四、卸载应用程序

虽然不直接属于 am 命令,但 adb uninstall 可以快速移除应用。语法:

adb uninstall <包名>

示例:卸载浏览器

adb uninstall com.android.browser

五、发送广播

使用 am broadcast 可以发送全局广播。基本语法:

adb shell am broadcast -a <广播动作>

示例:发送网络状态变化的广播(系统常用)

adb shell am broadcast -a android.net.conn.CONNECTIVITY_CHANGE

还可以添加 Extra 数据,例如发送一个自定义广播并附带字符串参数:

adb shell am broadcast -a com.example.CUSTOM_BROADCAST --es key "value"

六、端口转发与相关广播

adb forward 用于设置端口转发,将 PC 的某个端口映射到设备的某个端口。语法:

adb forward tcp:<本地端口> tcp:<设备端口>

示例:将 PC 的 12580 端口转发到设备的 10086 端口

adb forward tcp:12580 tcp:10086

配合广播可以通知设备上的服务进行相应操作。例如,先发送广播让服务停止,再进行端口转发,然后发送广播让服务启动:

adb shell am broadcast -a NotifyServiceStop
adb forward tcp:12580 tcp:10086
adb shell am broadcast -a NotifyServiceStart

(这里的 NotifyServiceStopNotifyServiceStart 是假设的自定义广播动作,实际需根据应用定义使用)

注意事项

  1. 包名与组件名的准确性:必须确保包名和类名完全正确(包括大小写)。可以通过 adb shell dumpsys package <包名> 查看应用详情。
  2. 权限问题:某些系统组件或受保护的广播可能需要系统权限才能发送,普通应用可能无法接收或发送。
  3. Activity 启动模式:使用 am start 启动 Activity 时,可能会受启动模式(如 singleTask)影响,导致实际行为与预期不同。
  4. 安全限制:从 Android 8.0 开始,对隐式广播的限制加强,许多系统广播无法通过普通应用发送或接收,但 adb shell 拥有较高权限,仍可发送大多数广播。

总结

通过 adb 和 am 命令,开发者可以灵活地在不打开应用的情况下测试组件交互、模拟系统事件或进行自动化操作。掌握这些命令能显著提高调试效率,是 Android 开发者的必备技能。本文介绍了常用的启动 Activity/Service、发送广播、端口转发等操作,实际使用中还可结合 am 的更多参数(如 --ei 整数 extra、--ez 布尔 extra 等)传递复杂数据,以满足多样化需求。