概述
在 adb shell 中,您可以使用 Activity Manager (am) 工具发出命令以执行各种系统操作,如启动 Activity、强行停止进程、广播 intent、修改设备屏幕属性及其他操作。在 shell 中,此语法为:
1  | am <command>  | 
您也可以直接从 adb 发出 Activity Manager 命令,无需进入远程 shell。例如:
1  | adb shell am start -a android.intent.action.VIEW  | 
可用的 am 命令:
1  | usage: am [subcommand] [options]  | 
Intent 参数规范
由于好几个 am 命令都可以带 Intent 参数,比如 am start、am broadcast 等,这里就先介绍一下 Intent 参数规范。
可以参考官方文档
[-a <ACTION>]:指定 intent 的 Action(setAction()方法),如“android.intent.action.VIEW”。此指定只能声明一次。am start -a android.intent.action.hq.TEST_AM[-d <DATA_URI>]:指定 intent 的 Data(setData()方法),如“content://contacts/people/1”。此指定只能声明一次。[-t <MIME_TYPE>]:指定 intent MIME 类型,如“image/png”。此指定只能声明一次。[-c <CATEGORY> [-c <CATEGORY>] ...]:指定 intent 类别(addCategory(String category)),如“android.intent.category.APP_CONTACTS”。[-n <COMPONENT>]:指定带有包名前缀的组件名称以创建显式 intent,如“com.example.heqiang.testsomething/.commontest.OtherTestActivity”。[--f <FLAG>]:将标志添加到intent[-e|--es <EXTRA_KEY> <EXTRA_STRING_VALUE> ...]:添加一个 null extra。URI intent 不支持此选项。adb shell am start -a android.intent.action.hq.TEST_AM --es TEST test,如果有多个参数:adb shell am start -a android.intent.action.hq.TEST_AM --es TEST test --es TEST1 test1[--esn <EXTRA_KEY> ...]:添加字符串数据作为键值对。adb shell am start -a android.intent.action.hq.TEST_AM --esn TEST[--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> ...]:添加布尔型数据作为键值对。adb shell am start -a android.intent.action.hq.TEST_AM --ez TEST true[--ei <EXTRA_KEY> <EXTRA_INT_VALUE> ...]:添加整数型数据作为键值对。[--el <EXTRA_KEY> <EXTRA_LONG_VALUE> ...]:添加长整型数据作为键值对。[--ef <EXTRA_KEY> <EXTRA_FLOAT_VALUE> ...]:添加浮点型数据作为键值对。[--eu <EXTRA_KEY> <EXTRA_URI_VALUE> ...]:添加 URI 数据作为键值对。[--ecn <EXTRA_KEY> <EXTRA_COMPONENT_NAME_VALUE>]:添加组件名称,将其作为 ComponentName 对象进行转换和传递。[--eia <EXTRA_KEY> <EXTRA_INT_VALUE>[,<EXTRA_INT_VALUE...]]:添加整数数组, 转换成Integer[]进行传递[--eial <EXTRA_KEY> <EXTRA_INT_VALUE>[,<EXTRA_INT_VALUE...]]:添加整数数组,转换成List进行传递 [--ela <EXTRA_KEY> <EXTRA_LONG_VALUE>[,<EXTRA_LONG_VALUE...]]:添加长整型数组,转换成Long[]进行传递[--elal <EXTRA_KEY> <EXTRA_LONG_VALUE>[,<EXTRA_LONG_VALUE...]]:添加长整型数组,转换成List进行传递 [--efa <EXTRA_KEY> <EXTRA_FLOAT_VALUE>[,<EXTRA_FLOAT_VALUE...]]:添加浮点型数组,转换成Float[]进行传递[--efal <EXTRA_KEY> <EXTRA_FLOAT_VALUE>[,<EXTRA_FLOAT_VALUE...]]:添加浮点型数组,转换成List进行传递 [--esa <EXTRA_KEY> <EXTRA_STRING_VALUE>[,<EXTRA_STRING_VALUE...]]:添加字符串数组,转换成String[]进行传递adb shell am start -a android.intent.action.hq.TEST_AM --esa TEST a,b,c[--esal <EXTRA_KEY> <EXTRA_STRING_VALUE>[,<EXTRA_STRING_VALUE...]]:添加字符串数组,转换成List进行传递 [--grant-read-uri-permission]:包含标志 FLAG_GRANT_READ_URI_PERMISSION。[--grant-write-uri-permission]:包含标志 FLAG_GRANT_WRITE_URI_PERMISSION。[--grant-persistable-uri-permission]:[--grant-prefix-uri-permission]:[--debug-log-resolution]:[--exclude-stopped-packages]:[--include-stopped-packages]:[--activity-brought-to-front]:[--activity-clear-top]:[--activity-clear-when-task-reset]:[--activity-exclude-from-recents]:[--activity-launched-from-history]:[--activity-multiple-task]:[--activity-no-animation]:[--activity-no-history]:[--activity-no-user-action]:[--activity-previous-is-top]:[--activity-reorder-to-front]:[--activity-reset-task-if-needed]:[--activity-single-top]:[--activity-clear-task]:[--activity-task-on-home]:[--receiver-registered-only]:[--receiver-replace-pending]:[--receiver-foreground]:[--selector]:[<URI> | <PACKAGE> | <COMPONENT>]:如果不受上述某一选项的限制,那么就认为是直接指定 URI、包名和组件名称。当参数不受限制时,如果参数包含一个“:”(冒号),则认为参数是一个 URI;如果参数包含一个“/”(正斜杠),则认为参数是一个组件名称;否则认为参数是一个包名。
am start
启动 intent 指定的 Activity:
1  | am start [-D] [-N] [-W] [-P <FILE>] [--start-profiler <FILE>]  | 
可以使用一下选项:
- -D:启用调试。
 - -N:启用 Natvie 调试。
 -W:等待启动完成。
1
2
3
4
5
6Status: ok
Activity: com.example.heqiang.testsomething/.commontest.OtherTestActivity
ThisTime: 131
TotalTime: 131
WaitTime: 157
Complete–start-profiler
:启动分析器并将结果发送到 file。 - –sampling INTERVAL:制定采样率
 - -P 
:类似于 –start-profiler,但当应用进入空闲状态时分析停止。  - -R 
:重复 Activity 启动 count 次数。在每次重复前,将完成顶部 Activity。  - -S:启动 Activity 前强行停止目标应用。
 - –track-allocation:打开Allocation Tracker用来跟踪内存分配
 - –user <USER_ID> | current:指定要作为哪个用户运行;如果未指定,则作为当前用户运行。
 - –stack <STACK_ID>:指定将Activity放入的栈
 
am startservice
启动 intent 指定的 Service:
1  | am startservice [--user <USER_ID> | current] <INTENT>  | 
可以使用一下选项:
- –user <USER_ID> | current:指定要作为哪个用户运行;如果未指定,则作为当前用户运行。
 
am stopservice
停止一个 Service
1  | am stopservice [--user <USER_ID> | current] <INTENT>  | 
- –user <USER_ID> | current:指定要作为哪个用户运行;如果未指定,则作为当前用户运行。
 
am force-stop
1  | am force-stop [--user <USER_ID> | all | current] <PACKAGE>  | 
强行停止与 package(应用的包名称)关联的所有应用。
am kill
终止与 package(应用的包名称)关联的所有进程。此命令仅终止可安全终止且不会影响用户体验的进程。
1  | am kill [--user <USER_ID> | all | current] <PACKAGE>  | 
am kill-all
终止所有后台进程。
am broadcast
发出广播 intent。
1  | am broadcast [--user <USER_ID> | all | current] <INTENT>  | 
am stack
am stack start <DISPLAY_ID> <INTENT>:am stack movetask <TASK_ID> <STACK_ID> [true|false]:am stack resize <STACK_ID> <LEFT,TOP,RIGHT,BOTTOM>:am stack resize-animated <STACK_ID> <LEFT,TOP,RIGHT,BOTTOM>:am stack resize-docked-stack <LEFT,TOP,RIGHT,BOTTOM> [<TASK_LEFT,TASK_TOP,TASK_RIGHT,TASK_BOTTOM>]:am stack size-docked-stack-test: <STEP_SIZE> <l|t|r|b> [DELAY_MS]:am stack move-top-activity-to-pinned-stack: <STACK_ID> <LEFT,TOP,RIGHT,BOTTOM>:am stack positiontask <TASK_ID> <STACK_ID> <POSITION>:am stack list:am stack info <STACK_ID>:am stack remove <STACK_ID>:am task lock <TASK_ID>:am task lock stop:am task resizeable <TASK_ID> [0 (unresizeable) | 1 (crop_windows) | 2 (resizeable) | 3 (resizeable_and_pipable)]:am task resize <TASK_ID> <LEFT,TOP,RIGHT,BOTTOM>:am task drag-task-test <TASK_ID> <STEP_SIZE> [DELAY_MS]:am task size-task-test <TASK_ID> <STEP_SIZE> [DELAY_MS]:
am get-config
am send-trim-memory
发送回收内存的命令,会调用 Application 和 Activity 的 onTrimMemory(int level) 方法。
1  | am send-trim-memory [--user <USER_ID>] <PROCESS>  | 
1  | adb shell am send-trim-memory com.example.heqiang.testsomething RUNNING_CRITICAL  |