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

Android 系统启动过程

        当按下电源时,引导芯片代码会从预定义的地方(固化在ROM) 开始执行,加载引导程序BootLoader到RAM,然后执行。

        启动内核的第一个进程idle(pid=0),idle进程是Linux系统第一个进程,是init进程和kthreadd进程的父进程。

idle的主要作用

  1. 初始化进程以及内存管理,加载硬件的驱动程序
  2. 创建init进程,该进程的pid=1,init进程是第一个用户空间的进程
  3. 创建kthreadd进程,该进程pid=2,并且该进程仍属于内核空间
  4. idle进程自己也运行在内核空间

关系如下图所示:

        


 kthreadd进程是Linux系统内核管家,所有的内核线程都是直接或间接以它为父进程 

 对于kthreadd进程,我们其实并不需要知道太多,毕竟我们正常开发用不到关注内核相关的代码。我们只需要知道几点,

  1. kthread的进程pid=2
  2. 内核相关的资源都是由这个进程创建而来的。
  3. 该进程以及由它产生的子进程都运行在内核空间

 init进程是Linux系统第一个用户进程,是Android系统应用程序(用户空间)的始祖,我们的app都是直接或间接以它为父进程。

 init主要作用

  1. 该进程最主要的作用就是fork出了Zygote进程
  2. 同时会创建ServiceManager进程。即我们俗称的服务大管家。

最重要的进程:Zygote

Zygote英文翻译为受精卵,我们平时启动的所有进程等都是由这个进程复制而来。所谓复制就是,这个进程会复制出两份一模一样的进程,其中一个继续当Zygote进程,另一个进程执行完相关代码就变成了,你想启动的进程。但是在fork出别的进程之前,他要先进行一些初始化,这样fork出来的进程就和他一样自带这些初始化好的功能,而不是在初始化一遍。

Zygote的主要作用

  1. 创建虚拟机
  2. 注册JNI
  3. 启动ZygoteServer(实际就是Socket,用来跨进程通信)
  4. preload 预加载资源,之后复制出的进程就都已经是加载过资源的进程了
  5. 启动SystemServer
  6. 循环等待,一旦AMS通知创建进程,就会进行进程分裂

这里多说一嘴,Zygote进程本身创建了JVM虚拟机,注册了JNI,也就是说我们的代码从这里开始,才真正的开始可以执行Java代码,之前运行的都是C++代码
另外,由于在fork进程之前进行了创建虚拟机注册JNI,以及预加载等工作。所以我们fork出的进程从出生开始,就自带了虚拟机,并且已经注册好了JNI代码,相应的资源也已经加载完毕了

SystemServer

几乎所有服务都是由SystemServer创建的。其中包括AMS,WMS,PMS等重要服务,都是运行在该进程上的,并且在该进程上注册到ServiceManager进程中。

Launcher

各位有没有想过,我们每天滑动手机时的界面到底是什么。其实它和我们开发的手机程序一样,都是一个App。只不过它是由Android系统自动启动的。并且,它可以把我们的所有安装的App全都显示出来,仅此而已。
当我们点击Launcher上的App图标时,它会和AMS进行通信,AMS又和Zygote进行通信。Zygote进程fork出了一个新进程,并执行相关代码,从而我们编写的App就这样被创建了出来。

http://www.lryc.cn/news/289200.html

相关文章:

  • 基于STM32的智能手环设计与实现
  • [BJDCTF2020]The mystery of ip
  • RUST笔记:candle使用基础
  • Python算法题集_接雨水
  • FIND_IN_SET的使用:mysql表数据多角色、多用户查询
  • JVM篇----第十一篇
  • 鸿蒙HarmonyOS获取GPS精确位置信息
  • java正则校验,手机号,邮箱,日期格式,时间格式,数字金额两位小数
  • php下curl发送cookie
  • stable diffusion学习笔记——文生图(一)
  • Linux下安装openresty
  • 【IM】如何保证消息可用性(一)
  • js直接下载附件和通过blob数据类型下载文件
  • 第2章-神经网络的数学基础——python深度学习
  • 【Docker】Docker学习⑧ - Docker仓库之分布式Harbor
  • 一行命令在 wsl-ubuntu 中使用 Docker 启动 Windows
  • Datawhale 组队学习之大模型理论基础 Task7 分布式训练
  • 05-使用结构体构建相关数据
  • 【Android】Android中的系统镜像由什么组成?
  • 仿真机器人-深度学习CV和激光雷达感知(项目2)day7【ROS关键组件】
  • 解锁一些SQL注入的姿势
  • Qt 拖拽事件示例
  • Linux:命名管道及其实现原理
  • 实习记录——第五天
  • Kotlin 教程(环境搭建)
  • 04.领域驱动设计:了解聚合和聚合根,怎样设计聚合-学习总结
  • cmake-find_package链接第三方库
  • obsidian阅读pdf和文献——与zotero连用
  • 走方格(动态规划)
  • 基于DataKit迁移MySQL到openGauss