一、am命令
先说下am命令,am全称activity manager,你能使用am去模拟各种系统的行为,例如去启动一个activity,强制停止进程,发送广播进程,修改设备屏幕属性等等。当你在adb shell命令下执行am命令:
am <command>
也可以在adb shell前执行am命令:
adb shell am start -a android.intent.action.VIEW
关于一些am命令的介绍:
命令格式如下:
am [subcommand] [options]
命令列表如下:
命令 | 功能 | 实现方法 |
am start | 启动Activity | startActivityAsUser |
am startservice | 启动Service | startService |
am stopservice | 停止Service | stopService |
am broadcast | 发送广播 | broadcastIntent |
am kill | 杀指定后台进程 | killBackgroundProcesses |
am kill-all | 杀所有后台进程 | killAllBackgroundProcesses |
am force-stop | 强杀进程 | forceStopPackage |
am hang | 系统卡住 | hang |
am restart | 重启 | restart |
am bug-report | 创建bugreport | requestBugReport |
am dumpheap | 进程pid的堆信息输出到file | dumpheap |
am send-trim-memory | 收紧进程的内存 | setProcessMemoryTrimLevel |
am monitor | 监控 | MyActivityController.run |
am命令实的实现方式在Am.java,最终几乎都是调用ActivityManagerService
相应的方法来完成。
- 比如命令
am start -a android.intent.action.VIEW -d http://gityuan.com
, 启动Acitivty最终调用的是ActivityManagerService类的startActivityAsUser()方法来完成的。 - 再比如
am kill-all
命令,最终的实现工作是由ActivityManagerService的killBackgroundProcesses()方法完成的。
Options
主要是启动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()。
Intent常用参数
-
-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型;
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.gityuan.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.gityuan.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.gityuan.app/.MainActivity -efal nums 1.2,2.2
此处-efal nums 1.2,2.2
,等价于先构造ArrayList变量,再通过putExtra放入第二个参数
start [options] <INTENT> :启动activity通过指定的intent参数。
举例:adb shell am start -a com.lt.test.action.SECOND
举例:adb shell am start -n com.lt.test/.MyActivity
startservice [options] <INTENT> : 启动service通过指定的intent参数。具体intent跟start命令参数相同。
举例:adb shell am startservice -a com.lt.test.action.ONESERVICE
举例:adb shell am startservice -n com.lt.test/.MyService
force-stop <PACKAGE> : 强制停止指定的package包应用。
举例:adb shell am force-stop com.lt.test
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。
举例:adb shell am broadcast -a "action_finish" (发送一个广播去关闭一个activity)
举例:adb shell am broadcast -a android.intent.action.MASTER_CLEAR(恢复出厂设置的方法,会清除内存所有内容)
举例:adb shell am broadcast -n com.lt.test/.MyBroadcast
instrument [options] <COMPONENT> :测试命令。
作用:启动对instrument实例的监视。
参数[options]:
-e <key> <value> // -e选项需要放在-w选项之前
作用:提供了以键值对形式存在的测试选项。Android中提供了多种键值对,具体参见下表。
举例:-e class com.android.phone.FIncomingCallTests#testRejectCall
-r
作用:以原始形式输出测试结果。该选项通常是在性能测试时与-e perf true一起使用。
参数 <COMPONENT>:
-w <test_package_name>/<runner_class> //<test_package_name>和<runner_class>在测试工程的AndroidManifest.xml中查找
作用:保持adb shell打开直至测试完成
举例:-w com.android.phone.tests/com.android.phone.runners.FunctionalTestRunner
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包应用。
trim-memory命令
收紧内存命令
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。
二、pm命令
命令格式:
pm <command>
命令列表:
命令 | 功能 | 实现方法 |
list packages | 列举app包信息 | PMS.getInstalledPackages |
install | 安装应用 | PMS.installPackageAsUser |
uninstall | 卸载应用 | IPackageInstaller.uninstall |
enable | enable | PMS.setEnabledSetting |
disable | disable | PMS.setEnabledSetting |
hide | 隐藏应用 | PMS.setApplicationHiddenSettingAsUser |
unhide | 显示应用 | PMS.setApplicationHiddenSettingAsUser |
get-install-location | 获取安装位置 | PMS.getInstallLocation |
set-install-location | 设置安装位置 | PMS.setInstallLocation |
path | 查看App路径 | PMS.getPackageInfo |
clear | 清空App数据 | AMS.clearApplicationUserData |
get-max-users | 最大用户数 | UserManager.getMaxSupportedUsers |
force-dex-opt | dex优化 | PMS.forceDexOpt |
dump | dump信息 | AM.dumpPackageStateStatic |
trim-caches | 紧缩cache目标大小 | PMS.freeStorageAndNotify |
pm命令实的实现方式在Pm.java,最后大多数都是调用PackageManagerService
相应的方法来完成的。disbale之后,在桌面和应用程序列表里边都看到不该app。
pm list packages命令
查看所有的package
list packages [options] <FILTER>
其中[options]参数:
- -f: 显示包名所关联的文件;
- -d: 只显示disabled包名;
- -e: 只显示enabled包名;
- -s: 只显示系统包名;
- -3: 只显示第3方应用的包名;
- -i: 包名所相应的installer;
- -u: 包含uninstalled包名.
规律: disabled + enabled = 总应用个数; 系统 + 第三方 = 总应用个数。
比如:查看第3方应用:
pm list packages -3
又比如,查看已经被禁用的包名。(国内的厂商一般把google的服务禁用了)
pm list packages -d
<FILTER
>参数:
当FILTER为不为空时,则只会输出包名带有FILTER字段的应用;当FILTER为空时,则默认显示所有满足条件的应用。
比如,查看包名带google字段的包名
pm list packages google
pm install命令
安装应用
pm install [options] <PATH>
其中[options]参数:
- -r: 覆盖安装已存在Apk,并保持原有数据;
- -d: 运行安装低版本Apk;
- -t: 运行安装测试Apk
- -i : 指定Apk的安装器;
- -s: 安装apk到共享快存储,比如sdcard;
- -f: 安装apk到内部系统内存;
- -l: 安装过程,持有转发锁
- -g: 准许Apk manifest中的所有权限;
PATH参数:该参数是必须的,是指需要安装的apk所在的路径。
其他参数
pm list users //查看当前手机用户
pm list libraries //查看当前设备所支持的库
pm list features //查看系统所有的features
pm list instrumentation //所有测试包的信息
pm list permission-groups //查看所有的权限组
pm list permissions [options] <group> 查看权限
-g: 以组形式组织;
-f: 打印所有信息;
-s: 简要信息;
-d: 只列举危险权限;
-u: 只列举用户可见的权限。
其他的命令
grant <PACKAGE_PERMISSION> :授权给应用。
revoke <PACKAGE_PERMISSION> :撤销权限。
set-permission-enforced <PERMISSION> [true|false] :使指定权限生效或者失效。
create-user <USER_NAME> :增加一个新的USER。remove-user <USER_ID> :删除一个USER。