本文主要是介绍SystemServer分析之启动服务,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1 涉及的代码
- frameworks\base\services\java\com\android\server\SystemServer.java
- frameworks\base\core\java\android\app\ActivityThread.java
- rameworks\base\core\java\android\app\ContextImpl.java
- frameworks\base\services\core\java\com\android\server\SystemServiceManager.java
- frameworks\base\core\java\com\android\server\LocalServices.java
SystemServer中ActivityManagerService调用图
代码分析
SystemServer的main
初始化环境
//此时会去执行run方法new SystemServer().run();
run方法将会对整个系统的Service做初始化,在搭建完运行时环境和上下完后
依次创建消息队列 、加载native lib 库,并进行native的初始化
Looper.prepareMainLooper();
System.loadLibrary("android_servers");
nativeInit();
初始化系统上下文
初始化上下文围绕着activityThread来进行
createSystemContext();
下边来看一下这个初始化上下文的过程
ActivityThread activityThread = ActivityThread.systemMain();
mSystemContext = activityThread.getSystemContext();
SystemContext.setTheme(android.R.style.Theme_DeviceDefault_Light_DarkActionBar);
首先会调用 ActivityThread的静态方法systemMain,得到一个ActivityThread对象,systemMain是获取资源的instance。
需要注意的是ActivityThread中虽然含有Thread,然而其却不是线程。
创建系统服务管理者
// Create the system service manager.mSystemServiceManager = new SystemServiceManager(mSystemContext);
LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
首先会实例化一个SystemServiceManager对象,并将这个实例化的对象添加到LocalService中。
public SystemServiceManager(Context context) {mContext = context;
}
实例化SystemServiceManager的过程就是系统的上下文对象传入到SystemServiceManager这个类里边。 后续再启动service的实话,会使用这个mContext创建出service。
service = constructor.newInstance(mContext);
本地服务的添加
本地服务实际上是使用ArrayMap,通过键值对的实行来存放的。
LocalService.java中定义了
private static final ArrayMap<Class<?>, Object> sLocalServiceObjects = new ArrayMap<Class<?>, Object>();
来存放服务。 sLoaclServiceObject是一个ArrayMap类型的static属性。
public static <T> void addService(Class<T> type, T service) {synchronized (sLocalServiceObjects) {if (sLocalServiceObjects.containsKey(type)) {throw new IllegalStateException("Overriding service registration");}sLocalServiceObjects.put(type, service);}}
添加过程就是将Class类型的type和 service添加到其中
public static <T> T getService(Class<T> type) {synchronized (sLocalServiceObjects) {return (T) sLocalServiceObjects.get(type);}}
获取的过程,能通过Class名,来获得相应的service。
在需要使用SystemServiceManager的service的时候,就可以通过LocalService.getService(SystemServiceManager.class)来得到这个service
此时的mSystemServiceManager仅仅是创建是创建出来,并没有运行。
startBootstrapServices
在这个方法中,主要是调用mSystemServiceManager的startService方法启动一些服务
startService方法有两个,分别是
public SystemService startService(String className)public <T extends SystemService> T startService(Class<T> serviceClass)
第一种方法是通过string类型的字符串来查找。第二种方法是通过Class类查找。
实际上第一种方法,依然是调用第二种方法。
public SystemService startService(String className)final Class<SystemService> serviceClass;serviceClass = (Class<SystemService>)Class.forName(className)return startService(serviceClass)
这里运用反射 Class.forName创建一个对象
public <T extends SystemService> T startService(Class<T> serviceClass) {final String name = serviceClass.getName();Constructor<T> constructor = serviceClass.getConstructor(Context.class);//实例化对象serviceservice = constructor.newInstance(mContext);//将这个service添加到 new ArrayList<SystemService>中mServices.add(service);//启动这个serviceservice.onStart();return service;
mSystemServiceManager通过startService利用反射,启动了Installer、ActivityManagerService、PowerManagerService、DisplayManagerService服务
这篇关于SystemServer分析之启动服务的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!