安卓系统架构的认识以及开机流程
- Android系统架构
- 应用层(App)
- 应用框架层(Framework)
- 系统运行库层(Native层)
- 硬件抽象层(HAL)
- Linux内核层(Kernel层)
- Android系统的开机启动流程
- 第一步:BootRom
- 第二步BootLoader
- 第三步.初始化Kernel
- 第四步.init进程
- 第五步.Zygote进程
- 第六步.SystemServer进程
- 第七步.Home Activity
Android系统架构
Android底层内核空间以Linux Kernel作为基石,上层用户空间由Native系统库、虚拟机运行环境、框架层组成,在android的系统架构中,通过系统调用(Syscall)连通系统的内核空间和用户空间。进而通过JNI技术对用户空间的Java层和Native层(c++/c),从而连接整个系统。
由Google官方给出的分层架构图可知:Android系统架构分为5层,从上到下分别是应用层、应用框架层、系统运行时层、硬件抽象层和Linux内核层。
应用层(App)
手机上安装的所有应用程序(系统内置的应用程序以及非系统级的应用程序)都属于应用层,负责与用户直接进行交互,这一层通常都是用Java进行开发的。
应用框架层(Framework)
应用框架层包含了为我们开发人员开发应用程序所需要的API,我们平常开发的应用程序以及系统内置的应用程序调用的都是这一层的API,这一层是由Java代码编写的,又称Java Framework层。下面看几个这一层所提供的主要组件:
名称 | 功能描述 |
ActivityManager(AM活动管理器) | 管理各个应用的生命收起以及通常的导航回退功能 |
LocationManager(LM位置管理器) | 提供地理位置以及定位服务 |
PackageManager(PM包管理器) | 管理所有安装在Android系统中的应用程序 |
NotificationManager(NM通知管理器) | 使应用程序可以在状态栏中显示自定义的提示信息 |
ResourceManager(RM资源管理器) | 提供应用程序使用的各种非代码资源,如本地化字符串、图片、布局文件等 |
TelephoneManager(TM电话管理器) | 管理所有的移动设备功能 |
WindowManager(WM窗口管理器) | 管理所有开启的窗口程序 |
ContentProvides(CP内容提供器) | 使不同的应用程序之间可以共享数据 |
ViewSystem(VS视图系统) | 构建应用程序的基本组件 |
系统运行库层(Native层)
系统运行库层分为两部分,C/C++程序库和Android运行时库。C/C++程序库包含OpenGL ES(3D绘图函数库)、SQLite(轻型数据库引擎)、SSL(安全套接层);Android运行时库包含了一些Java的核心包支持以及ART(使应用第一次安装时,字节码会预先编译成机器码使其真正的成为本地应用)。
硬件抽象层(HAL)
硬件抽象层是位于操作系统内核与硬件电路之间的接口层,其目的在于将硬件抽象化,为操作系统提供虚拟硬件平台,使其具有硬件无关性,可在多种平台上进行移植。 从软硬件测试的角度来看,软硬件的测试工作都可分别基于硬件抽象层来完成,使得软硬件测试工作的并行进行成为可能。通俗来讲,就是将控制硬件的动作放在硬件抽象层中。
Linux内核层(Kernel层)
安卓的底层就是基于Linux Kernel层的,在此基础上添加了部分Android专用的驱动,通过这些驱动来控制硬件。系统的安全性、内存管理、进程管理、网络协议栈和驱动模型都依赖于此内核层。
以上就是Android系统的五层架构。下面说一下
Android系统的开机启动流程
上面的Android架构我们使从上往下讲解的,而Android系统的开机流程是自下而上的,大体上分为三个阶段:
- BootLoader引导
- 启动Kernel
- 启动Android
接下来我们详细的介绍其流程:
先附一张流程图:
第一步:BootRom
当我们长按开机键时,引导芯片开始从固化在ROM的预设代码开始执行。然后加载引导程序到RAM。
第二步BootLoader
BootLoader又称为引导程序,他是在操作系统运行之前运行的一段程序,他是运行的第一个程序。其功能主要是检查RAM、初始化硬件参数等,它的最终目的是把操作系统拉起来。
其实BootLoader的主要必须作用只有一个:将操作系统映像文件拷贝到RAM中,然后跳转到其入口执行,我们称之为启动加载模式,这一过程没有用户参与,是他自己正常工作的模式:初始化硬件设备,准备好RAM空间,将后续代码复制到RAM中,设置好堆栈,跳转到代码入口运行,检测内存映射,将内核映像和跟文件系统映像读到RAM中,设置一个启动参数,通过参数调用内核,以便于把操作系统拉起来。
第三步.初始化Kernel
在这里我们刚刚进入Android系统,在这里主要是启动两个主要进程:swapper进程和kthread进程。swapper进程是系统初始化Kernel所建立的第一个进程,用于初始化进程管理、内存管理、加载Display、Camera、Binder等驱动相关工作;kthread是内核线程,其会创建内核工作线程、软中断线程和内核守护进程。
第四步.init进程
在初始化内核之后,就会启动一个相当重要的祖先进程,也就是init进程,在Linux中所有的进程都是由init进程直接或间接fork出来的。init进程会启动ServiceManager、bootanim等重要服务,并且负责创建系统中最关键的几个子进程:用户守护进程、Zygote进程(虚拟机进程,所有Java进程的父进程)。
第五步.Zygote进程
在init进程创建之后,会fork出一个Zygote进程,这个进程是所有Java进程的父进程,Zygote的任务主要包括:
- 加载ZygoteInit类,注册Zygote Socket服务端套接字
- 加载虚拟机
- 提前加载类preloadClasses
- 提前加载资源preloadResources
第六步.SystemServer进程
这个进程是通过Zygote进程调用startSystemServer()方法ork出的,它和Zygote进程是Android Framework层的两大重要进程。SystemServer进程主要会开启一些系统中重要的服务,比如AMS、WindowManager、PackageManagerService等等都是由SystemServer进程fork出来的
第七步.Home Activity
在SystemServer进程中开启AMS后,会调用finishBooting方法,完成引导过程,同时发送开机广播“ACTION_BOOT_COMPLETED”,之后就会开启系统的主程序——Launcher程序(是Zygote进程孵化出的app进程,这是用户看到的桌面app),完成系统界面的加载与显示。
至此,Android的开机启动流程大概就完成了。