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

相关文章

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

TP-Link PDDNS服将于务6月30日正式停运:用户需转向第三方DDNS服务

《TP-LinkPDDNS服将于务6月30日正式停运:用户需转向第三方DDNS服务》近期,路由器制造巨头普联(TP-Link)在用户群体中引发了一系列重要变动,上个月,公司发出了一则通知,明确要求所... 路由器厂商普联(TP-Link)上个月发布公告要求所有用户必须完成实名认证后才能继续使用普联提供的 D

Android里面的Service种类以及启动方式

《Android里面的Service种类以及启动方式》Android中的Service分为前台服务和后台服务,前台服务需要亮身份牌并显示通知,后台服务则有启动方式选择,包括startService和b... 目录一句话总结:一、Service 的两种类型:1. 前台服务(必须亮身份牌)2. 后台服务(偷偷干

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

Windows设置nginx启动端口的方法

《Windows设置nginx启动端口的方法》在服务器配置与开发过程中,nginx作为一款高效的HTTP和反向代理服务器,被广泛应用,而在Windows系统中,合理设置nginx的启动端口,是确保其正... 目录一、为什么要设置 nginx 启动端口二、设置步骤三、常见问题及解决一、为什么要设置 nginx

springboot启动流程过程

《springboot启动流程过程》SpringBoot简化了Spring框架的使用,通过创建`SpringApplication`对象,判断应用类型并设置初始化器和监听器,在`run`方法中,读取配... 目录springboot启动流程springboot程序启动入口1.创建SpringApplicat

树莓派启动python的实现方法

《树莓派启动python的实现方法》本文主要介绍了树莓派启动python的实现方法,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录一、RASPBerry系统设置二、使用sandroidsh连接上开发板Raspberry Pi三、运

C#使用DeepSeek API实现自然语言处理,文本分类和情感分析

《C#使用DeepSeekAPI实现自然语言处理,文本分类和情感分析》在C#中使用DeepSeekAPI可以实现多种功能,例如自然语言处理、文本分类、情感分析等,本文主要为大家介绍了具体实现步骤,... 目录准备工作文本生成文本分类问答系统代码生成翻译功能文本摘要文本校对图像描述生成总结在C#中使用Deep

微服务架构之使用RabbitMQ进行异步处理方式

《微服务架构之使用RabbitMQ进行异步处理方式》本文介绍了RabbitMQ的基本概念、异步调用处理逻辑、RabbitMQ的基本使用方法以及在SpringBoot项目中使用RabbitMQ解决高并发... 目录一.什么是RabbitMQ?二.异步调用处理逻辑:三.RabbitMQ的基本使用1.安装2.架构