• 在线客服

  • 扫描二维码
    下载博学谷APP

  • 扫描二维码
    关注博学谷微信公众号

  • 意见反馈

原创 Android 系统架构的演变历程

发布时间:2019-07-25 19:14:01 浏览 7204 来源:博学谷资讯 作者:照照

    Android是一种以LinuxJAVA为基础的开放源代码操作系统。Android分为应用层、应用框架层、系统运行库层和Linux内核层。今天大家一起来大致回顾一下Android 系统架构的演变历程。

     

    Android 系统架构的演变历程

     

    一、androidlinux内核

     

    Android是基于Linux内核的操作系统,但是它与Linux之间还是有很大的差别,比如AndroidLinux内核的基础上添加了自己所特有的驱动程序。Android为什么会选择Linux?

     

    1、强大的内存管理和进程管理方案

     

    2、基于权限的安全模式

     

    3、支持共享库

     

    4、经过认证的驱动模型

     

    5Linux本身就是开源项目

     

    Androidlinux系统的改动主要有

    1)它没有glibc支持

     

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

     

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

     

    Android并没有完全照搬Liunx系统的内核,除了修正部分LiunxBug之外,还增加了不少内容,比如:它基于ARM构架增加的Gold-Fish平台,以及yaffs2 FLASH文件系统(如果学习了嵌入式的话就会知道yaffs2 FLASH文件系统已经在基于linux的很多嵌入式设备上采用了,技术已经非常成熟)等。它没有本地基于X服务的窗口系统。什么是本地窗口系统呢?本地窗口系统是指GNU/Linux上的X窗口系统,或者Mac OX XQuartz等。不同的操作系统的窗口系统可能不一样,Android并没有使用(也不需要使用)LinuxX窗口系统。

     

    3Android专有的驱动程序

     

    除了上面这些不同点之外,最重要的是,为了突出android特性,支持android设备,Android还对Linux设备驱动进行了增强,主要如下所示。

     

    aAndroid Binder 基于OpenBinder框架的一个驱动,用于提供 Android平台的进程间通信(InterProcessCommunicationIPC)功能。源代码位于drivers/staging/android/binder.c

     

    bAndroid电源管理(PM) 一个基于标准Linux电源管理系统的轻量级Android电源管理驱动,针对嵌入式设备做了很多优化。源代码位于:

     

    kernel/power/earlysuspend.c

     

    kernel/power/consoleearlysuspend.c

     

    kernel/power/fbearlysuspend.c

     

    kernel/power/wakelock.c

     

    kernel/power/userwakelock.c

     

    c、低内存管理器(Low Memory Killer) Linux的标准的OOM(Out Of Memory)机制更加灵活,它可以根据需要杀死进程以释放需要的内存。源代码位于 drivers/staging/ android/lowmemorykiller.c

     

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

     

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

     

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

     

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

     

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

     

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

     

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

     

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

     

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

     

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

     

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

     

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

     

    4、应用框架层(application framework):这一层主要提供构建应用程序时可能用到的各种APIAndroid自带的一些核心应用就是使用这些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)机制会自动清空堆上不再使用的对象。自动的垃圾回收简化了程序员的工作,但速度较慢。手动内存管理效率高,但需要更多的编程,且容易犯错。

     

    Android4种文件类型Java,class,dex,apk

     

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

     

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

     

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

     

    以上就是Android系统架构的演变历程,大家都了解了吗?

     

    申请免费试学名额    

在职想转行提升,担心学不会?根据个人情况规划学习路线,闯关式自适应学习模式保证学习效果
讲师一对一辅导,在线答疑解惑,指导就业!

上一篇: 黑马在线培训多少钱?博学谷IT培训课程怎么样? 下一篇: 详解JDBC的运行过程

相关推荐 更多

热门文章

  • 前端是什么
  • 前端开发的工作职责
  • 前端开发需要会什么?先掌握这三大核心关键技术
  • 前端开发的工作方向有哪些?
  • 简历加分-4步写出HR想要的简历
  • 程序员如何突击面试?两大招带你拿下面试官
  • 程序员面试技巧
  • 架构师的厉害之处竟然是这……
  • 架构师书籍推荐
  • 懂了这些,才能成为架构师
  • 查看更多

扫描二维码,了解更多信息

博学谷二维码