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相应的方法来完成的。