继上一期探讨了Android的前世此生,这一期一上去大致回顾一下Android系统构架和应用组件。
一、Android系统构架
Android系统的底层构建在Linux系统之上,该平台由操作系统、中间件、用户界面和应用软件4层组成,它采用一种被称为软件叠层(SoftwareStack)的方法进行完善。这些软件叠层结构促使层与层之间互相分离,明晰各层的分工。这些分工保证了层与层之间的低耦合,当上层的层内或层下发生改变时,下层应用程序无须任何改变。
Android的系统构架和其他操作系统一样,采用了分层的构架。从构架图看,Android分为四个层,从高层到低层分别是应用程序层(Applications)、应用程序框架层(ApplicationFramework)、系统运行库层(Libraries和AndroidRuntime)和Linux内核层(LinuxKernel),如右图所示:
01应用程序层
应用程序层是一个核心应用程序的集合,所有安装在手机上的应用程序都属于这一层。该层除了包括系统外置的应用也包括用户自己安装的应用,比如email顾客端,SMS短消息程序,月历,地图,浏览器,联系人管理程序,QQ,陌陌,天猫,美团等。
该层所有的应用程序都是使用Java语言编撰的,这也是本次主要总结整理的内容。
02应用程序框架层
开发人员也可以完全访问核心应用程序所使用的API框架。该应用程序的构架设计简化了组件的重用,任何一个应用程序都可以发布它的功能块而且任何其它的应用程序都可以使用其所发布的功能块(不过得遵守框架的安全性)。同样,该应用程序重用机制也使用户可以便捷的替换程序组件。
隐藏在每位应用前面的是一系列的服务和系统,其中包括:
1)丰富而又可扩充的视图(Views),可以拿来建立应用程序,它包括列表(List)、网格(Grid)、文本框(Text)、按钮(Button),甚至可嵌入web浏览器。
2)内容提供者(ContentProviders),致使应用程序可以访问另一个应用程序的数据(如联系人数据库),或则共享它们自己的数据。
3)资源管理器(ResourceManager),提供非代码资源的访问,如本地字符串、图形、和布局文件(Layoutfiles)。
4)通知管理器(NotificationManager),致使应用程序可以在状态栏中显示自定义的提示信息。
5)活动管理器(ActivityManager),拿来管理应用程序生命周期并提供常用的导航回退功能。
应用程序框架不仅可作为应用程序开发的基础之外,也是软件复用的重要手段,任何一个应用程序都可发布它的功能模块——只要发布时违背了框架的约定,这么其他应用程序就可使用这个功能模块。
03系统运行库层
系统运行库层包含了系统库及Android运行时。
系统库
Android包含一套被不同组件所使用的C/C++库的集合。通常来说,Android应用开发者不能直接调用这套C/C++库集,但可以通过它前面的应用程序框架来调用那些库。
下边列举一些核心库:
1)系统C库:一个从BSD系统派生下来的标准C系统库(libc),而且专门为嵌入式Linux设备调整过。
2)媒体库:基于PacketVideo的OpenCORE,这套媒体库支持播放和录制许多流行的音频和视频格式,以及查看静态图片。主要包括MPEG4、H.264、MP3、AAC、AMR、JPG、PNG等多媒体格式。
3)SurfaceManager:管理对显示子系统的访问,并可以对多个应用程序的2D和3D图层提供无缝整合。
4)LibWebCore:一个全新的Web浏览器引擎,该引擎为Android浏览器提供支持,也为WebView提供支持,WebView完全可以嵌入开发者自己的应用程序中。
5)SQLite:供所有应用程序使用的功能强悍的轻量级关系数据库。
6)OpenGLES:该库可以使用硬件3D加速(假如可用)或则使用高度优化的3D软加速。
7)FreeType:位图(Bitmap)和矢量(Vector)字体显示。
8)SGL:底层的2D图形引擎。
Android运行时(AndroidRuntime)
Android运行时由两部份组成:Android核心库集和ART。其中核心库集提供了Java语言核心库所能使用的绝大部份功能,而虚拟机则负责运行Android应用程序。
Android5.0原先的Android运行时由Dalvik虚拟机和Android核心库集组成,但因为Dalvik虚拟机采用了一种被称为JIT(Just-in-time)的类库进行动态编译并执行,因而造成AndroidApp运行时比较慢;而ART模式则是在用户安装App时进行预编译(Ahead-of-time,简称AOT)的,将原先在程序运行时的编译动作提早到应用安装时,这样促使程序在运行时可以降低动态编译的开支,因而提高AndroidApp的运行效率。
反过来,因为ART须要在安装App时进行AOT处理,因而ART须要占用更多的储存空间,应用安装和系统启动时间会延长不少。
除此之外,ART还支持ARM、x86和MIPS构架,而且能完全兼容64位系统,Android必然会带来更好的用户体验。
04Linux内核层
Android系统主要基于Linux2.6内核开发linux入门,Linux内核层为Android设备的各类硬件提供了底层的驱动,如显示驱动、音频驱动、照相机驱动、蓝牙驱动、电源管理驱动等。
Linux内核也同时作为硬件和软件栈之间的具象层。
二、Dalvik虚拟机和ART模式
01Dalvik虚拟机
通过JavaSE部份的学习,我们晓得JavaSE程序使用的虚拟机叫JavaVirtualMachine,简称JVM。而Android应用其实使用Java语言开发,并且使用的虚拟就是DalvikVirtualMachine,简称DVM。
Dalvik是Google公司自己设计的用于Android平台的虚拟机,它可以简单地完成进程隔离和线程管理,而且可以提升显存的使用效率。每一个Android应用程序在底层就会对应一个独立的Dalvik虚拟机实例,其代码在虚拟机的解析下得以执行。Dalvik经过优化,容许在有限的显存中同时运行多个虚拟机的实例,而且每一个Dalvik应用作为一个独立的Linux进程执行。
好多人都觉得Dalvik虚拟机是一个Java虚拟机,由于Android开发的编程语言恰恰是Java语目,然而这些说法并不确切。Dalvlk虚拟机并不是根据Java虚拟机的规范来实现的,二者不兼容,并且也有好多不同之处。下边通过一个图来进行对比说明,如右图所示。
从上图可以看出,Java虚拟机和Dalvik虚拟机主要有两大区别:一是它们编译后的文件不同;二是它们基于的构架不同。具体如下:
编译后的文件不同
Java虚拟机运行的是.class字节码文件,而Dalvik虚拟机运行的则是其专有的.dex文件。在Java程序中Java类会被翻译成一个或则多个字节码文件(.class)之后打包到.jar文件,然后Java虚拟机会从相应的.class文件和.jar文件中获取相应的字节码。Android程序其实也是使用Java语言进行编程,并且在翻译成.class文件后,都会通过工具将所有的.class文件转换成一个.dex文件,之后Dalvik虚拟机从其中读取指令和数据,最后的.odex是为了在运行过程中进一步增强性能而对.dex文件进行的进一步优化,能推动软件的加载速率和开启速率。
基于的构架不同
Java虚拟机是基于栈的构架,你们晓得基于嵌入式linux的智能手机应用系统研究,栈是一个连续的显存空间,取出和存人的速率比较慢;而Dalvik基于寄存器的构架,寄存器是CPU上的一块缓存,寄存器的存取速率要比从显存中存取的速率快好多,这样就可以按照硬件最大限度地优化设备,更适宜联通设备的使用。
须要说明的是,Android系统下的Dalvik虚拟机默认给每一个应用程序最多分配16MB显存,假如Android加载的资源超过这个值,都会报出OutOfMemoryError异常,因而一定要注意这个问题。
02ART模式
ART模式中文全称为AndroidRuntime,是微软Android4.4系统新增的一种用运行模式。与传统的Dalvik模式不同,ART模式可以实现更为流畅的安卓系统体验,只有在Android4.4以上系统中采用此模式。
在4.4系统之前,Android系统在Linux的底层下打造Dalvik一层的虚拟机,通过其可以更好适应多样的硬件构架,开发者只须要按一套规则进行应用便可,无需由于不同的硬件构架而处理与底层的驱动关系,因而大大提升开发的效率,但由于应用均是运行在Dalvik虚拟机中,因而应用程序每次运行的时侯,一部份代码都须要重新进行编译,这过程须要消耗一定的时间和减少应用的执行效率,最显著的便是拖延了应用的启动时间和减少了运行速率。
ART模式最大的作用就是提高了Android系统流畅度,相比Dalvik模式中出现的耗电快、占用显存大、即使是旗舰机用久了也会卡顿严重等现象,ART模式中这些问题得到了挺好的解决,通过在安装应用程序时,手动对程序进行代码预读取编译,让程序直接编译成机器语言,免去了Dalvik模式要时时转换代码,实现高效率、省电、占用更低的系统显存、手机运行流畅。
三、Android应用组件
Android四大组件分别是:
活动(Activity):用于表现功能。
服务(Service):后台运行服务,不提供界面呈现。
广播接收器(BroadcastReceiver):用于接收广播。
内容提供者(ContentProvider):支持在多个应用中储存和读取数据,相当于数据库。
01Activity
Android中,Activity是所有程序的根本,所有程序的流程都运行在Activity之中,Activity可以算是开发者遇见的最频繁,也是Android当中最基本的模块之一。在Android的程序当中,Activity通常代表手机屏幕的一屏。假如把手机称作一个浏览器,这么Activity就相当于一个网页。在Activity当中可以添加一些Button、Checkbox等控件。可以看见Activity概念和网页的概念相当类似。
通常一个Android应用是由多个Activity组成的。这多个Activity之间可以进行互相跳转,比如,按下一个Button按键后,可能会跳转到其他的Activity。和网页跳转稍为有些不一样的是,Activity之间的跳转有可能返回值,比如,从ActivityA跳转到ActivityB,这么当ActivityB运行结束的时侯,有可能会给ActivityA一个返回值。这样做在好多时侯是相当便捷的。
当打开一个新的屏幕时,之前一个屏幕会被置为暂停状态,而且压入历史堆栈中。用户可以通过回退操作返回到原先打开过的屏幕。可以选择性的移除一些没有必要保留的屏幕,由于Android会把每位应用的开始到当前的每位屏幕保存在堆栈中。
02Service
Service是android系统中的一种组件,它跟Activity的级别差不多,而且他不能自己运行,只能后台运行,但是可以和其他组件进行交互。Service是没有界面的长生命周期的代码。Service是一种程序,它可以运行很长时间,而且它却没有用户界面。
如此说有点沉闷,来看个反例。打开一个音乐播放器的程序,这个时侯倘若上网了,这么,打开Android浏览器,这个时侯其实早已步入了浏览器这个程序,而且,歌曲播放并没有停止,而是在后台继续一首接着一首的播放。虽然这个播放就是由播放音乐的Service进行控制。其实这个播放音乐的Service也可以停止,比如,当播放列表里面的歌曲都结束,或则用户按下了停止音乐播放的快捷键等。
Service可以在和多场合的应用中使用,例如播放多媒体的时侯用户启动了其他Activity这个时侯程序要在后台继续播放,例如检查SD卡上文件的变化,再或则在后台记录地理信息位置的改变等等,其实服务嘛,总是藏在后头的。
03BroadcastReceiver
在Android中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制。而BroadcastReceiver是对发送下来的Broadcast进行过滤接受并响应的一类组件。可以使用BroadcastReceiver来让应用对一个外部的风波作出响应。
这是十分有意思的,比如,当电话外呼这个外部风波到来的时侯,可以借助BroadcastReceiver进行处理。比如,当下载一个程序成功完成的时侯,依然可以借助BroadcastReceiver进行处理。BroadcastReceiver不能生成UI,也就是说对于用户来说不是透明的,用户是看不到的。BroadcastReceiver通过NotificationManager来通知用户这种事情发生了。BroadcastReceiver既可以在AndroidManifest.xml中注册,也可以在运行时的代码中使用Context.registerReceiver()进行注册。只要是注册了,当风波将至的时侯linux文本编辑器,虽然程序没有启动,系统也在须要的时侯启动程序。各类应用还可以通过使用Context.sendBroadcast()将它们自己的IntentBroadcasts广播给其他应用程序。
04ContentProvider
ContentProvider是Android提供的第三方应用数据的访问方案。
在Android中,对数据的保护是很严密的,不仅置于SD卡中的数据,一个应用所持有的数据库、文件等内容,都是不容许其他直接访问的。Android其实不会真的把每位应用都弄成一座孤岛,它为所有应用都打算了一扇窗,这就是ContentProvider。应用想对外提供的数据,可以通过派生ContentProvider类,封装成一枚ContentProvider,每位ContentProvider都用一个uri作为独立的标示基于嵌入式linux的智能手机应用系统研究,形如:content://com.xxxxx。所有东西看着像REST的样子,但实际上,它比REST更为灵活。和REST类似,uri也可以有两种类型,一种是带id的,另一种是列表的,但实现者不须要根据这个模式来做,给id的uri也可以返回列表类型的数据,只要调用者明白,就无妨,不用苛责所谓的REST。
明天就先到这儿,下一期将初步总结分享Android环境搭建,假如有问题欢迎留言一起阐述,共同成长!