栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

安卓启动流程概述(一)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

安卓启动流程概述(一)

Android的启动流程为:Boot Rom -> Boot Loader -> Linux Kernel -> Init -> Zygote -> SystemServer -> Launcher

BootLoader层

1)Boot Rom是嵌入处理器芯片内的一小块掩模ROM或写保护闪存。它包含处理器在上电或复位时执行的第一个代码。根据某些带式引脚或内部保险丝的配置,它可以决定从哪里加载要执行的代码的下一部分以及如何或是否验证其正确性或有效性。

2)Boot Loader(加载引导程序)负责查找和加载应该在芯片上运行的最终操作系统或固件。与Boot Rom的一个主要区别是它通常在可写闪存中,可以更换或升级。

(注:ROM和RAM都是一种存储技术,只是两者原理不同,RAM为随机存储,掉电不会保存数据,而ROM可以在掉电的情况下,依然保存原有的数据。 … 本来的含义是:ROM是Read only Memory的意思,也就是说这种存储器只能读,不能写。 而RAM是Random Access Memory的缩写。)

Kernel层

Android平台的基础是Linux内核,比如ART虚拟机最终调用底层Linux内核来执行功能。Linux内核的安全机制为Android提供相应的保障,也允许设备制造商为内核开发硬件驱动程序。

硬件抽象层(Hardware Abstract Layer,HAL)

Android的硬件驱动与Linux不同,传统的Liunx内核驱动完全存在于内核空间中。但是Android在内核外部增加了一个硬件抽象层,把一部分硬件驱动放到了HAL层。

为什么Android要这么做呢?

Linux内核采用了GPL协议,如果硬件厂商需要支持Linux系统,就需要遵照GPL协议公开硬件驱动的源代码,这势必会影响到硬件厂家的核心利益。而Android的HAL层运行在用户空间,HAL是一个“空壳”,Android会根据不同的需要,加载不同的动态库。这些动态库由硬件厂家提供。硬件厂家把相关硬件功能写入动态库,内核中只开放一些基本的读写接口操作。这样一些硬件厂家的驱动功能就由内核空间移动到了用户空间。且Android的HAL层遵循Apache协议,并不要求它的配套程序,因此厂家提供的驱动库不需要进行开放,保护了硬件厂家的核心利益。

Native层

主要是包括init进程以及其fork出来的用户空间的守护进程、HAL层、开机动画等。
1)系统Native库
Android包含一些C/C++库,这些库能被Android系统中不同的组件使用。其中,bionic和system模块属于该层。
2)Android运行时环境(Android Runtime,ART)
Android包括了一个核心库,该核心库提供了Java编程语言核心库的大多数功能。虚拟机也在该层启动。每个Android应用都有一个专有的进程,这些进程每个都有一个Dalivik虚拟机实例,并在该实例中运行。

JAVA framework层

主要是AMS和PMS等Service的初始化。另外提供构建应用程序时可能用到的各种API,Android自带的一些核心应用就是使用这些API完成的,开发者也可以通过使用API来构建自己的应用程序。
API:Application Programming Interface(应用程序接口)

Application层

主要指SystemUI、Launcher等的启动。该层中包含所有的Android应用程序,包括电话、相机、日历等,自己开发的Android应用程序也被安装在这层;大部分的应用使用JAVA开发。

具体流程
  1. 手机开机后,引导芯片启动,引导芯片开始从固化在ROM里的预设代码执行,加载引导程序到RAM,bootloader检查RAM,初始化硬件参数等功能;
  2. 硬件等参数初始化完成后,进入到Kernel层,Kernel层主要加载一些硬件设备驱动,初始化进程管理等操作。在Kernel中首先启动swapper进程(pid=0),用于初始化进程管理、内存管理、加载Driver等操作,再启动kthread进程(pid=2),这些linux系统的内核进程,kthread是所有内核进程的鼻祖;
  3. Kernel层加载完毕后,硬件设备驱动与HAL层进行交互。初始化进程管理等操作会启动INIT进程 ,这些在Native层中;
  4. init进程(pid=1,init进程是所有进程的鼻祖,第一个启动)启动后,会启动adbd,logd等用户守护进程,并且会启动servicemanager (binder服务管家)等重要服务,同时孵化出zygote进程,这里属于C++ framework,代码为C++程序;
  5. zygote进程是由init进程解析init.rc文件后fork生成,它会加载虚拟机,启动System Server(zygote孵化的第一个进程);System Server负责启动和管理整个Java framework,包含ActivityManager,WindowManager,PackageManager,PowerManager等服务;
  6. zygote同时会启动相关的APP进程,它启动的第一个APP进程为Launcher(桌面),然后启动Email,SMS等进程,所有的APP进程都有zygote fork生成。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/356119.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号