Android体系结构

Android建立在标准Linux内核之上,对内核本身只有少量最重要的拓展,一旦进入用户空间,Android的实现与传统的Linux发行版具有相当大的不同,并且以非常不一样的方式使用你已经了解的Linux功能特性。

如同传统的Linux系统一样,Android的第一个用户空间进程是init,它是所有其他进程的根。然而,Android的init启动的守护进程是不同的,这些守护进程更多的聚焦于底层细节(管理文件系统和硬件访问),而不是高层用户设施,例如调度定时任务。Android还有一层额外的进程,它们运行Dalvik的Java语言环境,负责执行系统中所有以Java实现的部分。


Android进程层次结构.png

首先是init进程,它产生了一些底层守护进程。其中一个守护进程是zygote,它是高级Java语言进程的根。Android的init不以传统的方法运行shell,因为典型的Android设备没有本地控制台用于shell访问。作为替代,系统进程adbd监听请求shell访问的远程连接(例如通过USB),按要求为它们创建shell进程。

因为Android大部分是用Java语言编写的,所以zygote守护进程以及有它启动的进程是系统的中心。由zygote启动的第一个进程称为system_server,它包含全部核心操作系统服务,其关键部分是电源管理、包管理、窗口管理和活动管理。其它进程在需要的时候由zygote创建,这些进程中有一些是“持久的”进程,它们是基本操作系统的组成部分,例如phone进程中电话栈,它必须保持始终运行。另外的应用程序进程将在系统运行的过程中按需创建和终止。

Android的设计目标之一,是能够以200ms为目标快速启动应用程序,要求为新的应用程序启动全新的Dalvik进程会大大超出预算。Android提供的解决方案是:zygote负责启动并初始化Dalvik到一个阶段,预装Android框架的许多部分(这些部分对于系统和应用程序而言是公共的),需要使用的资源和其它东西,准备好运行用Java写的系统或应用程序代码。如下图所示:


从zygote创建新的Dalvik进程.png

注意:从zygote创建新进程涉及Linux的fork,但是不存在exec调用。新进程是最初zygote进程的复制品,拥有已经建立好的所有预初始化状态,并且做好了运行的准备。调用fork之后,新进程有了自己单独的Dalvik环境,只是它与zygote通过写时复制页面共享预装载和初始化的数据。

Android的体系结构高度依赖Linux的系统原语,包括内存管理、安全以及跨安全边界的通信。对于核心操作系统概念,Android并不使用Java语言,以此试图将底层Linux操作系统这些重要的部分加以抽象。

参考资料:
[1] 现代操作系统

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。

推荐阅读更多精彩内容

友情链接更多精彩内容