一、为什么要学习Android内核
做Android应用以来,但是总感觉蒙了一层雾,为什么是activity的生命周期是这样?为什么要分UI线程和其他线程?Android和Linux有什么区别?
我想要知其所以然,而不是天天学习搬砖,语言技术总是在变,程序员总要抓住其中不变的内涵。
因此,Android内核和源码学习之路开始了,既是总结以前看过的Android知识,也是督促自己继续深造。
废话到此,开始!
二、Android的系统架构图
每一个Android学习者总是要先看这张图的,这张图虽然简单,但是每个层次的开发者总能看到不一样的内涵
上图从上往下分为:(1)应用程序层(2)应用程序框架层(3)系统运行库层(4)硬件抽象接口层 (5)Linux内核层。
在开发应用的Android程序员看来,应该最关注第一、二层;更资深一点的程序员眼里应该会关注第三层(NDK开发);大牛级别的Android开发者,比如手机厂商的定制Android系统的人员,则会关注第四层。
其实这张图应该叫做逻辑系统架构图,因为从源代码工程上没有划分层次的说法。
总之,正是应了一千个XXX有一千个XXX的那句话,每个级别的程序员关注的、看到的都不一样。
三、Android的应用程序框架层详解
Android系统使用的是Linux内核,实际上Android只是在Linux内核之外加上了很多Android特有的东西:比如特定硬件的驱动、Android的类库、一些服务、JAVA运行时等等等等。
其中第二层,应用程序框架层是从事Android开发的基础,很多核心应用程序也是通过这一层来实现其核心功能。那么理解这一层对于理解Android系统的设计思想是很有帮助的。如图所示,这一层提供很多服务(不止下面介绍的),解析如下:
(1) ActivityManager(活动管理器): 管理各个应用程序生命周期以及通常的导航回退功能。
(2) WindowManager(窗口管理器):管理所有的窗口程序
(3) ContentProvider(内容提供器):使得不同应用程序之间存取或者分享数据
(4) ViewSystem(视图系统):构建应用程序的基本组件
(5) NotificationManager(通告管理器):使应用程序可以在状态栏中显示提示信息
(6) PackageManager(包管理器) :Android系统内的程序管理
(7)TelephonyManager(电话管理器):管理所有的移动设备通话相关功能
(8)ResourceManager(资源管理器):提供应用程序使用的各种非代码资源,如本地化字符串、图片、布局文件、颜色文件等
(9)LocationManager(位置管理器):提供位置服务
(10)XMPPService(XMPP服务):提供GoogleTalk服务 (可以做消息推送)
注:可能有人问了,为什么我把这些什么什么器叫做服务?其实从两个方面可以解答:
a) Android系统的启动过程中就把这些东西叫做服务;
b)从编程角度来看,你要获得上面一个什么什么器都是用这样的语句(这个是获取窗口,其他的都类似):
WindowManager mManager=(WindowManager)getSystemService(Context.WINDOW_SERVICE);
从语句上来看getSystemService不正是获取服务的意思吗?
四、Android的系统运行库层详解
1、系统库
系统库是应用程序框架的支撑,是连接应用程序框架层与Linux内核层的重要纽带。其主要分为如下几个(还有更多):
(1)SurfaceManager:执行多个应用程序时候,负责管理显示与存取操作间的互动,另外也负责2D绘图与3D绘图进行显示合成。
(2)MediaFramework: 多媒体库,基于PacketVideoOpenCore;支持多种常用的音频、视频格式录制和回放,编码格式包括MPEG4、MP3、H.264、AAC、ARM。
(3)SQLite:存储在本地的小型的关系型数据库引擎
(4)OpenGL|ES:根据OpenGL ES1.0API标准实现的3D绘图函数库
(5)FreeType:提供点阵字与向量字的描绘与显示
(6)WebKit:一套网页浏览器的软件引擎
(7)SGL:底层的2D图形渲染引擎
(8)SSL:在Andorid上通信过程中实现加密
(9)Libc:标准C系统函数库(包含C语言最基本的函数库)
2、Android运行时
Android应用程序时采用Java语言编写,程序在Android运行时中执行,其运行时分为核心库和Dalvik虚拟机两部分。
(1)核心库:核心库提供了Java语言API中的大多数功能,同时也包含了Android的一些核心API,如android.os、android.net、android.media等等。
(2)Dalvik虚拟机:每个Android应用程序都有一个专有的Dalvik进程,并且不是多个程序运行在一个虚拟机中,而是每个Android程序都有一个Dalivik虚拟机的实例,并在该实例中执行。Dalvik虚拟机是一种基于寄存器的Java虚拟机,而不是传统的基于栈的虚拟机,并进行了内存资源使用的优化以及支持多个虚拟机的特点。Dalvik虚拟机中执行的并非编译后的字节码,而是通过转换工具dx将Java字节码转成dex格式的中间码。
五、Android的硬件抽象层HAL
Android的硬件抽象层,简单来说,就是对Linux内核驱动程序的封装,向上提供接口,屏蔽低层的实现细节。
六、Android的Linux内核层
早期的Android采用了Linux 2.3内核,最新的Android 5.0基于Linux 3.1,各大手机厂商订制的Android系统基于的Linux内核就看心情了(小米的是3.3)。
七、小结与下一篇
这一篇主要介绍了Android的层次结构,从宏观上了解系统的组成架构。下一篇将讲解如何获取Android源码,并结合源码详细解析Android系统的启动过程。