一、概述
作爲一名開發者,相信對adb指令一定不會陌生。那麼在手機連接adb後,可通過am命令做很多操作:
(1) 撥打電話10086
adb shell am start -a android.intent.action.CALL -d tel:10086
(2) 打開網站www.gityuan.com
adb shell am start -a android.intent.action.VIEW -d http://gityuan.com
(3) 啓動Activity: 啓動包名爲com.yuanhh.app
,主Activity爲.MainActivity
,且extra數據以”website”爲key,
“yuanh.com”爲value。通過java代碼要完成該功能雖然不復雜,但至少需要一個android環境,而通過adb的方式,只需要在adb窗口,輸入如下命令便可完成:
am start -n com.yuanhh.app/.MainActivity -es website gityuan.com
am命令還可以啓動Service、Broadcast,殺進程,監控等功能,這些功能都非常便捷調試程序,接下來講述關於am更多更詳細的功能。
二、Am命令
命令格式:
am [subcommand] [options]
命令列表:
命令 | 功能 | 實現方法 |
---|---|---|
am start [options ] <INTENT > |
啓動Activity | startActivityAsUser |
am startservice <INTENT > |
啓動Service | startService |
am stopservice <INTENT > |
停止Service | stopService |
am broadcast <INTENT > |
發送廣播 | broadcastIntent |
am kill <PACKAGE > |
殺指定後臺進程 | killBackgroundProcesses |
am kill-all | 殺所有後臺進程 | killAllBackgroundProcesses |
am force-stop <PACKAGE > |
強殺進程 | forceStopPackage |
am hang | 系統卡住 | hang |
am restart | 重啓 | restart |
am bug-report | 創建bugreport | requestBugReport |
am dumpheap <pid > <file > |
進程pid的堆信息輸出到file | dumpheap |
am send-trim-memory <pid ><level > |
收緊進程的內存 | setProcessMemoryTrimLevel |
am monitor | 監控 | MyActivityController.run |
am命令實的實現方式在Am.java,最終幾乎都是調用ActivityManagerService
相應的方法來完成的,am
monitor
除外。比如前面概述中介紹的命令am start -a android.intent.action.VIEW
-d http://gityuan.com
, 啓動Acitivty最終調用的是ActivityManagerService類的startActivityAsUser()方法來完成的。再比如am
kill-all
命令,最終的實現工作是由ActivityManagerService的killBackgroundProcesses()方法完成的。
接下來,說說[options
]和 <INTENT
>參數的意義以及如何正確取值。
三、 Options
3.1 啓動Activity
主要是啓動Activity命令am start [options] <INTENT>
使用options參數,接下來列舉Activity命令的[options]參數:
- -D: 允許調試功能
- -W: 等待app啓動完成
- -R
<COUNT
>: 重複啓動Activity COUNT次 - -S: 啓動activity之前,先調用forceStopPackage()方法強制停止app.
- –opengl-trace: 運行獲取OpenGL函數的trace
- –user
<USER_ID
>|
current: 指定用戶來運行App,默認爲當前用戶。 - –start-profiler
<FILE
>: 啓動profiler,並將結果發送到<FILE
>; - -P
<FILE
>: 類似 –start-profiler,不同的是當app進入idle狀態,則停止profiling - –sampling INTERVAL: 設置profiler 取樣時間間隔,單位ms;
啓動Activity的實現原理: 存在-W參數則調用startActivityAndWait()方法來運行,否則startActivityAsUser()。
3.2 收緊內存
命令
am send-trim-memory <pid> <level>
例如: 向pid=12345的進程,發出level=RUNNING_LOW的收緊內存命令
am send-trim-memory 12345 RUNNING_LOW。
那麼level取值範圍爲: HIDDEN、RUNNING_MODERATE、BACKGROUND、RUNNING_LOW、MODERATE、RUNNING_CRITICAL、COMPLETE。
3.3 其他
對於am的子命令,startservice, stopservice, broadcast, kill, profile start, profile stop, dumpheap的可選參數都允許設置--user
<USER_ID>
。目前市面上的絕大多數手機還是單用戶模式,故可以忽略該參數,默認爲當前用戶。
例如:啓動id=10010的用戶的指定service。
am startservice --user 10010
四、 Intent
Intent的參數和flags較多,本文爲方便起見,分爲3種類型參數,常用參數,Extra參數,Flags參數。
4.1 常用參數
-a <ACTION>
: 指定Intent action, 實現原理Intent.setAction();-n <COMPONENT>
: 指定組件名,格式爲{包名}/.{主Activity名},實現原理Intent.setComponent();-d <DATA_URI>
: 指定Intent data URI-t <MIME_TYPE>
: 指定Intent MIME Type-c <CATEGORY> [-c <CATEGORY>] ...]
:指定Intent category,實現原理Intent.addCategory()-p <PACKAGE>
: 指定包名,實現原理Intent.setPackage();-f <FLAGS>
: 添加flags,實現原理Intent.setFlags(int ),緊接着的參數必須是int型;
實例
am start -a android.intent.action.VIEW
am start -n com.yuanhh.app/.MainActivity
am start -d content://contacts/people/1
am start -t image/png
am start -c android.intent.category.APP_CONTACTS
4.2 Extra參數
(1). 基本類型
參數 | -e/-es | -esn | -ez | -ei | -el | -ef | -eu | -ecn |
類型 | String | (String)null | boolean | int | long | float | uri | component |
比如參數es是Extra String首字母簡稱,實例:
am start -n com.yuanhh.app/.MainActivity -es website gityuan.com
此處-es website gityuan.com
,等價於Intent.putExtra(“website”, “gityuan.com”);
(2). 數組類型
參數 | -esa | -eia | -ela | -efa |
數組類型 | String[] | int[] | long[] | float[] |
比如參數eia,是Extra int array首字母簡稱,多個value值之間以逗號隔開,實例:
am start -n com.yuanhh.app/.MainActivity -ela weekday 1,2,3,4,5
此處-ela weekday 1,2,3,4,5
,等價於Intent.putExtra(“weekday”, new int[]{1,2,3,4,5});
(3). ArrayList類型
參數 | -esal | -eial | -elal | -efal |
List類型 | String | int | long | float |
比如參數efal,是Extra float Array List首字母簡稱,多個value值之間以逗號隔開,實例:
am start -n com.yuanhh.app/.MainActivity -efal nums 1.2,2.2
此處-efal nums 1.2,2.2
,等價於先構造ArrayList變量,再通過putExtra放入第二個參數。
4.3 Flags參數
在參數類型1中,提到有-f <FLAGS>
,是通過Intent.setFlags(int
)
方法,來設置Intent的flags.本小節也是關於flags,是通過Intent.addFlags(int )
方法。如下所示,所有的flags參數。
[--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]
[--receiver-registered-only] [--receiver-replace-pending]
例如,發送action=”broadcast.demo”的廣播,並且對於forceStopPackage()的應用不允許接收該廣播,命令如下:
am broadcast -a broadcast.demo --exclude-stopped-packages