SystemServer进程的启动流程:直接看代码:
SystemServer是Java中的一个进程,执行入口是SystemServer.java.main();
SystemServer.java.main();
-->new SystemServer().run();
-->createSystemContext();//创建系统上下文:虽然SystemServer没有界面,他也有这些操作
-->ActivityThread acivityThread = ActivityThread.systemMain();
-->ActivityThread thread = new ActivityThread();
thread.attach(true, 0);
-->mInstrumentation = new Instrumentation();
ContextImpl context = ContextImpl.createAppContext();
//makeApplication会加载各种资源: apk(用assetManager加载Res,在下面这个地方做)
mInitialApplication = context.mPackageInfo.makeApplication(true, null);
-->context.setResources(packageInfo.getResources());
mInitialApplication.onCreate();
return thread;
mSystemContext = activityThread.getSystemContext();
mSystemContext.setTheme(DEFAULT_SYSTEM_THEME);
//ui的系统上下文也创建 好了
context systemUiContext = activityThread.getSystemUiContext();
//构建system manager service: 利用它去管理各种System Service, 后面才能去启动各种Services.
-->mSystemServiceManager = new SystemServiceManager(mSystemContext);
-->run函数是重点,非常重要的点在于三个函数,以下三个函数的启动包含了90多个服务:
startBootstrapServices(t);
startCoreServices(t);
startOtherServices(t);
//死循环,有loop意味着它有handler
Looper.loop();
上面代码注释中说道,SystemServiceManager这个对象是SystemServer进程中重要的数据结构,用于管理系统各种SystemService,
那么它具体是怎么做到的?在具体分析之前,先理清楚 以下几个概念:
- 什么是SystemService:
系统各类服务需要封装的类,每一种系统服务都要直接或间接的继续这个SystemService类,成为一个SystemService的类对象,方便让SystemServiceManager统一管理。
- 什么是SystemServiceManager:
是SystemServer中的一个非常重要的类,得力助手,SystemServer通过它管理各种Services,如AMS, WMS, PKMS等,并且这些服务必须封装成一个对象,这个类就是SystemService,也就是说SysermServiceManager管理的都是SystemService的类对象。这种模式有点类似Activity:通过FragmentManager去管理许多的Fragment类对象。
- 什么是SystemServer:
它是进程,是系统服务端,管理 各种Services.
- 什么是ServiceManager:
它也是一个进程,早上Zygote进程启动,它是由init进程通过解析init.rc后创建。
上面的这几个问题可以用下图来概括:
搞懂了以上的知识点之后,以ATMS为例分析,SystemSericeManager是如何管理这个ATMS的,ATMS是在以下接口中被启动的。
startBootstrapServices(t);
//启动ATMS
-->ActivityTaskManagerService atm = mSystemServiceManager.startService(ActivityTaskManagerService.LifeCycle.class).getService());
-->ActivityTaskManagerService(Class<T> serviceClass): //拿到类可以通过类去反射,得到Methods.
-->final T service;
service = construct.newIntance(mContext); //创建一个实例:即LifeCycle类的实例,在其构造函数中会实例化一个ATMS
startService(service); //启动服务
-->class<SystemService> serviceClass = loadClassFromLoader(classname, this.getClass().getClassLoader());
return startService(serviceClass);
-->mServices.add(service); //mServices就是ArrayList<SystemService>数组,将ATMS这个SystemService对象添加到数组中。
service.onStart(); //本质就是调用了LifeCycle内部的ATMS服务实例的start()接口,下面有分析。
可以看看ActivityTaskManagerService它的父类是什么:
class ActivityTaskManagerService extends IActivityTaskManager.Stub{};
疑问一,根据前面的分析,说系统各种服务都是继承SystemService类,为什以它这里不是继承至SystemService类呢?因为JAVA只能有一个父类,ATMS是一个服务,根据Binder的使用,各种ATMS需要继承一个Binder类(Stub类),但是为了让ATMS能满足上面的规则(需要继承至SystemService类),此时ActivityTaskManagerService内部定义了一个静态static的内部类LifeCycle,它继承至SystemService. 然后让ActivityTaskManagerService类对象成为LifeCycle的类成员, 这就解决是java语言中,如何让一个类可以继承两个父类的问题,后面对服务ATMS的操作转为LifeCycle中的操作。如下图代码所示:
class ActivityTaskManagerService extends IActivityTaskManager.Stub{
public static final class LifeCycle extends SystemService{
private final ActivityTaskManagerService mService;
public LifeCycle(){ //实 例化。
mService = new ActivityTaskManagerService();
}
public void onStart(){ //对LifeCycle的所有操作都是对mService(即ATMS的操作)
mService.start();
}
}
}
以上是以ATMS为例进行分析说明,系统的90+种系统服务均是走类似的业务逻辑流程,可以按相同的方法进行分析,以下图这张图做最后一个总结。至此,安卓系统的整体分析流程结束。