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] 现代操作系统

更多相关文章

  1. Android的权限机制之—— “沙箱”机制sharedUserId跟签名
  2. Android入门
  3. android 基本架构
  4. Android应用程序消息处理机制(Looper、Handler)分析
  5. [Java][Android][Process] 暴力的服务可以解决一切,暴力的方式执
  6. android的内存管理方式
  7. android学习指南(2)-应用程序的基本要素
  8. 1.0 Kotlin-Android开发简介
  9. Android入门教程(五)之------第一个Android工程HelloAndroid

随机推荐

  1. android读写文件
  2. C# mono android 图片上传进度条实现
  3. android 2.2+ 完全退出程序的方法
  4. android SpannableString使用详解,替代多
  5. android中Search之Creating a Searchable
  6. Android(安卓)MediaPlayer研究问题
  7. 判断手机类型
  8. Linearlayout 添加divider
  9. Android开发者网址导航
  10. SmartQ7 Android 改变屏幕 分辨率