赞
踩
Android系统总体框架
Android系统启动过程是由图从下往上的一个过程:由Boot Loader引导开机,然后依次进入 -> Kernel -> Native -> Framework -> App 。
Linux内核层:Android平台的基础是Linux内核,它提供了用于支持Android平台的设备驱动Linux操作系统和驱动,由C语言实现。借助Linux内核服务增加了一些面向移动计算的特有功能,实现硬件设备驱动,进程和内存管理,网络协议栈,电源管理,无线通信等核心功能。另外,Linux 内核也作为硬件和软件之间的抽象层,它隐藏具体硬件细节而为上层提供统一的服务。
硬件抽象层 (HAL):硬件抽象层 (HAL)是对硬件设备的抽象和封装,为Android在不同硬件设备提供统一的访问接口。HAL处于Android framework和Linux kernel driver之间。HAL屏蔽了不同硬件设备的差异,为Android提供了统一的访问硬件设备的接口。
在HAL层中,各类硬件的都是以硬件模块的形式描述的,是用hw_module_t结构体来描述的,而每一类硬件模块中又有各个独立的硬件,是用hw_device_t结构体来描述的。上层app通过JNI调用硬件时,首先得获取到hw_module_t结构体,也即是硬件模块,有了这个才能再对硬件进行操作。
Framework层:Framework层为应用程序提供系统的API,开发人员可以访问核心应用程序所使用的API框架,重用各种组件和服务,任何应用程序都能发布它的功能且任何其他应用程序都可以使用这些功能(需要服从框架执行的安全限制),这一机制允许用户替换组件。
Android系统的四大组件:
Activity是一个应用程序的组件,他在屏幕上提供了一个区域,允许用户在上面做一些交互性的操作, 比如打电话,照相,发送邮件,或者显示一个地图。Activity可以理解成一个绘制用户界面的窗口, 而这个窗口可以填满整个屏幕,也可能比屏幕小或者浮动在其他窗口的上方。
Service主要用于在后台处理一些耗时的逻辑,或者去执行某些需要长期运行的任务。必要的时候甚至可以在程序退出的情况下,让Service在后台继续保持运行状态。
BroadcastReceiver广播接收器用于响应来自其他应用程序或者系统的广播消息。这些消息有时被称为事件或者意图。例如,应用程序可以初始化广播来让其他的应用程序知道一些数据已经被下载到设备,并可以为他们所用。这样广播接收器可以定义适当的动作来拦截这些通信。
contentprovider内容提供者组件通过请求从一个应用程序向其他的应用程序提供数据。这些请求由类 ContentResolver 的方法来处理。内容提供者可以使用不同的方式来存储数据。数据可以被存放在数据库,文件,甚至是网络。
Android系统开关机流程
开机流程和其主要模块的整体预览:
Loader阶段
·Boot Rom
Boot Rom是嵌入处理器芯片内的一小块掩模ROM或写保护闪存。它包含处理器在上电或复位时执行的第一段代码。当按开机键进行开机的时候,引导芯片开始从固化在ROM的预设代码开始执行,然后将加载引导程序(BootLoader)到RAM中去运行。
·BootLoader
BootLoader又称为引导程序,负责查找和加载应该在芯片上运行的最终操作系统或固件。与Boot Rom的一个主要区别是它通常在可写闪存中,可以更换或升级。主要的功能有检查RAM、初始化一些硬件外设等功能,它最终的目的是启动操作系统,在Android系统中,它所启动的操作系统就是kernel ;启动kernel,即把kernel镜像文件拷贝到RAM中去,然后跳转到它的入口处去执行。
·kernel
kernel在启动初期,会调用跟平台架构相关的汇编代码,在架构相关的汇编代码运行完之后,程序进入了架构无关的内核C语言代码中的start_kernel函数,在这个函数中Linux内核开始真正进入初始化阶段并完成了内核的大部分初始化工作。后续会调用rest_init完成设备驱动程序的初始化,该函数的最主要任务就是启动kernel的“左右护法”kthreadd 和 init 。
kthreadd 通过kernel_thread创建,并始终运行在内核空间, 它的任务就是管理和调度其他内核线程(kernel_thread), 当调用kernel_thread创建的内核线程会被加入到kthread_create_list链表中,因此所有的内核线程都是直接或者间接的以kthreadd为父进程。
Init阶段
通过kernel_thread创建,在内核空间完成初始化后, 加载init程序, 并最终在用户空间运行,是系统中所有其它用户进程的祖先进程(它是所有Android系统native service进程的祖先),在init启动完成完成后,init将变为守护进程监视其他用户进程。Init进程负责创建Android系统中最关键的几个子进程,如Zygote和bootanimation等。
init进程第一阶段做的主要工作是挂载分区,创建设备节点和一些关键目录,初始化日志输出系统,启用SELinux安全策略。
第一阶段完成以下内容:
/* 01. 创建文件系统目录并挂载相关的文件系统 */
/* 02. 屏蔽标准的输入输出/初始化内核log系统 */
第二阶段主要内容:
/* 01.创建进程会话密钥并初始化属性系统*/
/* 02.进行SELinux第二阶段*/
/* 03.新建epoll并初始化*/
/* 04.启动匹配属性的服务端*/
/* 05.解析init.rc等文件,建立rc文件的action 、service,启动其他进程*/
Framework阶段
kernel管理着driver, Framework管理着Android app,下一步需要把”Framework”启动起来。
Android Framework 是Android 的Java API 框架,它是Android中最最最底层的Java代码,它通过JNI的方式调用C/C++,最终调用到Linux kernel,通过这种方式来和设备打交道,把一些基本的或者说是和设备打交道的服务抽象起来作为API开放给Android APP调用。
Zygote阶段
Zygote进程在启动的过程中,除了会创建一个虚拟机实例之外,还会将Java运行时库加载到进程中来,以及注册一些Android核心类的JNI方法来前面创建的虚拟机实例中去;而它最主要作用是作为一个Socket的Server端,处理来自五湖四海的Java进程创建请求(Android中所有的Java应用进程的创建都是一个应用进程通过Binder请求SystemServer进程,SystemServer进程再发送socket消息给Zygote进程,统一由Zygote进程创建,所以Zygote进程是是所有Java进程的祖先进程)。
ZygoteInit的main方法主要做了以下六件事情:
步骤:
SystemServer阶段
SystemServer由Zygote fork生成的,是zygote孵化出的第一个进程,该进程是从ZygoteInit.java的main()函数中调用 startSystemServer()开始的;它的主要任务是启动android 系统服务,例如AMS、WMS、PMS等。
Home Activity阶段
Home Activity也是一个APK应用,它是系统启动后的第一个可操作的有界面的应用(它的启动方式和其他APK的启动方式都是相同的)。
在启动Home Activity之后,会调用finishBooting()函数,完成引导过程,同时发送开机广播“ACTION_BOOT_COMPLETED”APP侧此时可以接收开机广播。理论上来说,Home Activity启动成功之后就标志着我们的开机流程结束了
关机流程
FW(显示关机动画,发送关机广播..)-init(kill native service、卸载外部存储…)-kernel
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。