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

Android 系统大致启动流程

Android启动流程大体为:BootRom -> BootLoader -> Kernel -> Init -> Zygote -> SystemServer ->Launcher

1、Loader层

 1.1、Boot ROM

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

1.2、Boot Loader

这是Android系统系统之前的引导程序,主要用来检测外部的RAM以及设置网络、内存、初始化硬件参数等。

2、Kernel层


Kernel层是指Android内核层,到这里才刚刚开始进入Android系统。

2.1、启动swapper进程(pid=0),该进程又称为idle进程,,系统初始化过程Kernel由无到有开创的第一个进程,,用于初始化进程管理、内存管理,加载Display、Camera Driver、Binder Driver等相关工作(图中kernel层蓝色区块)。

2.2、启动kthreadd进程(pid=2),是Linux系统的内核进程,会创建内核工作线程kworkder,软中断线程ksoftirqd,thermal等一系列内核守护进程。kthreadd进程是所有内核进程的父进程。


Linux内核加载主要包括初始化kernel核心(内存初始化,打开中断,初始化进程表等)、初始化驱动、启动内核后台(daemons)线程、安装根(root)文件系统等。后续启动第一个用户级进程init(pid=1)。

3、Native层


Native层主要包括启动init进程(Android的第一个用户空间进程)、HAL层(硬件抽象层)以及开机动画等。init进程是所有用户进程的鼻祖。同时init进程也会孵化一系列用户进程,还会启动关键的服务以及孵化Zygote进程。

3.1、init进程会孵化出ueventd、logd、healthd、installd、adbd、lmkd等用户守护进程。
3.2、init进程还启动servicemanager(binder服务管家)、bootanim(开机动画)等重要服务。
3.3、init进程孵化出Zygote进程,Zygote进程是Android系统的第一个Java进程,Zygote是所有Java进程的父进程,Zygote进程本身是由init进程孵化而来的。


4、Framework层


Framework层分为Java frameword和C++ framework,分别由system_server进程和media_server进程负责启动和管理。

zygote本身是一个native的应用程序,刚开始的名字为“app_process”,运行过程中,通过系统调用将自己名字改为zygote。在上图中的红色线,便是zygote fork出来的进程,所有的app进程都是由zygote fork产生的。

下面列举Zygote进程孵化的部分子进程:

进程名    解释
system_server    Java framework的各种service都依赖此进程
com.android.phone    电话应用进程
android.process.acore    通讯录进程
android.process.media    多媒体应用进程
com.android.settings    设置进程
com.android.wifi    wifi应用进程


4.1、zygote进程

由init进程通过解析init.rc文件后fork生成的,Zygote进程主要包含:

加载ZygoteInit类,注册Zygote Socket服务端套接字
加载虚拟机
preloadClasses
preloadResouces


4.2、system_server进程

由zygote进程fork而来,system_server是zygote孵化的第一个进程,system_server负责启动和管理整个java framework,包含ActivityManager、PowerManager等服务。

4.3、media_server进程

由init进程fork而来,负责启动和管理整个C++ framework,包含SurfaceFlinger、AudioFlinger、Camera Service等服务。

5、app层


zygote进程孵化出的第一个app进程是Launcher,这是用户看到的桌面app。
zygote进程还会创建Browser,Phone,Email等app进程,每个app至少运行在一个进程上。
所有的app进程都是由zygote进程fork生成的。
具体的启动过程,此文不便详述,都是代码分析,复杂且枯燥。

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

相关文章:

  • 【Web】2024红明谷CTF初赛个人wp(2/4)
  • stable-diffusion-webui安装教程
  • 如何魔改 diffusers 中的 pipelines
  • 解放办公室的利器!让证卡打印机轻松应对繁忙工作场景
  • 2012年认证杯SPSSPRO杯数学建模A题(第二阶段)蜘蛛网全过程文档及程序
  • ES学习日记(七)-------Kibana安装和简易使用
  • react 父子组件的渲染机制 | 优化手段
  • elementPlus el-table动态列扩展及二维表格
  • vitepress系列-04-规整sideBar左侧菜单导航
  • golang slice总结
  • MySQL 数据库的优化
  • Redis 的主从复制、哨兵和cluster集群
  • Unity进阶之路(2)UI Toolkit
  • 实现Hello Qt 程序
  • 若依 ruoyi-vue 接口挂载获取Resources静态资源文件权限校验
  • 【STM32嵌入式系统设计与开发】——16InputCapture(输入捕获应用)
  • 「论文阅读」还在手写Prompt,自动Prompt搜索超越人类水平
  • 安全测试概述和用例设计
  • JavaScript 超详细学习思路
  • LeetCode:1483. 树节点的第 K 个祖先(倍增 Java)
  • ConstraintLayout在复杂布局中,出现卡顿问题解决记录
  • 责任链模式详解+代码案例
  • 如何让Webots支持C#语言开发的控制器
  • 如何将本地仓库放到远程仓库中
  • Jedis-事务
  • 智慧安防监控EasyCVR视频调阅和设备录像回看无法自动播放的原因排查与解决
  • 百元不入耳蓝牙耳机哪个好?必入五款高性价比产品
  • android APP monkey 测试
  • IMBoy缓存系统深度解析:为何选择depcache而非ETS或Redis
  • Twitter Api查询用户粉丝列表