菜鸟科技网

shell am命令如何使用?

amActivity Manager 的缩写,它是 Android 系统中一个核心的命令行工具,用于与系统的活动管理器进行交互,开发者、测试人员和高级用户经常使用它来启动、调试和管理应用程序。

shell am命令如何使用?-图1
(图片来源网络,侵删)

am 命令是什么?

am 命令位于 Android 系统的 /system/bin/ 目录下,它允许你从命令行(通过 adb shell)或一个应用程序中,以编程方式控制 Android 的活动管理器。

它的主要功能包括:

  • 启动 Activity: 打开一个应用的界面。
  • 启动 Service: 启动一个后台服务。
  • 发送广播: 向系统或应用发送一个 Intent
  • 强制停止应用: 强制关闭一个应用及其所有组件。
  • 获取应用信息: 查看任务、进程等状态。

如何使用 am 命令?

你通常需要通过 adb shell 来访问 am 命令。

# 连接设备并进入 shell
adb shell
# 在 shell 内部使用 am 命令
am <command>

常用 am 命令详解

下面是最常用的一些 am 命令及其用法。

shell am命令如何使用?-图2
(图片来源网络,侵删)

A. 启动 Activity (startactivity)

这是最常用的功能,用于启动一个 Activity。

基本语法:

am startactivity [options] <INTENT>

<INTENT> 的格式: <INTENT> 通常是一个 Intent 的 URI 格式, <ACTION> (<DATA>) [<EXTRA_KEY> <EXTRA_VALUE>] [<FLAG>]

常用选项:

  • -W: 等待 Activity 启动完成,并返回启动信息(耗时、是否成功等)。
  • -D: 开启调试模式,会等待调试器附加。
  • -n: 直接指定要启动的组件,格式为 ComponentName,即 包名/类名,这是最明确的方式。

示例:

  1. 启动一个应用的主 Activity: 假设要启动微信的主 Activity,你需要先知道它的包名和主 Activity 类名(可以通过 adb shell dumpsys activityaapt 工具查看)。

    # 启动微信
    am start -n com.tencent.mm/.ui.LauncherUI
  2. 通过 Action 启动: 打开系统默认的网页浏览器并访问一个 URL。

    am start -a android.intent.action.VIEW -d "https://www.google.com"
  3. 带 Extra 启动: 启动一个应用并传递数据,启动一个分享界面。

    am start -a android.intent.action.SEND -t text/plain --es "android.intent.extra.TEXT" "Hello from ADB!"
    • -a android.intent.action.SEND: 指定 Action 为 "分享"。
    • -t text/plain: 指定数据类型为纯文本。
    • --es "android.intent.extra.TEXT" "...": 传递一个字符串类型的 Extra,键为 android.intent.extra.TEXT,值为 Hello from ADB!
  4. 等待启动并查看结果:

    am start -W -n com.tencent.mm/.ui.LauncherUI

    执行后会输出类似信息:

    Starting: Intent { cmp=com.tencent.mm/.ui.LauncherUI }
    Status: ok
    Activity: com.tencent.mm/.ui.LauncherUI
    ThisTime: 320
    TotalTime: 320
    WaitTime: 325

    这里的 TotalTime 就是启动耗时。

B. 启动 Service (startservice)

用于启动一个后台服务。

基本语法:

am startservice [options] <INTENT>

示例:

# 启动一个音乐播放服务
am startservice -n com.example.music/.service.MusicPlayerService

C. 发送广播 (broadcast)

向系统或应用发送一个广播消息。

基本语法:

am broadcast [options] <INTENT>

示例:

  1. 发送系统广播: 重启设备(需要 root 权限)。

    am broadcast -a android.intent.action.REBOOT
  2. 发送自定义广播: 通知一个应用数据已更新。

    am broadcast -a com.example.myapp.DATA_UPDATED --es "data_type" "user_profile"

D. 强制停止应用 (force-stop)

强制停止一个应用的所有组件(Activity, Service, BroadcastReceiver 等),这会清除该应用的所有任务。

基本语法:

am force-stop <PACKAGE_NAME>

示例:

# 强制停止微信
am force-stop com.tencent.mm

E. 清除应用数据 (clear)

清除应用的用户数据,如缓存、数据库、SharedPreferences 等。注意:此操作不可逆!

基本语法:

am clear <PACKAGE_NAME>

示例:

# 清除微信的所有用户数据
am clear com.tencent.mm

F. 获取任务列表 (stack list)

查看当前正在运行的任务(Activities)。

基本语法:

am stack list

示例:

am stack list

输出会显示所有任务栈的信息,包括最顶层的 Activity。

G. 移动任务到前台 (move-task)

将指定的任务移动到前台。

基本语法:

am move-task <task_id> to {top|bottom}

如何获取 task_id? 可以通过 am stack list 命令查看。


实用技巧与注意事项

  1. 获取包名和类名: 这是最常见的难题,可以使用以下方法:

    • adb shell dumpsys activity: 查看所有 Activity 信息,从中找到你需要的包名和类名,信息量很大,建议用 grep 过滤。
      adb shell dumpsys activity | grep -E 'mFocusedActivity|Hist'}
    • 使用 aapt 工具: 在你的 Android SDK 的 build-tools 目录下,使用 aapt dump badging <你的apk文件.apk> 可以解析出 APK 的所有信息,包括主 Activity。
  2. Intent 的缩写:

    • -a: --action (指定 Action)
    • -d: --data (指定 Data URI)
    • -t: --type (指定 Data Type)
    • -e: --es (传递 String Extra)
    • --ez: (传递 boolean Extra)
    • --ei: (传递 int Extra)
    • -n: --name (指定 ComponentName 的类名部分)
    • -p: --pkg (指定 ComponentName 的包名部分)
  3. 权限问题: 某些 am 命令(如 force-stop, reboot)需要 shell 用户或更高权限才能执行,在普通设备上可能会被拒绝。

  4. Intent 过滤器: 当你只提供 Action 和 Data 启动 Activity 时,系统会寻找所有匹配该 Intent 过滤器的 Activity,并弹出一个选择对话框,为了避免这种情况,最好使用 -n 选项直接指定完整的组件名。


am 命令是 Android 开发和测试的瑞士军刀,掌握它能让你高效地自动化测试流程、快速调试应用、手动触发特定功能,并深入理解 Android 的启动机制。

命令类别 常用命令 功能描述
启动组件 am start -n <包名/类名> 启动指定的 Activity
am start -a <ACTION> -d <URI> 通过 Action 和 Data 启动 Activity
am startservice -n <包名/类名> 启动指定的 Service
系统交互 am broadcast -a <ACTION> 发送一个广播
am force-stop <包名> 强制停止一个应用
am clear <包名> 清除一个应用的用户数据
信息查看 am stack list 列出当前所有任务
am get-config 获取当前设备的配置信息(如屏幕尺寸、密度等)

希望这份详细的解释对你有帮助!

分享:
扫描分享到社交APP
上一篇
下一篇