安卓第二夜 有趣的架构

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!

 

学习安卓的架构,是从操作系统的角度理解安卓。安卓使用Linux内核,但安卓的架构又与常见的Linux系统有很大的区别。我们先来回顾一下传统的Linux架构,再来看安卓的变化。

 

Linux系统架构

先来看常见的Linux系统架构,你可以参考Linux的架构

 

 

内核是系统的底层。Linux开机后,内核即启动,并存活于属于自己的内存空间,即内核空间(kernel space)。内核的一大功能是和硬件通信。内核中包含各种驱动程序,这些驱动程序既能实现底层的硬件读写操作,又包含硬件使用逻辑。比如一台打印机的驱动,会把打印指令放在内存中的A位置,把打印数据放在内存中的B位置。打印机读取指令后,会从B位置取得数据打印。在内核上层,驱动程序的功能被抽象为函数调用,比如printx(data)。这个函数调用隐藏了许多细节,比如如何执行读写,以及A和B的具体位置。

除了抽象硬件外,内核还维护着Linux的许多重要运行机制,比如虚拟内存、调度器、信号以及进程间通信(IPC)。内核的功能接口是系统调用(system call)函数。

 

用户使用C或者C++编写的程序,将编译成机器码,运行成为一个进程(process)。每个进程都会有一个自己的进程空间。进程空间存活于内核空间之外的用户空间(user space)。进程空间中包含程序的代码和数据。不同进程的进程空间相互独立。进程间如果想要相互交流,需要借用特殊的进程间通信(IPC)机制。进程空间中有栈(stack)和堆(heap)。当执行到新的函数调用时,栈顶会增加一帧(stack frame),用于记录该函数的数据和返回地址。当函数执行完成时,该帧会弹出,并根据返回地址接着执行母程序的指令。堆中的空间由程序自由分配。你可以进一步参考Linux从程序到进程

一个进程空间

 

Linux的程序大多是C和C++编写。代码被编译为机器码,以便计算机理解。常用的代码被编译成库(library)。程序员可以从自己的程序中调用库函数,来重复利用已有代码。程序中调用库函数时,库中包含的机器代码会加载入程序对应的进程空间。

 

 

Android架构

我们现在来看看安卓的架构。Android的底层使用的是Linux内核。在用户空间中,每个应用也会运行为一个进程。但安卓细节方面和传统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)机制会自动清空堆上不再使用的对象。自动的垃圾回收简化了程序员的工作,但速度较慢。手动内存管理效率高,但需要更多的编程,且容易犯错。垃圾回收的具体原理可参考Java内存管理与垃圾回收。 

 

当然,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语言本身的逻辑,这就是安卓程序员战斗着的世界了。我会在以后的文章中,继续深入这个战场。

 

多谢微博 @文艺复兴记 指导我Dalvik的相关内容。下面资料也帮助了我理解:

http://sujaiantony.wordpress.com/2012/06/25/an-android-101-hardware-and-hal/

 

 

总结

HAL

Dalvik

Core Library

Android Framework

 

欢迎继续阅读“Java快速教程”系列文章

时间: 2024-09-11 15:07:54

安卓第二夜 有趣的架构的相关文章

10天学安卓-第二天

原文:10天学安卓-第二天 继续我们的学习. 相信我,第一天的工作是最为重要的,通过这些工作,我们把开发安卓所必须的环境.基础条件都配置好了,相信肯定遇到了很多问题,不过,根据我的经验,您会很快解决这些问题的.在第一天的最后,我们终于运行了第一个应用->"Hello, world". 理论知识 下面我们学习一些理论知识,了解一下安卓系统的架构.组件,有了一些基础知识,才不会感觉迷惑. 先看下整个项目的目录,每个目录都有特定的作用,分别如下: src目录,存放源代码文件. gen目

安卓第一夜 第一个应用

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢!   承接"Java快速教程",我将开始写安卓相关的文章.   安卓(Android)开发主要使用Java语言.Java语言基础,是安卓开发的第一道门槛.再者,一个好的安卓应用往往配合有远程服务器.这两方面,可以参考Java快速教程中对Java语言和Play框架的讲解.安卓开发还需要其它技术的合作,包括操作系统.互联网.图形化界面.数据库等.可以说,移动开发是一个现实的战

安卓第九夜 狂风

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢!   我们经常需要在安卓应用中包含简易的网页显示功能.我将在这一讲中实现网页的显示. <狂风>,来自小Willem,荷兰画派黄金时代的作品.作为当时海上马车夫的荷兰,对航海题材的画情有独钟. 这种倾斜的船身,是当时的画家常用的手法,用于表现很强的风.   描述 上一讲实现了一个类别条目页面.现在,我希望点击某个类别后,能再次以条目的方式显示所有的联系人.在这个新的条目页面中,点击

通向架构师的道路 第二十六天 漫谈架构与设计文档的写作技巧

前言: 这篇是一篇番外篇,没有太多代码与逻辑,完全是一种"软"技巧,但是它对于你如何成为一名合构的架构设 计人员很重要. 在此要澄清一点,架构师本身也是"程序员",不是光动嘴皮子的家伙们,如果你不是一名程序虽出身 那你根本谈不上也不可能成为一名架构师. 那么架构师还有哪些是作为一名程序员来说不具备的呢? 其中有一项 能力就叫做"文档写作能力". 一.Soft Skill与Hard Skill 作为一名架构师除了是一名资深的程序员外,它还 必须具有

Java快速教程

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢!      Java是面向对象语言.这门语言其实相当年轻,于1995年才出现,由Sun公司出品.James Gosling领导了Java的项目小组.该项目的最初只想为家电设计一门容易移植的语言.然而,在获得了Netscape浏览器支持后,Java快速推广,应用广泛. Java受到C和C++的强烈影响.Java与C++相近,都是静态类型,但移除了C++中容易出错的一些特征,比如指针和

安卓第五夜 维纳斯的诞生

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢!   之前各讲中,分别讲解了安卓的开发环境.架构和基本概念.从这一讲开始,我将制作一个简单的应用,并通过逐步升级它的功能,连带出安卓开发的多个情境. <维纳斯的诞生>是文艺复兴早期名画.相传美神维纳斯从海的泡沫中诞生,波提切利用大胆的笔触描绘这一古典神话.画面洋溢着对人体和美的热爱.如果在中世纪或者西班牙宗教审判时期,这幅画足够波提切利上火刑架了.    任务描述 我将制作一个简

微服务:真正的架构模式

本文讲的是微服务:真正的架构模式[编者的话]本文来自Medium,通过比较CRUD app和数据流app两种应用类型的微服务化探索来向听众介绍微服务. 简介 微服务的神秘和背后的知识令我着迷.微服务作为概念,它属于现代最有趣的架构之一.微服务应用广泛,涉及不同的使用场景.但也有很多地方模糊不清,难以定论. 人们在讨论微服务时,我会努力理解他们的真实意图.尽管在上一次演讲中我分享了对微服务的认识,但我很清楚其它公司和我们使用的架构是不一样的.最近我询问了一位同行,了解到他们部署微服务的方式(和我)

架构师入门初步

通向架构师的道路 第一天 Apache整合Tomcat 通向架构师的道路 第二天 apache tomcat https应用 通向架构师的道路 第三天 apache性能调优 通向架构师的道路 第四天 Tomcat性能调优-让小猫飞奔 通向架构师的道路 第五天 tomcat集群-群猫乱舞 通向架构师的道路 第六天 漫谈基于数据库的权限系统的设计 通向架构师的道路 第七天 漫谈使用ThreadLocal改进你的层次的划分 通向架构师的道路 第八天 weblogic与apache的整合与调优 通向架构

交互设计师怎样理解信息架构?

  今天分享一篇交互设计高级教程,关于产品信息架构的思考,这方面是交互设计师成长的一个关键点,也是交互设计大局观的锤炼基石,文章很有深度,值得用心学习. 这篇适合交互设计或者对交互设计感兴趣的小伙伴们看.所以我就不解释信息架构是什么了.今天写一下产品信息架构的思考. 任何产品都有信息架构,或繁杂或简单.在文中讨论的时候,我大致把信息架构分为两种来例证.一种是比较简单的信息架构,例如大多ToC产品,微信.QQ音乐.腾讯视频等;一种是比较复杂的信息架构,例如大多ToB产品,运维类产品.客户关系管理系