Android 基础组件构成系统分层以及底层启动原理

时间:2024-04-06 08:42:52

一、一套最基础的安卓设备(开发版)应包含的组件

Android 基础组件构成系统分层以及底层启动原理

二、芯灵思开发板预览

Android 基础组件构成系统分层以及底层启动原理

第一口 UART ,这个比adb命令更加方便我们的工程师去抓取一些log
第二个 是LED灯
第三个 是SD卡 因为SD卡的读写速度较慢,如果将系统写入SD卡将大大影响我们的系统流畅程度
第四个 是Camera与WIFI接口,并且预留了一组GPL,这样我们就可以使用GPL挂载一些其他的外设,比方sensor红外之类的
第五个 是一个网线插口,这个开发板并没有直接提供WIFI
第六个 这里提供了一个OTG和两个USB接口
第七个 是LCD和HDMI接口

核心区域

1.主CPU A31S
2. DDR 1G
3.我们的FLash 也就是我们的EMMC 16G
4.这就是我们的PMU 电池管理芯片

这就是一块最简单的开发板外围接口和核心部分的简介

三、Android整个系统架构和分层

Android 基础组件构成系统分层以及底层启动原理

1.Android整个系统是由软件和硬件组成的

硬件第一个是指我们的主CPU,主CPU里有cache有MMU还有GPU和各种总线,这是由CPU的开发商给我们准备的。
手机芯片开发商有 高通-骁龙系列、联发科-MTK系列、海思-麒麟系列
当我们拿到一款CPU,了解到它的,基本接口之后,我们就需要拿它去做一些外围的设计
我们所说的外围的设计包括:Sensor的造型、Camera的造型、LCD WIFI等等以及存储空间的大小,这些都是由我们硬件工程师来决定的,但是我们的软件工程师也会给一些参考意见,当我们把整个硬件确定完之后,我们再来看软件方面的工作。

2.软件的工作从底层到上层可以分为这么几个部分

第一个是Uboot
第二个是内核
第三个是Android OS
Uboot的作用就是引导内核的启动,它首先会把我们的内核从FLash中搬到内存中引导内核启动
有这么一个问题,Uboot是如何被引导的呢?
这个由主CPU完成的,cpu里也会有一段引导程序,并且有一段固化的ROM,这个是由芯片厂商来完成的,我们的芯片提供厂商通常都会给我们提供几种启动模式,从USB启动,从SD卡启动或者从FLash启动,如何启动也是有它几个GPL的电频来决定的。
比如我们把它固定的GPL进行上拉或者下拉就可以配对成这种选择
如果我们配置从Flash启动,那么当我们双亮的时候,我们这一段引导程序就会从Flash中去引导我们的Uboot,从而完成我们Uboot的启动

3.内核是整个系统的核心

内核负责我们进程的管理,内存的管理,网络的管理,它可以直接对我们的硬件进行控制,并且把我们的硬件全部抽象成文件,对上层提供接口,当我们内核启动完成之后,就会根据我们所设置的参数去启动android系统

4.Android软件层分层

第一个是我们的Hal层
第二个是我们的Framework(C++)层
第三个是我们的第三方的一些库文件
第四个是我们的虚拟机系统
第五个是我们的Framework(Java)层
第六个是我们的应用层
其中HAL层的主要作用就是把我们的一些主要外设抽象出一套标准的接口供我们的Framework(C++)层调用。
比方说我会把我们的Camera抽象出来一套接口,如果说我们的底层换了Camera之后呢,我们Camera和C++ Framework层它们之间的接口是不会发生改变的。我所要修改的就是Hal层调用我们驱动的方式会发生一些改变,但是Framework到Hal层他们之间的接口是不会改变的
我们的Framework C++层主要是起一个承上启下的作用,对上也就是 Framework Java层,它提供服务,对下它能够挂接我们的Hal层,比如说我们的Camera Sensor Audio WIFI等外设,并且对我们这些外设提供一个保护,比如说我们上层有两个程序同时对Camera进行访问,但是呢,我们这里同一时刻只能有一个应用对我们的Camera进行访问,那我们的Framework现在就会有一种机制去管理这种访问确保在同一时刻只有一个应用程序对我们的Camera进行访问。

5.三方库

Android是一个庞大的系统,它同时引入了很多第三方开源的库。比如说LibJPerk,LibJPng,Scaya,Webkit等等,这些库也主要是为我们系统提供一些处理。

6.Dalvik虚拟机

Dalvik虚拟机主要是连接我们上层应用,我们底层的服务,我们的第三方库,提供一个自动化的管理尤其是我们的内存的一个管理。
有了Dalvik虚拟机虚拟机之后,我们就可以使用Java去写我们相关的应用,我们用Java写应用的效率和代码的复用性要比C和C++高很多。

7.Framework(Java)

Framework(Java)层为我们提供了ActivityManager,WindowsManager,PackageManager,SensorManager等并提供了电源管理。WIFI管理等一系列的服务,并且Android还提供了相关的Activity以及进程间通讯的一些方式。
这些Activity通讯的方式,管理系统和服务足够支撑我们快速的创建出我们自己的应用,并且这些代码全是开源的,我们也可以根据自己的需求去定制我们所需要的控件。

8.App应用层

我们的应用是基于java来实现的,运行在我们的虚拟机上,而且我们每一个进程对我们的访问权限也是有要求的。

9.以Camera为例分析应用从上到下的代用顺序

我们的应用程序想要拍张照片,首先,它要去获取我们的Camera服务,那么就会从我们的应用层调到我们的Framework java层,Framework java层通过虚拟机直接获取我们的Camera服务。
如果当前我们的Camera服务有人在占用,那我们就会断开当前的连接,同时和我们新的应用建立一个连接,这样我们的应用就能获取我们Camera的访问权限,并且获取我们Camera获取的一些属性。
然后我们的Camera服务和Hal层建立了关系。这样当我们点击一个拍照命令,那么我们的命令一直会从上层到我们的CameraService告诉我们的Camera Hal层。
Hal层就会直接调用我们的驱动去控制我们的硬件去抓拍一张照片,我们的照片拿到的数据就会经过我们ISB处理然后返回给我们的Camera Service,再从Service通过我们的Dalvik虚拟机传递给我们上层。
然后我们上层拿到图片就可以做一些处理,比方说做一些预览,或者直接存储到我们的Flash或者SD卡中。

这就是android每层和每层之间的一个大概的联系

四、Android系统启动过程

Android 基础组件构成系统分层以及底层启动原理

首先是上电
接下来是bootloader,这个bootloader是生产时就已经烧录好的,它会根据我们的硬件以及GPL的设置来判断我们的系统是在U盘还是在SD卡以及我们的UFlash中启动
去引导我们的Uboot
我们的Uboot主要是初始化一些相关的外设,比方说内存,我们的Flash,以及我们CPU的一些IO,并且通过串口给我们提供一些修改启动参数的配置过程并且根据我们所配置的一个参数去引导内核启动。
当我们的内核被引导起来之后,内核还是初始化一些外设,比方说我们的系统的一个主频,我们内存,我们Flash,我们的系统驱动,我们的外设驱动统一都被加载起来,并且根据我们Uboot的配置参数启动系统
当我们的系统被起来之后,也就是我们的Android被起来之后,要进行一些列的初始化工作
第一个是挂载分区,创建android一系列的目录
创建目录后会1加载一些必要的驱动,加载完驱动之后根据我们的启动脚本去启动我们的系统服务,比如说mediaService,serviceManger,adbd。。。。。或者说我们自己新加的一些服务都会在这里启动。
启动完之后它还会做一些相关的环境变量的配置,这些配置会在系统中启用,比如说我们的硬件版本,软件版本都会在这里进行设置,最后我们把所有的服务启动完之后,android启动服务就会在这里守护整个系统。
如果说我们有个服务中间出现错漏,那我们的守护进程就会重新创建这个服务

android启动时间是比较长的,就这三块(uboot,kernel,android)根据log周期看一下哪块比较耗时,根据自己和厂商的支持,针对某一模块做优化