(二)Android架构拆解

 这图是down来的——>掌握 Android 系统架构,看这一篇就够了!| 技术头条

 Android系统启动过程:Bootloader引导开机——>kernel内核层——>系统库——>Framework层——>System Apps层(用户交互)
首先补充一个概念:守护进程
        Linux系统启动时会启动很多系统服务进程,这些系统服务进程没有控制终端,不能直接和用户交互。其它进程都是在用户登录或运行程序时创建,在运行结束或用户注销时终止,但系统服务进程不受用户登录注销的影响,它们一直在运行着。这种进程有一个名称叫守护进程

一:Loader加载
        当系统处于关机状态时,通电引导芯片执行固化在ROM里的预设代码,把引导程序加载到RAM(内存),这就是boot rom干的活。boot loader是引导程序,用于检查RAM,初始化硬件参数等一些预热性工作。

二:Kernel内核层
        引导程序执行后,启动Kernel的swapper进程(又名IDLE进程),该进程是Kernel开创的第一个进程(pid=0),主要用于初始化进程管理、内存管理、加载Display、Camera Driver、Binder Driver等(我理解的就是加载各种驱动)。接着swapper进程fork出两个进程:init进程(pid=1)和kthreadd进程(pid=2)。init进程是Linux中的第一个用户空间进程,是其他用户空间进程的直接或间接父进程。kthreadd进程会fork内核工作线程kworkder、软终端线程ksoftirad、thermal等内核守护进程,kthreadd进程是内核空间其他内核线程的直接或间接父进程,负责创建内核各线程。

三:HAL硬件抽象层

        HAL提供标准接口,包含多个库模块,每个模块都为特定的硬件组件实现一组接口,当框架API请求访问设备硬件是,Android系统将为该硬件加载相应的库模块。总的来说系统对硬件的支持分为了两层,一层放在用户空间(User Space),一层放在内核空间(Kernel Space),而硬件抽象层运行在用户空间,内核驱动程序运行在内核层。内核驱动只提供简单的访问硬件逻辑,例如读写硬件寄存器的通道,至于从硬件中读到了什么值或者写了什么值到硬件中的逻辑,都放在硬件抽象层中去,如此即使内核部分被移植到别的机器,但由于缺乏硬件抽象层的支持,硬件就完全不能用了。

 四:系统运行层
        包含两个主要部分:一个是系统库,一个是运行时。

系统库主要包括以下九个:
        ●Libc系统c库,从BSD继承的标准C系统函数库,专门为基于EmbeddedLinux的设备定制
        ●Media Framework多媒体库,安卓系统多媒体库,基于PacketVideoOpen、CORE。该库支持路放,且可以录制许多流行的音视频格式,以及静态映像文件,包括MPEG4、H.264、MP3、AAC、JPG、PNG等
        ●Surface Manager,主要负责管理针对显示系统的访问,并且为多个应用程序提供2D和3D图层的无缝融合
        ●Webkit浏览器,一个最新的web浏览器引擎,用来支持Android浏览器和一个可嵌入的web视图
        ●SGL,一个内置的2D图形引擎
        ●SSL,位于TCP/IP与各种应用层协议之间为数据通信提供支持
        ●OpenGL ES,3D效果的支持,基于OpenGLES1.0 APIs实现,该库可以使用硬件3D加速或者使用高度优化的3D软加速
        ●gree Type,提供位图bitmap和向量vector的字体描述与显示
        ●SQLite,一个对于所有应用程序可用,功能强劲的轻型关系型数据库引擎
        除了上述的主要系统类库之外,还有Android NDK这样的原生库,为开发者提供了直接使用Android系统资源,并采用C或C++语言编写程序的接口。所以第三方应用程序可以不依赖虚拟机进行开发,NDK提供了一系列从C或C++生成原生代码所需要的工具,为开发者快速开发C或C++的动态库提供方便,并能自动将生成的动态库和Java应用程序一起打包成应用程序包文件,即.apk文件。这里要注意:原生库无法访问应用框架层API,兼容性可能无法保障。而且从安全性角度考虑,Android原生库用非类型安全的程序语言C/C++编写,更容易产生安全漏洞,原生库的缺陷也可能更容易直接影响应用程序的安全性。
运行时包含核心库和虚拟机两部分:
        ●核心库,提供了Java API中的大多数功能,也包含Android的一些核心API(Android.OS、Android.net、Android.media等)
        ●虚拟机,对于运行Android 5.0(API级别21)或更高版本的设备,每个应用都在其自己的进程中运行,并且有自己的Android Runtime实例。ART通过执行DEX文件可在设备运行多个虚拟机,DEX文件是一种专为Android设计的字节码格式文件,经过优化使用内存很少。 

        内核完成系统设置,接着寻找'init.rc'文件,启动init进程,主要分为两个阶段:
第一阶段完成:①ueventd/watchdogd跳转及环境变量设置;②挂在文件系统并创建目录;③初始化日志输出、挂载分区设备;④启用SELinux安全策略;⑤开始第二阶段前的准备
第二阶段完成:①初始化属性系统;②执行SELinux第二阶段并回复一些文件安全上下文;③新建epoll并初始化子进程终止信号处理函数;④设置其他系统属性并开启属性服务
        <==>init进程主要做的事情小结:第一个应用程序——>创建目录,挂载分区——>解析启动脚本——>启动服务——>守护服务(和上一段内容一样的)

init进程会fork出诸多用户守护进程(ueventd、logd、healthd、installd、adbd、lmkd等);同时启动servicemanager(binder服务管家)、bootanim(开机动画)等重要服务(由图可知还会启动多媒体服务Media Server);最后fork出Zygote进程,是系统的第一个Java进程(即虚拟机进程),而Zygote是多有Java进程的父进程。

 五:Java Framework应用框架层

        Zygote进程启动,创建Java虚拟机以及虚拟机注册JNI方法,创建服务器端Socket,启动SystemServer进程,SystemServer负责启动和管理整个Java Framework,主要包含活动管理器,位置管理器,包管理器,通知管理器,资源管理器,电话管理器,窗口管理器,内容提供器,视图系统这些服务。这一层主要提供了攻坚应用程序时可能用到的各种API,Android自带的一些核心应用就是使用这些API完成的。
        'init'进程会派生一个Media Server进程,负责启动和管理整个C++ Framework,主要包含AudioFlinger,Camera Service等服务

六:System APP应用层
        Zygote进程fork出的第一个APP进程是Launcher,即用户看到的桌面APP,其次会派生Browser,Phone,Email等APP进程,每个APP至少运行在一个进程上。总结一句话就是所有的APP进程都是由Zygote fork而来。

 参考资料:掌握 Android 系统架构,看这一篇就够了!| 技术头条

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

少卿不在大理寺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值