Android这一词最先出现在英国诗人利尔亚当在1886年发表的悬疑小说《未来夏娃》中,作者将外表像人类的机器取名为Android,这也就是Android小人名子的来历。Android是基于Linux系统的开源操作系统,是由AndyRubin于2003年10月在日本加洲创建,2005年8月17日,Google高调竞购了组建仅22个月的高科技企业Android及其团队。AndyRubin成为Google公司工程部总工裁,继续负责Android项目。2007年11月,Google与84家硬件制造商、软件开发商及铁通运营商成立开放手机联盟共同研制改良Android系统。随即Google以Apache开源许可证的授权形式,发布了Android的源代码。2008年的时侯发布了第一部Android智能手机,此后Android不断发展更新,抢占了全球大部份的手机市场。
Linux
既然Android是基于Linux开发的操作系统,这么是不是可以理解成Android是Linux一个发行版本,如同Centos,RedHat,Ubuntu一样是诸多Linux发行版本中的一个。假如是这样中国linux,这么同为Linux发行版的Centos,Ubuntu等为何没能成为联通端的操作系统,而Android却这么受人追捧。最后一个问题,Android是基于Linux的操作系统,为何没有人用C/C++写应用运行于Android之上,而是写Java应用。要想得到这个问题的答案,我们要先弄清楚几个概念。
Linux,Unix与GNU渊源
Unix:Unix操作系统是在1960年代末,由当时就职于日本贝尔实验室的肯·汤普逊(KennethThompson)和丹尼斯·里奇(DennisRitchie)发明的。这两个人都是计算机领域的传奇。她们不仅发明了Unix系统之外,还一起发明了C语言。之后1973年她们用C语言对Unix系统进行了重新编撰。
GNU计划:Unix系统只能运行在小型的计算机上,但是价钱十分高昂。小公司以及诸多的软件爱好者根本用不起。为了谴责这种大厂,自由软件之父理查德.斯托曼发起了自由软件运动,吹来了共产主义的号角(发起了GUN运动),并发布了软件界的共产主义宣言(GPL合同)linux程序移植到android,但是这一运动得到了好多人的认同。GNU是“GNUisNotUnix”的递归简写,它的目的就是做出Unix的代替品,让软件工程师、技术爱好者等个人都能开发和使用免费开源的系统和软件。到了1990年,GNU计划早已开发出的软件包括了一个功能强悍的文字编辑器Emacs、C语言编译器GCC以及大部份UNIX系统的程序库和工具。惟一仍然没有完成的重要组件,就是操作系统的内核.有意思的是,而那种时侯Linux还没有诞生呢,所以斯托曼心中苦啊,就在你们渐渐丧失信心的时侯,1991年LinusTorvalds带着他的Linux闪耀登场了,也给GUN运动画了一个完美的句号。
Linux的诞生:
美国人托瓦兹(LinusTorvalds)在学习计算机操作系统时,为了能在家里的PC机上使用与中学一样的操作系统,开始了编撰类似UNIX内核的工作。其导师做了一个简单的Minix操作系统,但他认为实在太难用了,于是也决定自己开发一个操作系统,1991年9月他发布了第一版Linux操作系统的内核(高手一言不合就写操作系统。。)
Linux与Linux内核
Linux与Linux内核虽然不太一样的,Linux的内核是操作系统的核心,包括设备驱动、文件系统、进程管理、网络通讯等。并且操作系统光有内核,用户是没有办法操作的,所以好多厂商在Linux社区就在内核之上开发了好多工具,例如我们常用的GNome桌面,FireFox浏览器、GIMP图片编辑器等等。Linux内核和那些应用一起打包后就被叫做Linux发行版本。Linux有好多的发行版本,比如RedHat,CentOS等等。
所以我们常说的Linux有两个含意
Linux内核:这个严格来说应当叫GNU/Linux,由于它是GNU计划的一部份
Linux发行版:例如Debian、Ubuntu、Mint、RedHat等等
Android与Linux的关系
Android实际上用到的是Linux的内核。由于Linux本身是开源的,所以微软的工程师们选择了在Linux内核基础之上做剪裁订制,这样她们就不须要从头开始来开发一个全新的系统。使用Linux内核、包含一套开发框架、各种运行库(Media、SQLite、OpenGLES等)、Dalvik虚拟机,提供了AndroidSDK,包含丰富的工具集(有调试器、库、手机仿真器、文档、示例代码和教程),还有AndroidDevelopmentTools(ADT)
Android操作系统的构架
从上图中可以清楚的看出
最下层是面向用户的Application(应用程序),包括电话程序、联系人程序、浏览器、地图、Email等。
下边是ApplicationFramework,为开发人员提供访问核心组件所使用的API,包含了丰富的View组件、ContentProviders(内容提供器)拿来访问另一个应用程序的数据(如联系人),或则共享它们自己的数据、ResourceManager(资源管理器)提供对资源的访问(如本地字符串,图形,布局文件等)、NotificationManager(通知管理器)、ActivityManager(活动管理器)等等。
第三层是系统运行库,包含程序库和Android运行库。
核心泛型中包含了一些C/C++库,通过应用框架为开发者提供服务,如:Libc(从BSD承继来的标准C系统函数库)、媒体库、SGL(2D图形引擎)、3Dlibraries(基于OpenGLES1.0APIs实现linux程序移植到android,可以使用硬件或软件3D加速)、SQLite(数据库引擎)等等
Android运行时库包括一个核心库,该核心库提供了JAVA编程语言核心库的大多数功能。每一个Android应用程序都在自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。Dalivk被设计成一个设备可以同时高效地运行多个虚拟系统。Dalivk虚拟机执行.dex文件(Dalvik的可执行文件),该格式文件针对小显存使用做了优化。同时虚拟机是基于寄存器的,所有类都经由Java编译器编译,之后通过SDK中的dx工具转化成.dex格式,由虚拟机执行。Dalivik虚拟机依赖于linux内核的一些功能,例如线程机制和底层显存管理机制。
接出来一层是HardwareAbstractLayer(硬件具象层),你在初期的构架图中看不到这一层。2008年linux启动盘制作工具,PatrickBrady就提出了AndroidHAL构架,它是为了把Linuxkernel与下层框架完全隔开,让Android不至于过度依赖Linuxkernel,可以让AndroidFramework的开发能在不考虑驱动程序的前提下进行。HAL仍以*.so方式存在,Stub向HAL“提供”操作函数,Runtime则是向HAL取得特定模块的操作(operations)。2010年2月3日,Linux内核的开发者,将Android的驱动程序从Linux内核Stagingtree(状态树)上除去,自此,Android与Linux核心开发就分开了。
最下边一层是Linux核心,Android的核心系统依赖于Linux内核,如安全性、内存管理、进程管理、网络合同栈和驱动模型。Android的Linuxkernel也不是GNU/Linux。Android将驱动程序移到userspace,致使Linuxdriver与Linuxkernel分开。
说了如此多对安卓系统有了一定了解后,对于安卓和Linux的区别就好理解了,直接上图
Linux内核是用C语言开发的,安卓在Linux的内核之上用C/C++开发了Dalvik,后来改叫AndroidRunTime,虽然本身就是安卓的Java虚拟机。我们做的安卓应用都要用Java开发,运行在ART前面。Linux其他发行版本也可以用Java开发应用,只要运行在Linux的Java虚拟机上就可以了。除此之外我们也可以在Linux内核之上使用其他框架开发,例如GTK框架的Gnome、QT框架的LXQT,这种跟ART都是一个层次的东西。所以我认为安卓和其他Linux发行版本本质上没有太大区别,只不过安卓对Linux的内核做了一些裁减,但是在前面跑了一个Dalvik/ART,而其他Linux发行版本跑了好多个“Dalvik/ART”而已。
安卓系统上可以直接运行C/C++写的App吗?
可以的,实际上这个问题有点蠢,由于决定程序能不能运行不是由它的开发语言决定的,任何语言最终就会被编译成二补码代码,所以只要编译器能编译成相关CPU和操作系统支持的代码,这么就可以在安卓上直接跑C写的App。所以也可以用C/C++开发App。
既然安卓是Linux内核,这么可以在Linux桌面上运行安卓的应用吗?
由于其他Linux发行版本也没有Dalvik/ART,所以安卓的应用在Linux桌面上不能直接运行。不过我们只须要将Dalvik/ART移植到Linux桌面环境就可以了,只不过有些功能硬件不支持,比如通话功能,拍照机功能等。正是基于这个原理,市场上有好多安卓手机模拟器,除了可以用在Linux桌面,还可以用在Windows以及Mac上。
总结
安卓的操作系统核心是在Linux内核上做了一些裁减和订制,但是在内核之上运行了一个Dalvik/ART虚拟机,所有的应用必须运行在这个虚拟机上,所以安卓的应用都是用Java来开发的。在Linux的发行版本中,我们可以使用Java虚拟机,也可以使用其他框架,例如GTK,QT等等,它们编译下来的二补码代码可以直接运行在Linux内核上,它们和Dalvik/ART是一个层次上的东西,所以安卓和Linux的发行版本本质上是一样的。