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

相关文章

python panda库从基础到高级操作分析

《pythonpanda库从基础到高级操作分析》本文介绍了Pandas库的核心功能,包括处理结构化数据的Series和DataFrame数据结构,数据读取、清洗、分组聚合、合并、时间序列分析及大数据... 目录1. Pandas 概述2. 基本操作:数据读取与查看3. 索引操作:精准定位数据4. Group

Springboot项目启动失败提示找不到dao类的解决

《Springboot项目启动失败提示找不到dao类的解决》SpringBoot启动失败,因ProductServiceImpl未正确注入ProductDao,原因:Dao未注册为Bean,解决:在启... 目录错误描述原因解决方法总结***************************APPLICA编

MySQL中EXISTS与IN用法使用与对比分析

《MySQL中EXISTS与IN用法使用与对比分析》在MySQL中,EXISTS和IN都用于子查询中根据另一个查询的结果来过滤主查询的记录,本文将基于工作原理、效率和应用场景进行全面对比... 目录一、基本用法详解1. IN 运算符2. EXISTS 运算符二、EXISTS 与 IN 的选择策略三、性能对比

MySQL 内存使用率常用分析语句

《MySQL内存使用率常用分析语句》用户整理了MySQL内存占用过高的分析方法,涵盖操作系统层确认及数据库层bufferpool、内存模块差值、线程状态、performance_schema性能数据... 目录一、 OS层二、 DB层1. 全局情况2. 内存占js用详情最近连续遇到mysql内存占用过高导致

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

kkFileView启动报错:报错2003端口占用的问题及解决

《kkFileView启动报错:报错2003端口占用的问题及解决》kkFileView启动报错因office组件2003端口未关闭,解决:查杀占用端口的进程,终止Java进程,使用shutdown.s... 目录原因解决总结kkFileViewjavascript启动报错启动office组件失败,请检查of

Linux下在线安装启动VNC教程

《Linux下在线安装启动VNC教程》本文指导在CentOS7上在线安装VNC,包含安装、配置密码、启动/停止、清理重启步骤及注意事项,强调需安装VNC桌面以避免黑屏,并解决端口冲突和目录权限问题... 目录描述安装VNC安装 VNC 桌面可能遇到的问题总结描js述linux中的VNC就类似于Window

linux下shell脚本启动jar包实现过程

《linux下shell脚本启动jar包实现过程》确保APP_NAME和LOG_FILE位于目录内,首次启动前需手动创建log文件夹,否则报错,此为个人经验,供参考,欢迎支持脚本之家... 目录linux下shell脚本启动jar包样例1样例2总结linux下shell脚本启动jar包样例1#!/bin

Olingo分析和实践之EDM 辅助序列化器详解(最佳实践)

《Olingo分析和实践之EDM辅助序列化器详解(最佳实践)》EDM辅助序列化器是ApacheOlingoOData框架中无需完整EDM模型的智能序列化工具,通过运行时类型推断实现灵活数据转换,适用... 目录概念与定义什么是 EDM 辅助序列化器?核心概念设计目标核心特点1. EDM 信息可选2. 智能类

Olingo分析和实践之OData框架核心组件初始化(关键步骤)

《Olingo分析和实践之OData框架核心组件初始化(关键步骤)》ODataSpringBootService通过初始化OData实例和服务元数据,构建框架核心能力与数据模型结构,实现序列化、URI... 目录概述第一步:OData实例创建1.1 OData.newInstance() 详细分析1.1.1