• Android独特的架构:HAL与Dalvik虚拟机

    深入一点了解Android
    服务器君一共花费 82.788 ms 进行了 3 次数据库查询,努力地为您提供了这个页面。
    广告很萌的

    从Android架构图看开发所需的知识点 里,我们贴了Android的架构图,很笼统的一个图,安卓细节方面和传统Linux差别很大,我们这里还要再展开说明。Android的底层使用的是Linux内核。在用户空间中,每个应用也会运行为一个进程。

    我们现在来看看安卓的架构。

    HAL

    安卓驱动硬件的方式与Linux不尽相同。传统Linux的驱动完全存活于内核空间。而Android则在内核外部增加了硬件抽象层(HAL, Hardware Abstraction Layer),把一部分驱动功能放到HAL层中。

    你或许会奇怪,安卓为什么费尽麻烦增加一个HAL呢?答案很简单,为了保护源代码。Linux内核采用了GPL协议,所以硬件生产商想要支持Linux系统,必须遵照GPL协议公开硬件驱动的源代码。但这些源代码中包含有许多硬件的设计信息,牵涉到硬件生产商的核心利益。而增加了HAL层之后,硬件厂商就不需要开放所有的驱动代码了。

    我们来看看HAL的具体工作方式。

    安卓的HAL存活在用户空间,它与内核驱动通信。但HAL是个“空壳”,安卓会根据需要,加载不同的动态库,比如调用计算机时,载入libprinter.so。这个动态库是由硬件厂商提供的。比如上面的打印机,硬件厂商可以把读写功能做成驱动。而“指令写入位置A、数据写入位置B”这样的高层逻辑,则编译成库文件(.so)。当我们使用打印机打印时,我们将打印需求和数据发送给HAL。HAL加载对应的动态库,通过内核驱动的读写功能,将指令写入打印机的内存位置A,数据写入位置B。打印机预装的程序从位置A读到打印指令,就会从位置B读取数据,实现打印。这样,HAL实际上把部分驱动功能放入到动态库中,内核中的驱动只保留最基本的读写操作功能。部分驱动功能从内核空间转移到了用户空间。由于高层逻辑是编译好的.so文件,打印机厂商不用担心如指令位置A、数据位置B这样的信息泄露。

    左为Linux,右为安卓HAL

    安卓的HAL模块是从Linux内核导出的,所以源代码公开。HAL是Apache协议,并不要求它的配套程序,如硬件驱动的源码公开。由于这些库函数没有直接调用内核,所以不需要释放源代码。通过HAL层,安卓保护了硬件厂商的商业利益,鼓励了硬件厂商对安卓系统的支持。

    当然,Linux开发小组对此很不高兴,把安卓的开发分支从Linux内核中删除。

    Dalvik虚拟机

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

    Dalvik VM

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

    当然,Oracle不高兴,认为Dalvik是对JVM赤裸裸的抄袭。

    Core Library和Android Framework

    Android程序员的主要工作是编写Dalvik上运行的Java程序。Google提供了核心类库(Java core library),它包括Java的常用类库,如:

    • java.lang
    • java.util
    • java.math
    • java.net
    • ...

    这些类库的API,与Oracle的官方API相同,所以你可以按照同样的方法调用。

    核心类库中还包括Dalvik虚拟机的调用接口:

    • dalvik.annotation
    • dalvik.bytecode
    • dalvik.system

    安卓程序员还可以调用一些针对安卓的类库,即安卓框架(Android Framework)。这些类库对应安卓的特定功能。通过它们,我们可以操纵安卓上的各个功能模块,从触屏到GPS,从视图元素到数据库。如:

    • android.database
    • android.bluetooth
    • android.gesture
    • ...

    安卓相关的类库列表

    核心类库和安卓框架是安卓程序员的左膀右臂。再加上Java语言本身的逻辑,这就是安卓程序员战斗着的世界了。我会在以后的文章中,继续深入这个战场。

更多 推荐条目

Welcome to NowaMagic Academy!

现代魔法 推荐于 2013-02-27 10:23   

本章最新发布
随机专题
  1. [Python程序设计] urls.py设置技巧 8 个条目
  2. [PHP程序设计] Nginx基本操作释疑 7 个条目
  3. [PHP程序设计] 对输入文件类型的检测 1 个条目
  4. [PHP程序设计] PHP数组探索 4 个条目
  5. [Python程序设计] Django数据库模型 6 个条目
  6. [移动开发] Android 开发调试工具 ADB 3 个条目
  7. [智力开发与知识管理] 学习编程为什么没会这么难? 7 个条目
  8. [JavaScript程序设计] Web实时通信技术名词解析 5 个条目
  9. [软件工程与项目管理] 浏览器的CSS解析 7 个条目
  10. [Linux操作系统] CentOS上使用EPEL Repository 2 个条目
  11. [搜索引擎优化] 与百度权重有关的信息 2 个条目
  12. [软件工程与项目管理] 浏览器初步介绍 8 个条目
窗口 -- [博客]