一、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 [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 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 [options] <PATH>

安装应用

PMS.installPackageAsUser

uninstall [options]<package>

卸载应用

IPackageInstaller.uninstall

enable <包名或组件名>

enable

PMS.setEnabledSetting

disable <包名或组件名>

disable

PMS.setEnabledSetting

hide <package>

隐藏应用

PMS.setApplicationHiddenSettingAsUser

unhide <package>

显示应用

PMS.setApplicationHiddenSettingAsUser

get-install-location

获取安装位置

PMS.getInstallLocation

set-install-location

设置安装位置

PMS.setInstallLocation

path <package>

查看App路径

PMS.getPackageInfo

clear <package>

清空App数据

AMS.clearApplicationUserData

get-max-users

最大用户数

UserManager.getMaxSupportedUsers

force-dex-opt <package>

dex优化

PMS.forceDexOpt

dump <package>

dump信息

AM.dumpPackageStateStatic

trim-caches <目标size>

紧缩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。