作为Android开发者,你真的知道Android按下开机键到启动发生什么吗?

前语

在一个夜黑风高的晚上,我的男同事突然给我发了一条微信,我点开来看,他竟然问我Android从按下开机键到发动究竟发生了什么?此刻我的心里如下图:

可是作为一个Android开发者,了解整个体系架构是必须的,所以这篇就总结一下Android手机从按下开机键到发动这一进程发生了什么。

要了解Android手机发动进程,咱们先来了解一下根据linux体系的电脑从按下电源键的那一刻起,发生了什么,这样类比能够更好的了解Android手机的发动进程。

根据Linux的pc发动进程

咱们都知道,所有的程序软件包含操作体系都是运行在内存中的,但是咱们的操作体系一般是寄存在硬盘上的,当咱们按下开机键的时分,此刻内存中什么程序也没有,因而需要借助某种方式,将操作体系加载到内存中,而完结这项使命的便是 BIOS

装过体系的人一定知道BIOS这个东西,那么它究竟是什么呢?

BIOS:Basic Input/Output System(基本输入输出体系),在IBM PC兼容体系上,是一种业界标准的固件接口(来自维基百科)。有点难以了解,其实BIOS是咱们电脑发动时加载的榜首个程序,这个程序不是由Java言语编写也不是由C言语编写,一般是汇编程序。

BIOS程序固化在主板上的一块芯片上,是连接计算机硬件与操作体系的桥梁,它保存着计算机最重要的基本输入输出的程序、开机后自检程序和体系自发动程序。

那么问题来了,BIOS程序又是怎么发动的?BIOS的发动,是由硬件完结的,Intel 80×86系列的cpu的硬件都规划为加电(即开机瞬间)就进入16位实形式状况运行,此刻将cpu的硬件逻辑规划为强即将CS的值设置为0xFFFF,IP的值设置为0x0000,这样CS:IP就指向了0xFFFF0这个方位,而这个方位便是BIOS程序的进口地址。

因而这是一个硬件厂商之间的约定,所有的BIOS程序进口地址均为0xFFFF0,这样在开机的时分,就找到这个地址,假如该地址并没有代码段,那么计算机将会死机,假如这个地址处有代码段,将会履行这个代码段,并由此履行下去,即BIOS程序开端发动。

补充: CS: 代码段寄存器,存在于CPU中,指向CPU当前履行代码在内存中所在的区域。 IP: 指令寄存器,存在于CPU中,记录即将履行的指令在代码段内的偏移地址,与CS组合即为即将履行的指令的内存地址。

当BIOS程序发动时,就会检测硬件设备,比如咱们的显卡、内存等信息。BIOS会在内存中树立中止向量表和中止服务程序。中止向量表中有256个中止向量,每个中止向量占4个字节,每个中止向量指向一个中止服务程序,这些中止服务程序完结了将操作体系由硬盘加载到内存中的使命. 根据linux的操作体系而言,计算机将分三批逐次加载操作体系的代码,榜首批由BIOS中止int 0x19将 榜首扇区bootsect的内容加载到内存;第二批和第三批在bootsect的指挥下,别离加载后边扇区的内容到内存中。

通过履行一系列的BIOS代码后,计算机完结了自检等操作, 计算机硬件体系会与BIOS联合操作,让cpu接收到一个int 0x19中止,cpu接收到这个中止后,会立即在中止向量表中找到int 0x19中止向量,此刻会找到对应的中止服务程序,并由该中止服务程序将硬盘中榜首个扇区的引导程序加在到内存中的指定方位。

随后,在引导程序的效果下,陆续将操作体系的其他程序载入内存, 完结实形式到保护形式的转变,为履行操作体系的进口函数main做准备,后边便是操作体系的初始化工作了,最终完结计算机的发动。

Android手机的发动进程

Android体系尽管也是根据linux体系的,可是由于Android属于嵌入式设备,并没有像pc那样的BIOS程序。

取而代之的是Bootloader ——体系发动加载器。它类似于BIOS,在体系加载前,用以初始化硬件设备,树立内存空间的映像图,为最终调用体系内核准备好环境。

在Android里没有硬盘,而是ROM ,它类似于硬盘寄存操作体系,用户程序等。ROM跟硬盘相同也会划分为不同的区域,用于放置不同的程序,在Android中首要划分为一下几个分区:

  • /boot:寄存引导程序,包含内核和内存操作程序
  • /system:相当于电脑c盘,寄存Android体系及体系使用
  • /recovery:康复分区,能够进入该分区进行体系康复
  • /data:用户数据区,包含了用户的数据:联系人、短信、设置、用户装置的程序
  • /cache:安卓体系缓存区,保存体系最常拜访的数据和使用程序
  • /misc:包含一些杂项内容,如体系设置和体系功用启用禁用设置
  • /sdcard:用户自己的存储区,能够寄存照片,音乐,视频等文件

那么Bootloader是怎么被加载的呢?咱们能够想到,应该跟pc相同,当开机加电的时分,cpu会从cpu制造厂商预设的地址上取指令,这个地址是各厂商约定俗称的,类似于上面80×86架构里的0xFFFF0地址,因而Android手机会将固态存储设备ROM预先映射到该地址上,当开机加电的时分,cpu就会从该地址履行/boot分区下的Bootloader程序,载入linux内核到RAM中。

当linux内核发动后会初始化各种软硬件环境,加载驱动程序,挂载根文件体系,并开端履行根文件体系的init程序,init程序是Android发动进程中最重要的核心程序。

init进程是Android体系中用户进程的鼻祖进程。init进程会发动各种体系本地服务,如:Media Server、Service Manager、bootanim(开机动画)等。init进程会在解析init.rc文件后fork出Zygote,而Zygote是所有Java进程的父进程,咱们的App都是由Zygote fork出来的。 Zygote进程首要包含:

  • 加载ZygoteInit类,注册Zygote Socket服务端套接字;
  • 加载虚拟机;
  • 预加载Android核心类
  • 预加载体系资源

随后Zygote进程会fork出System Server进程,System Server进程担任发动和管理整个framework,包含Activity Manager,PowerManager等服务。

当System Server将体系服务发动安排妥当后,就会告诉ActivityManager发动首个Android程序Home即咱们看到的桌面程序。

至此,从Android手机开机到看到桌面程序所有进程分析完了。

最终附一张全体流程图,帮助更好了解:

作为Android开发者,你真的知道Android按下开机键到启动发生什么吗?

最终

假如你看到了这里,觉得文章写得不错就给个赞呗?

更多Android进阶指南 能够详细Vx重视大众号:Android老皮 解锁 《Android十大板块文档》

1.Android车载使用开发体系学习指南(附项目实战)

2.Android Framework学习指南,助力成为体系级开发高手

3.2023最新Android中高档面试题汇总+解析,告别零offer

4.企业级Android音视频开发学习路线+项目实战(附源码)

5.Android Jetpack从入门到精通,构建高质量UI界面

6.Flutter技术解析与实战,跨渠道首要之选

7.Kotlin从入门到实战,全方面提升架构根底

8.高档Android插件化与组件化(含实战教程和源码)

9.Android 功能优化实战+360全方面功能调优

10.Android零根底入门到精通,高手进阶之路

敲代码不易,重视一下吧。ღ( ・ᴗ・` )