Android 和 Linux 关系密切,Android 采用 Linux 作为内核,对 Linux 内核做了一定修改,使其适应移动设备上的应用。Android 开始时是作为 Linux 的一个分支,后来由于无法并入 Linux 的开发树,被 Linux 内核组从开发树中删除。

Android 继承于 Linux

  Android 是基于 Linux 2.6 的内核基础上运行的,提供的核心系统服务包括安全、内存管理、进程管理、网络组和驱动模型等内容。但是,严格来说,Android 不算是 Linux 操作系统
  因为 Android 内核是由标准的 Linux 内核修改而来的,继承了 Linux 内核的很多优点,保留了 Linux 内核的主题架构。但是 Android 本身也有很大的创新,按照移动设备的需求在文件系统、内存管理、进程间通信机制和电源管理方面进行了修改他,根据需要添加了很多相关的驱动程序和必要的新功能。

  总而言之,Android 很大程度地保留了 Linux 的基本架构,因此,Android 有极强的应用型的和拓展性。

Android 和 Linux 内核的区别

  Android 系统层面的底层是基于 Linux 内核的,中间加上了 Dalvik 的 Java 的虚拟机,表面层上面是 Android 运行库。

  每个 Android 应用都运行在自己的进程上,享有 Dalvik 虚拟机为它分配的专有实例。Dalvik 虚拟机执行的是 Dalvik 格式的可执行文件 .dex。该格式经过了专门的优化处理,目的是将内存耗用降到最低。

  文件编译: Java 编译器将 Java 源文件转为 class 文件,class 文件又被内置的 dx 工具转化为 dex 格式文件,这种文件在 Dalvik 虚拟机上注册并运行。由此可见,Android 系统的应用软件都是运行在 Dalvik 之上的 Java 软件,而 Dalvik 是运行在 Linux 中的,在一些底层功能 —— 比如线程和低内存管理方面,Dalvik 虚拟机依赖于 Linux 内核。

  综上所述,Android 是运行在 Linux 之上的操作系统,但是 Android 本身并不能算是 Linux 的某个版本。

  Android 内核和 Linux 内核的差别主要体现在下面的 11 个方面。

  (1) Android Binder
  Android Binder 是基于 OpenBinder 框架的一个驱动,用于提供 Android 平台的进程间通信(IPC)。而原来的 Linux 系统上层应用的进程间通信主要是 D-Bus,采用消息总线方式来进行 IPC。

  源代码位于 drivers/staging/android/binder.c。

  (2) Android 电源管理(PM)
  Android 电源管理是一个基于标准 Linux 电源管理系统的轻量级的 Android 电源管理驱动,针对嵌入式设备做了很多优化。利用锁和定时器来切换系统状态,控制设备在不同状态下的工号,已到达节能的目的。

  源代码分别位于如下文件:

  • kernel/power/earlysuspend.c
  • kernel/power/consoleearlysuspend.c
  • kernel/power/fbearlysuspend.c
  • kernel/power/wakelock.c
  • kernel/power/userwakelock.c

  (3) 低内存管理器 Low Memory Killer
  Android 中的低内存管理器和 Linux 标准的 OOM(Out Of Memory) 相比,其机制更加灵活。它可以根据需要杀死进程来释放需要的内存。

  源代码位于 drivers/staging/android/lowmemorykiller.c

  (4) 匿名共享内存(Ashmem)
  匿名共享内存为进程间提供大块共享内存,同时为内核提供回收和管理这个内存的机制。如果一个程序尝试访问 Kernel 释放的一个共享内存块,它会收到一个错误提示,然后重新分配内存并重载数据。

  源代码位于 mm/ashmem.c

  (5) Android PMEM
  PMEM 用于向用户控件提供连续的物理内存区域,DSP 和某些设备只能工作在连续的物理内存上。

  源代码位于 drivers/misc/pmem.c

  (6) Android Logger
  Android Logger 是一个轻量级的日志设备,用于抓取 Android 系统的各种日志,是 Linux 所没有的。

  源代码位于 drivers/staging/android/logger.c

  (7) Android Alarm
  Android Alarm 提供了一个定时器用于把设备从睡眠状态唤醒,同时它也提供了一个即使在设备睡眠时也会运行的始终基准。

  源代码位于以下两个文件中。

  • drivers/rtc/alarm.c
  • drivers/rtc/alarm-dev.c

  (8) USB Gadget 驱动
  此驱动是基于标准 Linux USB gadget 驱动框架的设备驱动,Android 的 USB 驱动时基于 gadget 框架的。

  其源代码位于如下文件中。

  • drivers/usb/gadget/android.c
  • drivers/usb/gadget/f_adb.c
  • drivers/usb/gadget/f_mass_storage.c

  (9) Android Ram Console
  为了提供调试功能,Android 允许将调试日志信息写入一个被称为 RAM Console 的设备里,它是一个基于 RAM 的 Buffer。

  源代码位于 drivers/staging/android/ram_console.c

  (10) Android time device
  Android time device 提供对设备进行定时控制功能,目前仅仅支持 vibrator 和 LED 设备。

  源代码位于 drivers/staging/android/timed_output.c (timed_gpio.c)

  (11) Yaffs2 文件系统
  在 Android 系统中,采用 Yaffs2 作为 MTD nand flash 文件系统。同其他 Flash 文件系统相比,Yaffs2 使用更小的内存来保存其运行状态,因此它占用的内存小。

  源代码位于 fs/yaffs2/ 目录下。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐