SystemServer分析之启动服务

2024-09-05 22:18

本文主要是介绍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分析之启动服务的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1140217

相关文章

使用Node.js制作图片上传服务的详细教程

《使用Node.js制作图片上传服务的详细教程》在现代Web应用开发中,图片上传是一项常见且重要的功能,借助Node.js强大的生态系统,我们可以轻松搭建高效的图片上传服务,本文将深入探讨如何使用No... 目录准备工作搭建 Express 服务器配置 multer 进行图片上传处理图片上传请求完整代码示例

Spring LDAP目录服务的使用示例

《SpringLDAP目录服务的使用示例》本文主要介绍了SpringLDAP目录服务的使用示例... 目录引言一、Spring LDAP基础二、LdapTemplate详解三、LDAP对象映射四、基本LDAP操作4.1 查询操作4.2 添加操作4.3 修改操作4.4 删除操作五、认证与授权六、高级特性与最佳

Python 迭代器和生成器概念及场景分析

《Python迭代器和生成器概念及场景分析》yield是Python中实现惰性计算和协程的核心工具,结合send()、throw()、close()等方法,能够构建高效、灵活的数据流和控制流模型,这... 目录迭代器的介绍自定义迭代器省略的迭代器生产器的介绍yield的普通用法yield的高级用法yidle

Redis在windows环境下如何启动

《Redis在windows环境下如何启动》:本文主要介绍Redis在windows环境下如何启动的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Redis在Windows环境下启动1.在redis的安装目录下2.输入·redis-server.exe

解决SpringBoot启动报错:Failed to load property source from location 'classpath:/application.yml'

《解决SpringBoot启动报错:Failedtoloadpropertysourcefromlocationclasspath:/application.yml问题》这篇文章主要介绍... 目录在启动SpringBoot项目时报如下错误原因可能是1.yml中语法错误2.yml文件格式是GBK总结在启动S

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

kotlin中const 和val的区别及使用场景分析

《kotlin中const和val的区别及使用场景分析》在Kotlin中,const和val都是用来声明常量的,但它们的使用场景和功能有所不同,下面给大家介绍kotlin中const和val的区别,... 目录kotlin中const 和val的区别1. val:2. const:二 代码示例1 Java

Go标准库常见错误分析和解决办法

《Go标准库常见错误分析和解决办法》Go语言的标准库为开发者提供了丰富且高效的工具,涵盖了从网络编程到文件操作等各个方面,然而,标准库虽好,使用不当却可能适得其反,正所谓工欲善其事,必先利其器,本文将... 目录1. 使用了错误的time.Duration2. time.After导致的内存泄漏3. jsO

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3

SpringBoot启动报错的11个高频问题排查与解决终极指南

《SpringBoot启动报错的11个高频问题排查与解决终极指南》这篇文章主要为大家详细介绍了SpringBoot启动报错的11个高频问题的排查与解决,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一... 目录1. 依赖冲突:NoSuchMethodError 的终极解法2. Bean注入失败:No qu