William

不管走了多远都不要忘记为什么出发

0%

AM命令

简单介绍

am指令是 activity manager的缩写,可以启动Service、Broadcast,杀进程,监控等功能,这些功能都非常便捷调试程序。

可以通过adb shell 进入Android 的Linux命令界面,输入am -help查看详细命令,先介绍几个简单用法.

1
2
3
4
5
6
7
8
//使用Action方式打开系统设置-输入法设置
am start -a android.settings.INPUT_METHOD_SETTINGS

//使用Action方式打开网站https://amberweather.com
am start -a android.intent.action.VIEW -d https://amberweather.com

//打开拨号界面,并传递一个DATA_URI数据给拨号界面
am start -a android.intent.action.CALL -d tel:10086

命令

通过am -h可以查看am完整的用法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
sirius:/ $ am -h
Activity manager (activity) commands:
help
Print this help text.
start-activity [-D] [-N] [-W] [-P <FILE>] [--start-profiler <FILE>]
[--sampling INTERVAL] [--streaming] [-R COUNT] [-S]
[--track-allocation] [--user <USER_ID> | current] <INTENT>
Start an Activity. Options are:
-D: enable debugging
-N: enable native debugging
-W: wait for launch to complete
--start-profiler <FILE>: start profiler and send results to <FILE>
--sampling INTERVAL: use sample profiling with INTERVAL microseconds
between samples (use with --start-profiler)
--streaming: stream the profiling output to the specified file
(use with --start-profiler)
-P <FILE>: like above, but profiling stops when app goes idle
--attach-agent <agent>: attach the given agent before binding
--attach-agent-bind <agent>: attach the given agent during binding
-R: repeat the activity launch <COUNT> times. Prior to each repeat,
the top activity will be finished.
-S: force stop the target app before starting the activity
--track-allocation: enable tracking of object allocations
--user <USER_ID> | current: Specify which user to run as; if not
specified then run as the current user.
--windowingMode <WINDOWING_MODE>: The windowing mode to launch the activity into.
--activityType <ACTIVITY_TYPE>: The activity type to launch the activity as.
start-service [--user <USER_ID> | current] <INTENT>
Start a Service. Options are:
--user <USER_ID> | current: Specify which user to run as; if not
specified then run as the current user.
start-foreground-service [--user <USER_ID> | current] <INTENT>
Start a foreground Service. Options are:
--user <USER_ID> | current: Specify which user to run as; if not
specified then run as the current user.
stop-service [--user <USER_ID> | current] <INTENT>
Stop a Service. Options are:
--user <USER_ID> | current: Specify which user to run as; if not
specified then run as the current user.
broadcast [--user <USER_ID> | all | current] <INTENT>
Send a broadcast Intent. Options are:
--user <USER_ID> | all | current: Specify which user to send to; if not
specified then send to all users.
--receiver-permission <PERMISSION>: Require receiver to hold permission.
instrument [-r] [-e <NAME> <VALUE>] [-p <FILE>] [-w]
[--user <USER_ID> | current] [--no-hidden-api-checks]
[--no-window-animation] [--abi <ABI>] <COMPONENT>
Start an Instrumentation. Typically this target <COMPONENT> is in the
form <TEST_PACKAGE>/<RUNNER_CLASS> or only <TEST_PACKAGE> if there
is only one instrumentation. Options are:
-r: print raw results (otherwise decode REPORT_KEY_STREAMRESULT). Use with
[-e perf true] to generate raw output for performance measurements.
-e <NAME> <VALUE>: set argument <NAME> to <VALUE>. For test runners a
common form is [-e <testrunner_flag> <value>[,<value>...]].
-p <FILE>: write profiling data to <FILE>
-m: Write output as protobuf to stdout (machine readable)
-f <Optional PATH/TO/FILE>: Write output as protobuf to a file (machine
readable). If path is not specified, default directory and file name will
be used: /sdcard/instrument-logs/log-yyyyMMdd-hhmmss-SSS.instrumentation_data_proto
-w: wait for instrumentation to finish before returning. Required for
test runners.
--user <USER_ID> | current: Specify user instrumentation runs in;
current user if not specified.
--no-hidden-api-checks: disable restrictions on use of hidden API.
--no-window-animation: turn off window animations while running.
--abi <ABI>: Launch the instrumented process with the selected ABI.
This assumes that the process supports the selected ABI.
trace-ipc [start|stop] [--dump-file <FILE>]
Trace IPC transactions.
start: start tracing IPC transactions.
stop: stop tracing IPC transactions and dump the results to file.
--dump-file <FILE>: Specify the file the trace should be dumped to.
profile [start|stop] [--user <USER_ID> current] [--sampling INTERVAL]
[--streaming] <PROCESS> <FILE>
Start and stop profiler on a process. The given <PROCESS> argument
may be either a process name or pid. Options are:
--user <USER_ID> | current: When supplying a process name,
specify user of process to profile; uses current user if not specified.
--sampling INTERVAL: use sample profiling with INTERVAL microseconds
between samples
--streaming: stream the profiling output to the specified file
dumpheap [--user <USER_ID> current] [-n] [-g] <PROCESS> <FILE>
Dump the heap of a process. The given <PROCESS> argument may
be either a process name or pid. Options are:
-n: dump native heap instead of managed heap
-g: force GC before dumping the heap
--user <USER_ID> | current: When supplying a process name,
specify user of process to dump; uses current user if not specified.
set-debug-app [-w] [--persistent] <PACKAGE>
Set application <PACKAGE> to debug. Options are:
-w: wait for debugger when application starts
--persistent: retain this value
clear-debug-app
Clear the previously set-debug-app.
set-watch-heap <PROCESS> <MEM-LIMIT>
Start monitoring pss size of <PROCESS>, if it is at or
above <HEAP-LIMIT> then a heap dump is collected for the user to report.
clear-watch-heap
Clear the previously set-watch-heap.
bug-report [--progress | --telephony]
Request bug report generation; will launch a notification
when done to select where it should be delivered. Options are:
--progress: will launch a notification right away to show its progress.
--telephony: will dump only telephony sections.
force-stop [--user <USER_ID> | all | current] <PACKAGE>
Completely stop the given application package.
crash [--user <USER_ID>] <PACKAGE|PID>
Induce a VM crash in the specified package or process
kill [--user <USER_ID> | all | current] <PACKAGE>
Kill all background processes associated with the given application.
kill-all
Kill all processes that are safe to kill (cached, etc).
make-uid-idle [--user <USER_ID> | all | current] <PACKAGE>
If the given application's uid is in the background and waiting to
become idle (not allowing background services), do that now.
monitor [--gdb <port>]
Start monitoring for crashes or ANRs.
--gdb: start gdbserv on the given port at crash/ANR
watch-uids [--oom <uid>]
Start watching for and reporting uid state changes.
--oom: specify a uid for which to report detailed change messages.
hang [--allow-restart]
Hang the system.
--allow-restart: allow watchdog to perform normal system restart
restart
Restart the user-space system.
idle-maintenance
Perform idle maintenance now.
screen-compat [on|off] <PACKAGE>
Control screen compatibility mode of <PACKAGE>.
package-importance <PACKAGE>
Print current importance of <PACKAGE>.
to-uri [INTENT]
Print the given Intent specification as a URI.
to-intent-uri [INTENT]
Print the given Intent specification as an intent: URI.
to-app-uri [INTENT]
Print the given Intent specification as an android-app: URI.
switch-user <USER_ID>
Switch to put USER_ID in the foreground, starting
execution of that user if it is currently stopped.
get-current-user
Returns id of the current foreground user.
start-user <USER_ID>
Start USER_ID in background if it is currently stopped;
use switch-user if you want to start the user in foreground
unlock-user <USER_ID> [TOKEN_HEX]
Attempt to unlock the given user using the given authorization token.
stop-user [-w] [-f] <USER_ID>
Stop execution of USER_ID, not allowing it to run any
code until a later explicit start or switch to it.
-w: wait for stop-user to complete.
-f: force stop even if there are related users that cannot be stopped.
is-user-stopped <USER_ID>
Returns whether <USER_ID> has been stopped or not.
get-started-user-state <USER_ID>
Gets the current state of the given started user.
track-associations
Enable association tracking.
untrack-associations
Disable and clear association tracking.
get-uid-state <UID>
Gets the process state of an app given its <UID>.
attach-agent <PROCESS> <FILE>
Attach an agent to the specified <PROCESS>, which may be either a process name or a PID.
get-config [--days N] [--device] [--proto]
Retrieve the configuration and any recent configurations of the device.
--days: also return last N days of configurations that have been seen.
--device: also output global device configuration info.
--proto: return result as a proto; does not include --days info.
supports-multiwindow
Returns true if the device supports multiwindow.
supports-split-screen-multi-window
Returns true if the device supports split screen multiwindow.
suppress-resize-config-changes <true|false>
Suppresses configuration changes due to user resizing an activity/task.
set-inactive [--user <USER_ID>] <PACKAGE> true|false
Sets the inactive state of an app.
get-inactive [--user <USER_ID>] <PACKAGE>
Returns the inactive state of an app.
set-standby-bucket [--user <USER_ID>] <PACKAGE> active|working_set|frequent|rare
Puts an app in the standby bucket.
get-standby-bucket [--user <USER_ID>] <PACKAGE>
Returns the standby bucket of an app.
send-trim-memory [--user <USER_ID>] <PROCESS>
[HIDDEN|RUNNING_MODERATE|BACKGROUND|RUNNING_LOW|MODERATE|RUNNING_CRITICAL|COMPLETE]
Send a memory trim event to a <PROCESS>. May also supply a raw trim int level.
display [COMMAND] [...]: sub-commands for operating on displays.
move-stack <STACK_ID> <DISPLAY_ID>
Move <STACK_ID> from its current display to <DISPLAY_ID>.
stack [COMMAND] [...]: sub-commands for operating on activity stacks.
start <DISPLAY_ID> <INTENT>
Start a new activity on <DISPLAY_ID> using <INTENT>
move-task <TASK_ID> <STACK_ID> [true|false]
Move <TASK_ID> from its current stack to the top (true) or
bottom (false) of <STACK_ID>.
resize <STACK_ID> <LEFT,TOP,RIGHT,BOTTOM>
Change <STACK_ID> size and position to <LEFT,TOP,RIGHT,BOTTOM>.
resize-animated <STACK_ID> <LEFT,TOP,RIGHT,BOTTOM>
Same as resize, but allow animation.
resize-docked-stack <LEFT,TOP,RIGHT,BOTTOM> [<TASK_LEFT,TASK_TOP,TASK_RIGHT,TASK_BOTTOM>]
Change docked stack to <LEFT,TOP,RIGHT,BOTTOM>
and supplying temporary different task bounds indicated by
<TASK_LEFT,TOP,RIGHT,BOTTOM>
move-top-activity-to-pinned-stack: <STACK_ID> <LEFT,TOP,RIGHT,BOTTOM>
Moves the top activity from
<STACK_ID> to the pinned stack using <LEFT,TOP,RIGHT,BOTTOM> for the
bounds of the pinned stack.
positiontask <TASK_ID> <STACK_ID> <POSITION>
Place <TASK_ID> in <STACK_ID> at <POSITION>
list
List all of the activity stacks and their sizes.
info <WINDOWING_MODE> <ACTIVITY_TYPE>
Display the information about activity stack in <WINDOWING_MODE> and <ACTIVITY_TYPE>.
remove <STACK_ID>
Remove stack <STACK_ID>.
task [COMMAND] [...]: sub-commands for operating on activity tasks.
lock <TASK_ID>
Bring <TASK_ID> to the front and don't allow other tasks to run.
lock stop
End the current task lock.
resizeable <TASK_ID> [0|1|2|3]
Change resizeable mode of <TASK_ID> to one of the following:
0: unresizeable
1: crop_windows
2: resizeable
3: resizeable_and_pipable
resize <TASK_ID> <LEFT,TOP,RIGHT,BOTTOM>
Makes sure <TASK_ID> is in a stack with the specified bounds.
Forces the task to be resizeable and creates a stack if no existing stack
has the specified bounds.
update-appinfo <USER_ID> <PACKAGE_NAME> [<PACKAGE_NAME>...]
Update the ApplicationInfo objects of the listed packages for <USER_ID>
without restarting any processes.
write
Write all pending state to storage.

<INTENT> specifications include these flags and arguments:
[-a <ACTION>] [-d <DATA_URI>] [-t <MIME_TYPE>]
[-c <CATEGORY> [-c <CATEGORY>] ...]
[-n <COMPONENT_NAME>]
[-e|--es <EXTRA_KEY> <EXTRA_STRING_VALUE> ...]
[--esn <EXTRA_KEY> ...]
[--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> ...]
[--ei <EXTRA_KEY> <EXTRA_INT_VALUE> ...]
[--el <EXTRA_KEY> <EXTRA_LONG_VALUE> ...]
[--ef <EXTRA_KEY> <EXTRA_FLOAT_VALUE> ...]
[--eu <EXTRA_KEY> <EXTRA_URI_VALUE> ...]
[--ecn <EXTRA_KEY> <EXTRA_COMPONENT_NAME_VALUE>]
[--eia <EXTRA_KEY> <EXTRA_INT_VALUE>[,<EXTRA_INT_VALUE...]]
(mutiple extras passed as Integer[])
[--eial <EXTRA_KEY> <EXTRA_INT_VALUE>[,<EXTRA_INT_VALUE...]]
(mutiple extras passed as List<Integer>)
[--ela <EXTRA_KEY> <EXTRA_LONG_VALUE>[,<EXTRA_LONG_VALUE...]]
(mutiple extras passed as Long[])
[--elal <EXTRA_KEY> <EXTRA_LONG_VALUE>[,<EXTRA_LONG_VALUE...]]
(mutiple extras passed as List<Long>)
[--efa <EXTRA_KEY> <EXTRA_FLOAT_VALUE>[,<EXTRA_FLOAT_VALUE...]]
(mutiple extras passed as Float[])
[--efal <EXTRA_KEY> <EXTRA_FLOAT_VALUE>[,<EXTRA_FLOAT_VALUE...]]
(mutiple extras passed as List<Float>)
[--esa <EXTRA_KEY> <EXTRA_STRING_VALUE>[,<EXTRA_STRING_VALUE...]]
(mutiple extras passed as String[]; to embed a comma into a string,
escape it using "\,")
[--esal <EXTRA_KEY> <EXTRA_STRING_VALUE>[,<EXTRA_STRING_VALUE...]]
(mutiple extras passed as List<String>; to embed a comma into a string,
escape it using "\,")
[-f <FLAG>]
[--grant-read-uri-permission] [--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] [--activity-match-external]
[--receiver-registered-only] [--receiver-replace-pending]
[--receiver-foreground] [--receiver-no-abort]
[--receiver-include-background]
[--selector]
[<URI> | <PACKAGE> | <COMPONENT>]

命令列表

命令 功能 实现方法
am start [options] 启动Activity startActivityAsUser
am startservice 启动Service startService
am stopservice 停止Service stopService
am broadcast 发送广播 broadcastIntent
am restart 重启 restart
am dumpheap <pid> <file> 进程pid的堆信息输出到file dumpheap
am send-trim-memory <pid> <level> 收紧进程的内存 setProcessMemoryTrimLevel
am kill <PACKAGE> 杀指定后台进程 killBackgroundProcesses
am kill-all 杀所有后台进程 killAllBackgroundProcesses
am force-stop <PACKAGE> 强杀进程 forceStopPackage
am hang 系统卡住 hang
am monitor 监控 MyActivityController.run

原理分析:am命令实的实现方式在Am.java,最终几乎都是调用ActivityManagerService相应的方法来完成的,am monitor除外。比如前面概述中介绍的命令am start -a android.intent.action.VIEW -d https://amberweather.com, 启动Acitivty最终调用的是ActivityManagerService类的startActivityAsUser()方法来完成的。再比如am kill-all命令,最终的实现工作是由ActivityManagerService的killBackgroundProcesses()方法完成的。

启动Activity

主要是启动Activity命令am start [options] 使用options参数,接下来列举Activity命令的[options]参数:

1
2
3
4
5
6
7
8
-D:开启debug模式
-W:等待启动完成
--start-profiler<FILE>:将profiler中的结果输出到指定文件中
-P:和--start-profiler一样,区别在于,在app进入idle状态时profiler结束
-R <Count>: 重复启动Activity,但每次重复启动都会关闭掉最上面的Activity
-S:关闭Activity所属的App进程后再启动Activity
--opengl-trace:开启OpenGL tracing
--user <USER_ID> :使用指定的用户来启动activity,如果不输入,则使用当前用户执行

启动Activity的实现原理: 存在-W参数则调用startActivityAndWait()方法来运行,否则startActivityAsUser()。

收紧内存

例如: 向pid=12345的进程,发出level=RUNNING_LOW的收紧内存命令

1
am send-trim-memory 12345 RUNNING_LOW

level取值范围为: HIDDENRUNNING_MODERATEBACKGROUNDRUNNING_LOWMODERATERUNNING_CRITICALCOMPLETE

如果对你有帮助,欢迎赞赏。