android和linux内核

Android是基于Linux内核的操作系统,但是它与Linux之间还是有很大的差别,比如Android在Linux内核的基础上添加了
自己所特有的驱动程序

Android为什么会选择Linux?

1、强大的内存管理和进程管理方案
2、基于权限的安全模式
3、支持共享库
4、经过认证的驱动模型
5、Linux本身就是开源项目

Android对linux系统的改动主要有

1.它没有glibc支持

由于Android最初用于一些便携的移动设备上,所以,可能出于效率等方面的考虑,Android并没有采用glibc作为
C库,而是Google自己开发了一套Bionic Libc来代替glibc。

2.它并不包括一整套标准的Linux使用程序

Android并没有完全照搬Liunx系统的内核,除了修正部分Liunx的Bug之外,还增加了不少内容,比如:它基于ARM
构架增加的Gold-Fish平台,以及yaffs2 FLASH文件系统(如果学习了嵌入式的话就会知道yaffs2 FLASH文件系
统已经在基于linux的很多嵌入式设备上采用了,技术已经非常成熟)等。

3.它没有本地基于X服务的窗口系统

什么是本地窗口系统呢?本地窗口系统是指GNU/Linux上的X窗口系统,或者Mac OX X的Quartz等。不同的操作系统
的窗口系统可能不一样,Android并没有使用(也不需要使用)Linux的X窗口系统(对原作者的这个观点不是很赞
同,原文章这一点放在第一条,并说“这是Android不是Linux的一个基本原因”,这个不敢苟同,由于作者 没有
指明android用的什么显示系统,我也不好说)。

4.Android专有的驱动程序

除了上面这些不同点之外,最重要的是,为了突出android特性,支持android设备,Android还对Linux设备驱动进行了增强,主要如下所示。
1)Android Binder 基于OpenBinder框架的一个驱动,用于提供 Android平台的进程间通信(InterProcess
Communication,IPC)功能。源代码位于drivers/staging/android/binder.c。

2)Android电源管理(PM) 一个基于标准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) 比Linux的标准的OOM(Out Of Memory)机制更加灵活,它可以根据需要
杀死进程以释放需要的内存。源代码位于 drivers/staging/ android/lowmemorykiller.c。

4)匿名共享内存(Ashmem) 为进程间提供大块共享内存,同时为内核提供回收和管理这个内存的机制。源代码位于
mm/ashmem.c。

5)Android PMEM(Physical) PMEM用于向用户空间提供连续的物理内存区域,DSP和某些设备只能工作在连续的物
理内存上。源代码位于drivers/misc/pmem.c。

6)Android Logger 一个轻量级的日志设备,用于抓取Android系统的各种日志。源代码位于
drivers/staging/android/logger.c。

7)Android Alarm 提供了一个定时器,用于把设备从睡眠状态唤醒,同时它还提供了一个即使在设备睡眠时也会
运行的时钟基准。源代码位于drivers/rtc/alarm.c。

8)USB Gadget驱动 一个基于标准 Linux USB gadget驱动框架的设备驱动,Android的USB驱动是基于gaeget框
架的。源代码位于drivers/usb/gadget/。

9)Android Ram Console 为了提供调试功能,Android允许将调试日志信息写入一个被称为RAM Console的设备
里,它是一个基于RAM的Buffer。源代码位于drivers/staging/android / ram_console.c。

10)Android timed device 提供了对设备进行定时控制的功能,目前支持vibrator和LED设备。源代码位于
drivers/staging/android /timed_output.c(timed_gpio.c)。

11)Yaffs2 文件系统 Android采用Yaffs2作为MTD nand flash文件系统,源代码位于fs/yaffs2/目录下。
Yaffs2是一个快速稳定的应用于NAND和NOR Flash的跨平台的嵌入式设备文件系统,同其他Flash文件系统相比,
Yaffs2能使用更小的内存来保存其运行状态,因此它占用内存小。Yaffs2的垃圾回收非常简单而且快速,因此能表
现出更好的性能。Yaffs2在大容量的NAND Flash上的性能表现尤为突出,非常适合大容量的Flash存储。

最新的Android系统分为五层六区(域):

android系统架构的前世今生

Linux内核层(Linux Kernel):Android系统基于Linux2.6内核,这一层为Android设备各种硬件提供了底层驱动,如显示驱动、音频驱动、照相机驱动、蓝牙驱动、Wi-Fi驱动、电源管理等;

硬件抽象层(android hardware abstraction layer):安卓驱动硬件的方式与Linux不尽相同。传统Linux的驱动完全存活于内核空间。Android则在内核外部增加了硬件抽象层(HAL, Hardware Abstraction Layer) ,把一部分驱动功能放到HAL层中。安卓为什么费尽麻烦增加一个HAL呢?为了保护源代码。Linux内核采用了GPL协议,所以硬件生产商想要支持Linux系统,必须遵照GPL协议公开硬件驱动的源代码。但这些源代码中包含有许多硬件的设计信息,牵涉到硬件生产商的核心利益。而增加了HAL层之后,硬件厂商就不需要开放所有的驱动代码了。

系统运行库层(libraries):这一层通过一些C/C++库(so库)来为Android系统提供了主要的特性支持。如SQLite库提供了数据库支持,OpenGL ES库提供了3D绘图支持,Webkit库提供了浏览器内核支持等;

应用框架层(application framework):这一层主要提供构建应用程序时可能用到的各种API,Android自带的一些核心应用就是使用这些API完成的,开发者也可通过使

用API来构建自己的应用程序;

应用层(applications):这一层主要用于手机应用的安装,如系统自带联系人、短信等程序,或是第三方应用程序

以上为五层五区,还有一个区域是存在于libraries层的Android运行时库(Android Runtime),它主要提供一些核心库,能够允许开发者使用Java语言来编写Android应用。另外Android运行时库中还包含了Dalvik虚拟机,它使得每一个Android应用都能运行在独立的进程中,且拥有一个自己的Dalvik虚拟机实例。相较于Java虚拟机,Dalvik是专门为移动设备定制的,它针对手机内存、CPU性能有限等情况作了优化处理。 每个Android应用都运行在自己的进程上,享有Dalvik虚拟机为它分配的专有实例。为了支持多个虚拟机在同一设备上高效运行,dalvik被改写过。Dalvik虚拟机执行的是Dalvik格式的可执行文件(.dex)-该格式经过优化,以将内存好用降到最低。

Dalvik虚拟机 和代码编译

安卓的应用是由Java编写的,而包括HAL在内的Linux的库都是由C/C++编写的,这个落差由Dalvik虚拟机衔接的。当一个应用运行时,进程空间内将包含一个Dalvik虚拟机。Java程序编译为字节码文件,运行在Dalvik虚拟机中。根据Java代码中的要求,Dalvik通过JNI(Java Native Interface)调用底层的C/C++编写的功能。JNI是从Java中调用C/C++模块的接口。由于上层接口的标准化,字节码可以畅通无阻的跨平台运行。

Dalvik虚拟机内部是一个“虚拟”进程空间,有自己的栈和堆,管理代码的运行流程。如果这以“虚拟”进程空间不足,Dalvik内建的垃圾回收(garbage collection)机制会自动清空堆上不再使用的对象。自动的垃圾回收简化了程序员的工作,但速度较慢。手动内存管理效率高,但需要更多的编程,且容易犯错。

Android的4种文件类型Java,class,dex,apk

Class文件------Java编译后的目标文件

不像J2se,java编译成class就可以直接运行,android平台上class文件不能直接在android上运行。 由于Google
使用了自己的Dalvik来运行应用, 所以这里的class也肯定不能在AndroidDalvik的java环境中运行, android
的class文件实际上只是编译过程中的中间目标文件,需要链接成dex文件后才能在dalvik上运行

Dex文件-----Android平台上的可执行文件

Android虚拟机Dalvik支持的字节码文件格式Google在新发布的Android平台上使用了自己的Dalvik虚拟机
来定义, 这种虚拟机执行的并非Java字节码, 而是另一种字节码: dex格式的字节码。在编译Java代码之后,
通过Android平台上的工具可以将Java字节码转换成Dex字节码。虽然Google称Dalvik是为了移动设备定
做的,但是业界很多人认为这是为了规避向sun申请Javalicense。这个DalvikVM针对手机程式/CPU做过最
佳化,可以同时执行许多VM而不会占用太多Resource。

Apk文件-------Android上的安装文件

Apk是Android安装包的扩展名,一个Android安装包包含了与某个Android应用程序相关的所有文件。apk
文件将AndroidManifest.xml文件、应用程序代码(.dex文件)、资源文件和其他文件打成一个压缩包。一个工
程只能打进一个.apk文件。

相关文章: