AMS作为Android FrameWork中最核心的一个部分,是应用层开发者进阶的里程碑,本文是AMS专栏的第一篇文章,介绍AMS的启动相关:
在学习AMS之前,需要掌握一些基础知识:
在学习完上面的内容后,我们可以知道AMS的启动是由SystemServer进程发起的:
SystemServer.main()
AMS的入口方法SystemServer的main()做了两件事:
- 调用
CreateSystemContext()
创建SystemContext - 开启三类服务:引导服务,核心服务,其他服务
SystemServer.createSystemContext():
private void createSystemContext() {
ActivityThread activityThread = ActivityThread.systemMain();
}
ActivityThread.systemMain():
public static ActivityThread systemMain() {
ActivityThread thread = new ActivityThread();
thread.attach(true, 0);
return thread;
}
在SystemMain中,首先创建了一个SystemServer进程的ActivityThread,没错,这就是用户进程的入口main的那个ActivityThread,所以从某种意义上讲,我们也可以将SystemServer进程看成一个App;
调用了ActivityThread的attach(),注意,这里传入的是true
,而我们正常的App传入的是false,这个字段表示是否是系统进程(SystemServer进程):
ActivityThread.attach():
private void attach(boolean system, long startSeq) {
...
if (!system) {
// 如果是正常App进程,传入false
...
final IActivityManager mgr = ActivityManager.getService();
try {
mgr.attachApplication(mAppThread, startSeq);
}
...
} else {
// 如果是SystemServer进程,传入true
...
try {
mInstrumentation = new Instrumentation();
mInstrumentation.basicInit(this);
ContextImpl context = ContextImpl.createAppContext(
this, getSystemContext().mPackageInfo);
mInitialApplication = context.mPackageInfo.makeApplication(true, null);
mInitialApplication.onCreate();
}
}
}
如果是正常的APP,那么进入if逻辑,调用AMS的代理发起一次Binder消息,实际调用AMS的attachApplication();
在本次情况中是由SystemServer进程发起的,进入else逻辑:
- 调用ContextImpl.createAppContext()创建App Context
- 注意上一个方法,传入了一个
getSystemContext().mPackageInfo
参数 - 调用makeApplication创建Application
我们先来看传入的参数:
ActivityThread.getSystemContext()
public ContextImpl getSystemContext() {
synchronized (this) {
mSystemContext = ContextImpl.createSystemContext(this);
}
getSystemContext()调用了ContextImpl的createSystemContext():