当前位置: 首页 > news >正文

android系统启动流程之SystemServer运行过程

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意味着它有handlerLooper.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类的实例,在其构造函数中会实例化一个ATMSstartService(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+种系统服务均是走类似的业务逻辑流程,可以按相同的方法进行分析,以下图这张图做最后一个总结。至此,安卓系统的整体分析流程结束。

相关文章:

android系统启动流程之SystemServer运行过程

SystemServer进程的启动流程&#xff1a;直接看代码&#xff1a; SystemServer是Java中的一个进程&#xff0c;执行入口是SystemServer.java.main(); SystemServer.java.main();-->new SystemServer().run();-->createSystemContext();//创建系统上下文:虽然SystemServe…...

Leetcode 1812。判断国际象棋棋盘中一个格子的颜色

国际棋盘问题&#xff1a; 给你一个坐标 coordinates &#xff0c;它是一个字符串&#xff0c;表示国际象棋棋盘中一个格子的坐标。下图是国际象棋棋盘示意图。 如果所给格子的颜色是白色&#xff0c;请你返回 true&#xff0c;如果是黑色&#xff0c;请返回 false 。 给定坐标…...

9个python自动化脚本,PPT批量生成缩略图、添加图片、重命名

引言 最近一番在整理资料&#xff0c;之前买的PPT资源很大很多&#xff0c;但归类并不好&#xff0c;于是一番准备把这些PPT资源重新整理一下。统计了下&#xff0c;这些PPT资源大概有2000多个&#xff0c;一共30多G&#xff0c;一个一个手动整理这个投入产出比也太低了。 作为…...

计算机竞赛 基于大数据的社交平台数据爬虫舆情分析可视化系统

文章目录 0 前言1 课题背景2 实现效果**实现功能****可视化统计****web模块界面展示**3 LDA模型 4 情感分析方法**预处理**特征提取特征选择分类器选择实验 5 部分核心代码6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于大数据…...

基于Java的旅游信息推荐系统设计与实现,springboot+vue,MySQL数据库,前后端分离,完美运行,有三万字论文。

基于Java的旅游信息推荐系统设计与实现&#xff0c;springbootvue&#xff0c;MySQL数据库&#xff0c;前后端分离&#xff0c;完美运行&#xff0c;有三万字论文。 前台主要功能&#xff1a;登录注册、旅游新闻、景区信息、美食信息、旅游线路、现在留言、收藏、预定旅游线路…...

合宙Air724UG LuatOS-Air LVGL API控件--曲线 (Arc)

曲线 (Arc) 曲线控件&#xff0c;也可以称为弧。因为 Arc 本身就是弧&#xff0c;弧形的意思。根据控件的样子也能推测出它的使用场景&#xff0c;一般用在加载器(就是等待界面转的圈圈)或者数值显示&#xff0c;数值调节这些场景。曲线控件分了两个部分&#xff0c;前景和背…...

09-微信小程序 网络请求API(实现轮播广告和简易的聊天窗口)

09-微信小程序API网络请求(实现轮播广告和简易的聊天窗口) 文章目录 微信小程序API服务器域名配置注意网络相关APIrequestRequestTask 请求任务对象object.success 回调函数object.fail 回调函数案例代码&#xff08;实现轮播图&#xff09; WebSocket案例代码&#xff08;实现…...

Visual Studio 2017安装和项目配置

目录 前言1. What、Why and How1.1 What1.2 Why1.3 How 2. 安装3. 创建新项目4. 配置OpenCV库4.1 下载opencv安装包4.2 配置系统环境变量4.3 VS项目环境配置4.4 总结 5. 已有项目添加6. Tips6.1 常用快捷键6.2 字体和颜色选择6.3 配置编译路径 结语下载链接参考 前言 最近因为项…...

【提升接口响应能力的最佳实践】常规操作篇

文章目录 1. 并行处理简要说明CompletableFuture是银弹吗&#xff1f;测试案例测试结论半异步&#xff0c;半同步总结 2. 最小化事务范围简要说明编程式事务模板 3. 缓存简要说明 4. 合理使用线程池简要说明使用场景线程池的创建参数的配置建议 线程池的监控线程池的资源隔离 5…...

Vue使用ffmpeg,报ReferenceError: SharedArrayBuffer is not defined 如何解决

“SharedArrayBuffer is not defined” 错误是因为在浏览器环境中&#xff0c;SharedArrayBuffer 对象被认为是一种潜在的安全风险。为了防止 Spectre 攻击等漏洞&#xff0c;现代浏览器通常会禁用或限制对 SharedArrayBuffer 的使用。 SharedArrayBuffer 是一种 JavaScript 对…...

【OpenCV实战】1.OpenCV环境搭建,Mac M1系统,C++开发环境

OpenCV环境搭建&#xff0c;Mac系统&#xff0c;C开发环境 一、步骤VSCode C环境安装运行CMake安装运行OpenCV 安装CMakeList 一、步骤 VSCode C环境安装CMake 安装OpenCV 安装CmakeList.txt VSCode C环境安装运行 访问官网 CMake安装运行 CMake官网 参考文档 OpenCV 安…...

Hyperf 如何做到用两个端口 9501/9502 都能连接 Websocket 服务以及多 Worker 协作实现聊天室功能

为何 Hyperf 能够在两个端口上监听 WebSocket 连接&#xff1f; 源码角度来看&#xff0c;在配置了多个 Servers 时&#xff0c;实际上&#xff0c;只启动了一个 Server 注&#xff1a;我之前接触的代码都是启动一个服务绑定一个端口&#xff0c;之前也看过 swoole 扩展的文档…...

网络映射会遇到哪些困难

网络映射通过将复杂的网络划分为更小、可管理的块&#xff0c;帮助 IT 管理员获得对其网络的更大控制和可见性&#xff0c;它有助于可视化不同的网络组件&#xff08;如服务器、交换机端口和路由器&#xff09;如何互连以执行其功能&#xff0c;通过表示网络设备的通信方式&…...

【jvm】类的主动使用和被动使用

目录 一、主动使用二、被动使用 一、主动使用 1.创建类的实例 2.访问某个类或接口的静态变量&#xff0c;或者对该静态变量赋值 3.调用类的静态方法 4.反射&#xff08;例如Class.forName(“com.learning.Test”)&#xff09; 5.初始化一个类的子类 6.java虚拟机启动时被标明为…...

如何选择合适的损失函数

目录 如何选择合适的损失函数 1、均方误差&#xff0c;二次损失&#xff0c;L2损失&#xff08;Mean Square Error, Quadratic Loss, L2 Loss&#xff09; 2、平均绝对误差&#xff0c;L1损失&#xff08;Mean Absolute Error, L1 Loss&#xff09; 3、MSE vs MAE &#xff…...

Java常见的排序算法

排序分为内部排序和外部排序&#xff08;外部存储&#xff09; 常见的七大排序&#xff0c;这些都是内部排序 。 1、插入排序&#xff1a;直接插入排序 1、插入排序&#xff1a;每次将一个待排序的记录&#xff0c;按其关键字的大小插入到前面已排序好的记录序列 中的适当位置…...

【C++】5、构建:CMake

文章目录 一、概述二、实战2.1 内部构建、外部构建2.2 CLion Cmake 一、概述 CMake 是跨平台构建工具&#xff0c;其通过 CMakeLists.txt 描述&#xff0c;并生成 native 编译配置文件&#xff1a; 在 Linux/Unix 平台&#xff0c;生成 makefile在苹果平台&#xff0c;可以生…...

【ARP欺骗】嗅探流量、限速、断网操作

【ARP欺骗】 什么是ARP什么是ARP欺骗ARP欺骗实现ARP断网限制网速嗅探流量 什么是ARP ARP&#xff08;Address Resolution Protocol&#xff0c;地址解析协议&#xff09;是一个TCP/IP协议&#xff0c;用于根据IP地址获取物理地址。在计算机网络中&#xff0c;当一个主机需要发…...

初步认识OSPF的大致内容(第三课)

1 路由的分类 直连路由(Directly Connected Route)是指网络拓扑结构中相邻两个网络设备直接相连的路由,也称为直接路由。如果两个设备属于同一IP网络地址,那么它们就是直连设备。直连路由表是指由计算机系统生成的一种用于路由选择的表格,其中记录着直连路由的信息。直连…...

CSDN编程题-每日一练(2023-08-27)

CSDN编程题-每日一练&#xff08;2023-08-27&#xff09; 一、题目名称&#xff1a;异或和二、题目名称&#xff1a;生命进化书三、题目名称&#xff1a;熊孩子拜访 一、题目名称&#xff1a;异或和 时间限制&#xff1a;1000ms内存限制&#xff1a;256M 题目描述&#xff1a; …...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...