今天看了下adb shell中的am pm命令,一些自己的见解和大多数官网的翻译。
先说下am命令,am全称activity manager,你能使用am去模拟各种系统的行为,例如去启动一个activity,强制停止进程,发送广播进程,修改设备屏幕属性等等。当你在adb shell命令下执行am命令:
am <command>
你也可以在adb shell前执行am命令:
adb shell am start -a android.intent.action.VIEW
关于一些am命令的介绍:
start [options] <INTENT> :启动activity通过指定的intent参数。具体intent参数参照官方表。
startservice [options] <INTENT> : 启动service通过指定的intent参数。具体intent跟start命令参数相同。
force-stop <PACKAGE> : 强制停止指定的package包应用。
kill [options] <PACKAGE> :杀死指定package包应用进程,该命令在安全模式下杀死进程,不影响用户体验。参数选项:–user <USER_ID> | all | current: 指定user进程杀死,如果不指定默认为所有users。(关于USER_ID下面会介绍到)
kill-all :杀死所有的后台进程。
broadcast [options] <INTENT> :发送一个intent。具体intent参数参照start命令参数。参数选项:–user <USER_ID> | all | current: 指定user进程杀死,如果不指定默认为所有users。
instrument [options] <COMPONENT> :测试命令,不多作介绍。
profile start <PROCESS> <FILE> :在<PROCESS>进程中运行profile,分析结果写到<FILE>里。
profile stop <PROCESS> :停止profile。
set-debug-app [options] <PACKAGE> :设置package包应用为debug模式。参数选项:-w|–persistent:等待进入调试模式,保留值。
clear-debug-app :清空之前用set-debug-app命令设置的package包应用。
以下命令查看官网:
monitor [options]
screen-compat [on|off] <PACKAGE>
display-size [reset|<WxH>]
display-density <dpi>
to-uri <INTENT>
to-intent-uri <INTENT>
接下来介绍pm命令,pm全称package manager,你能使用pm命令去模拟Android行为或者查询设备上的应用等,当你在adb shell命令下执行pm命令:
pm <command>
你也可以在adb shell前执行pm命令:
adb shell pm uninstall com.example.MyApp
关于一些pm命令的介绍:
list packages [options] <FILTER> :打印所有包,选择性的查询包列表。参数选项:-f:查看关联文件,即应用apk的位置跟对应的包名(如:package:/system/app/MusicPlayer.apk=com.sec.android.app.music);-d:查看disabled packages;-e:查看enable package;-s:查看系统package;-3:查看第三方package;-i:查看package的对应安装者(如:1、package:com.tencent.qqmusic installer=null 2、package:com.tencent.qqpim installer=com.android.vending);-u:查看曾被卸载过的package。(卸载后又重新安装依然会被列入);–user<USER_ID>:The user space to query。
list permission-groups :打印所有已知的权限群组。
list permissions [options] <GROUP> :选择性的打印权限。参数选项:
list features :设备特性。硬件之类的性能。
list libraries :当前设备支持的libs。
list users :系统上所有的users。(上面提到的USER_ID查询方式,如:UserInfo{0:Primary:3}那么USER_ID为0)
path <PACKAGE> :查询package的安装位置。
install [options] <PATH> :安装命令。
uninstall [options] <PACKAGE> :卸载命令。
clear <PACKAGE> :对指定的package删除所有数据。
enable <PACKAGE_OR_COMPONENT> :使package或component可用。(如:pm enable "package/class")
disable <PACKAGE_OR_COMPONENT> :使package或component不可用。(如:pm disable "package/class")(disable了指定的package,但是getComponentEnabledSetting该package里的components依然是enable状态的。disable-user一样原理。)
disable-user [options] <PACKAGE_OR_COMPONENT> :参数选项:–user <USER_ID>: The user to disable.
grant <PACKAGE_PERMISSION> :授权给应用。
revoke <PACKAGE_PERMISSION> :撤销权限。
set-install-location <LOCATION> :设置默认的安装位置。其中0:让系统自动选择最佳的安装位置。1:安装到内部的设备存储空间。2:安装到外部的设备存储空间。(这只用于调试应用程序,使用该命令可能导致应用程序退出或者其他不适的后果)。
get-install-location :返回当前的安装位置。返回结果同上参数选项。
set-permission-enforced <PERMISSION> [true|false] :使指定权限生效或者失效。
create-user <USER_NAME> :增加一个新的USER。
remove-user <USER_ID> :删除一个USER。
get-max-users :该设备所支持的最大USER数。(某些设备不支持该命令)
以上某些命令可能需要ROOT权限。
一、概述
作为一名开发者,相信对adb指令一定不会陌生。那么在手机连接adb后,可通过am命令做很多操作:
(1) 拨打电话10086
adb shell am start -a android.intent.action.CALL -d tel:10086
(2) 打开网站www.yuanhh.com
adb shell am start -a android.intent.action.VIEW -d http://www.yuanhh.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 yuanhh.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命令实的实现方式,几乎都是调用ActivityManagerService相应的方法来完成的,am monitor
除外。比如前面概述中介绍的命令am start -a android.intent.action.VIEW -d http://www.yuanhh.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.VIEWam start -n com.yuanhh.app/.MainActivity am start -d content://contacts/people/1am 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 yuanhh.com
此处-es website yuanhh.com
,等价于Intent.putExtra(“website”, “yuanhh.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
转载请注明:学时网 » android am pm命令