1, AM命令

举例:

1拨打电话10086

adb shell am start -a android.intent.action.CALL -d tel:10086

2打开网站www.baidu.com

adb shell am start -aandroid.intent.action.VIEW -d  http://baidu.com

am命令还可以启动Activity,Service、Broadcast,杀进程,监控等功能,

这些功能都非常便捷调试程序,接下来讲述关于am更多更详细的功能。

 

命令格式:

am <command>

 

命令列表:

命令

功能

实现方法

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 -dhttp://baidu.com,

 启动Acitivty最终调用的是ActivityManagerService类的startActivityAsUser()方法来完成的。

再比如am kill-all命令,最终的实现工作是由ActivityManagerService的killBackgroundProcesses()方法完成的。

2, 详细参数

 

2.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()。

2.2 收紧内存

命令 am send-trim-memory  <pid> <level>

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

am send-trim-memory 11563RUNNING_LOW。

那么level取值范围为: HIDDEN、RUNNING_MODERATE、BACKGROUND、RUNNING_LOW、MODERATE、RUNNING_CRITICAL、COMPLETE。

2.3 其他

对于am的子命令,startservice, stopservice, broadcast, kill, profilestart, profile stop, dumpheap的可选参数

都允许设置--user<USER_ID>。目前市面上的绝大多数手机还是单用户模式,故可以忽略该参数,默认为当前用户。

例如:启动id=10010的用户的指定service。

am startservice --user10010

3, 详细流程

所有adb命令的am方法最后都会通过Am.java执行,然后大都会调用PMS的方法完成,至于android系统中的adb原理在此就不论述了。

   Am的main方法如下,

public static void main(String[] args) {
        (new Am()).run(args);
}

调用父类BaseCommand的run方法,

public void run(String[] args) {
        if (args.length < 1) {
            onShowUsage(System.out);
            return;
        }

        mArgs = args;
        mNextArg = 0;
        mCurArgData = null;

        try {
            onRun();
        } catch (IllegalArgumentException e) {
            onShowUsage(System.err);
            System.err.println();
            System.err.println("Error: " + e.getMessage());
        } catch (Exception e) {
            e.printStackTrace(System.err);
            System.exit(1);
        }
    }

子类Am的onRun方法,该方法如下,

public void onRun() throws Exception {

        mAm = ActivityManagerNative.getDefault(); // 获取AMS对象
        if (mAm == null) {
            System.err.println(NO_SYSTEM_ERROR_CODE);
            throw new AndroidException("Can't connect to activity manager; is the system running?");
        }

        String op = nextArgRequired();
   •••
else if (op.equals("kill")) {
            runKill();
        }
•••

以kill指令为例,调用runKill方法,

private void runKill() throws Exception {
        int userId = UserHandle.USER_ALL;

        String opt;
        while ((opt=nextOption()) != null) {
            if (opt.equals("--user")) {
                userId = parseUserArg(nextArgRequired());
            } else {
                System.err.println("Error: Unknown option: " + opt);
                return;
            }
        }
        mAm.killBackgroundProcesses(nextArgRequired(), userId);
    }

调用AMS的killBackgroundProcesses方法杀死进程。

 

大部分am指令最终几乎都是调用ActivityManagerService相应的方法来完成的。