5.系统程序库
Android4.3程序库的类型非常多,功能也非常强大。在接下来的内容中,将简要讲解Android4.3源码中的一些常用并且重要的系统程序库的知识。
㈠系统C库
Android系统采用的是一个从BSD继承而来的标准的系统函数库bionic,在源码根目录下有这个文件夹,其目录结构如下所示:
bionic/
|——libc//C库
|——libdl//动态链接库相关
|——libm //数学库
|——libstdc++ //C++实现库
|——libthread_db //线程库
|——linker //连接器相关
|——test //测试相关
㈡媒体库
Android中的媒体库在2.3版之前是由OpenCore实现的,2.3版之后Stragefright被替换了,OpenCore成为新的多媒体的实现库。同时Android自带了一些音视频的管理库,用于管理多媒体的录制,播放,编码和解码等功能。
Android的多媒体程序库的实现代码主要在/frameworks/av/media目录中,其目录结构如下:
frameworks/av/media/
|——common_time //时间相关
|——libeffects //多媒体效果
|——libmedia //多媒体录制,播放
|——libmedia_native //里面只有一个Android。迥,用来编译native文件
|——libmediaplayerservice//多媒体播放服务的实现库
|——libstagefright //Stagefright的实现库
|——mediaserver //跨进程多媒体服务
|——mtp //MTP协议的实现(媒体传输协议)
㈢图层显示库
Android中的图层显示库主要负责对显示子系统的管理,负责图层的渲染,叠加,绘制等功能,提供了2D和3D图层的无缝融合,是整个Android系统显示的“大脑中枢”,其代码在/frameworks/native/services/surfaceflinger/目录下,其目录结构如下所示:
frameworks/native/services/surfaceflinger/
|——DisplayHardware//显示底层相关
|——tests//测试
|——Android.mk//MakeFile文件
|——Barrier.h
|——Client.cpp//显示的客户端实现文件
|——Client.h
|——clz.cpp
|——clz.h
|——DdmConnection.cpp
|——DdmConnection.h
|——DisplayDevice.cpp//显示设备相关
|——DisplayDevice.h
|——EventThread.cpp//消息线程
|——EventThread.h
|——GLExtensions.cpp//OpenGL扩展
|——GLExtensions.h
|——Layer.cpp//图层相关
|——Layer.h
|——LayerBase.cpp//图层基类
|——LayerBase.h
|——LayerDim.cpp//图层相关
|——LayerDim.h
|——LayerScreenshot.cpp//图层相关
|——LayerScreenshot.h
|——MessageQueue.cpp//消息队列
|——MessageQueue.h
|——MODULE_LICENSE_APACHE2//证书
|——SurfaceFlinger.cpp//图层管理者,图层管理的核心类
|——SurfaceFlinger.h
|——SurfaceTextureLayer.cpp//文字图层
|——SurfaceTextureLayer.h
|——Transform.cpp
|——Transform.h
㈣网络引擎库
网络引擎库主要是用来实现Web浏览器的引擎,支持Android的Web浏览器和一个可嵌入的Web视图,这是采用第三方开发的浏览器引擎Webkit实现的,Webkit的代码在/external/webkit/目录下,其目录结构如下所示:
external/webkit/
|——Examples //Webkit的例子
|——LayoutTests//布局测试
|——PerformanceTests//表现测试
|——Source//Webkit源代码
|——Tools//工具
|——WebKitLibraries//Webkit用到的库
|——Android.mk//Makefile
|——bison_check.mk
|——CleanSpec.mk
|——MODULE_LICENSE_LGPL//证书
|——NOTICE
|——WEBKIT_MERGE_REVISION//版本信息
㈤3D图形库
Android中的3D图形渲染是采用OpenGL来实现的,OpenGl是开源的第三方图形渲染库,使用该库可以实现Android中的3D图形硬件加速或者3D图形软件加速功能,是一个非常重要的功能库。从Android 4.3开始,支持最新,最强大的OpenGL ES3.0.其实现代码在/frameworks/native/opengl中,其目录结构如下所示:
frameworks/native/opengl/
|——include //OpenGL中的头文件
|——libagl //在Mac OS上的库
|——libs //OpenGL的接口和实现库
|——specs //OpenGL的文档
|——tests //测试相关
|——tools //工具库
㈥SQLite
SQLite是Android系统自带的一个轻量级关系数据库,其实现源代码已经在网上开源。SQLite的优点是操作方便,运行速度较快,占用资源较少等,比较适合在嵌入式设备上面使用。SQLite是Android系统自带的实现数据库功能的核心库,其代码实现分为Java和C两个部分,Java部分的代码位于/frameworks/base/core/java/android/database,目录结构如下所示:
frameworks/base/core/java/android/database/
|——sqlite//SQLite的框架文件
|——AbstractCursor.java//游标的抽象类
|——AbstractWindowedCursor.java
|——BulkCursorDescriptor.java
|——BulkCursorNative.java
|——BulkCursorToCursorAdaptor.java//游标适配器
|——CharArrayBuffer.java
|——ContentObservable.java
|——ContentObserver.java
|——CrossProcessCursor.java
|——CrossProcessCursorWrapper.java//CrossProcessCursor的封装类
|——Cursor.java//游标实现娄
|——CursorIndexOutOfBoundsException.java//游标出界异常
|——CursorJoiner.java
|——CursorToBulkCursorAdaptor.java//适配器
|——CursorWindow.java//游标窗口
|——CursorWindowAllocationException.java//游标窗口异常
|——CursorWrapper.java//游标封装类
|——DatabaseErrorHandler.java//数据库错误句柄
|——DatabaseUtils.java//数据库工具类
|——DataSetObservable.java
|——DataSetObserver.java
|——DefaultDatabaseErrorHandle.java//默认数据库错误句柄
|——IBulkCursor.java
|——IContentObserver.aidl//aidl用于跨进程通信
|——MatrixCursor.java
|——MergeCursor.java
|——Observable.java
|——package.html
|——SQLException.java//数据库异常
|——StaleDataException.java
Java层的代码主要是实现SQLite的框架和接口的实现,使用户开发应用程序时能很简单地操作数据库,并且捕获数据库异常。
C++层的代码在/external/sqlite路径下,其目录结构如下所示:
external/sqlite/
|——android //Android数据库的一些工具包
|——dist //Android数据库底层实现
从上面Java和C部分的代码目录结构可以看出,SQLite在Android中还是有很重要的地位的,并且在SDK中会有开放的接口让应用程序可以很简单方便地操作数据库,对数据进行存储和删除。
6.系统运行库
众所周知,Android系统折应用层是采用Java开发的,由于Java语言的跨平台特性,Java代码必须运行在虚拟机中。正是因为这个特性,Android系统也自己实现了一个类似JVM但是更适用于嵌入式平台的Java虚拟机,这被称为dalvik。
dalvik功能等同于JVM,为Android平台上的Java代码提供了运行环境,dalvik本身是由C++语言实现的,在源码中的根目录下有dalvik文件夹,里面存放的是dalvik虚拟机的实现代码,其目录结构如下所示:
dalvik/
|——dalvikvm //入口目录
|——dexdump //dex反汇编
|——dexgen //dex生成相关
|——dexlist //dex列表
|——dexopt //与验证和优化
|——docs //文档
|——dvz //zygot相关
|——dx //dx工具,将多个Java转换为dex
|——hit
|——libdex //dex库的实现代码
|——opcode-gen
|——tests //测试相关
|——tools //工具
|——unit-tests //测试相关
|——vm //虚拟机的实现
|——Android.mk //Makefile
|——CleanSpec.mk
|——MODULE_LICENSE_APACHE2
|——NOTICE
|——README.txt
正是因为的上面这些代码实现的Android虚拟机,所以应用程序生成的二进制执行文件能够快速,稳定运行在Android系统上。
7.硬件抽象层
Android的硬件抽象是各种功能的底层实现,理论上,不同的硬件平台会有不同的硬件抽象层实现,这一个层次也是与驱动层和硬件层有紧密联系的,起着承上启下的作用,对上要实现应用程序框架层的接口,对下要实现一些硬件的基本功能,以及调用驱动层的接口。需要注意的是,这一层也是广大OEM厂商改动最大的一层,因为这一层的代码跟终端采用什么样硬件的硬件平台的很大的关系。源码中存放的是硬件抽象层框架的实现代码和一些平台无关的接口的实现。硬件抽象层代码在源码根目录下的hardware文件夹中,其目录结构如下所示:
hardware/
|——libhardware//新机制硬件库
|——libhardware_legacy//旧机制硬件库
|——ril//ril模块相关的底层实现
从上面的目录结构我们可以看出,硬件抽象层中主要是实现了一些底层的硬件库,用来实现应用层框架中的功能,至于其体硬件库中的哪些内容,我们可以继续分其目录结构,例如libhardware目录下的结构为:
hardware/libhardware/
|——include//入口目录
|——modules//dex反汇编
|——|——audio //音频相关底层库
|——|——audio_remote_submix//音频混合相关
|——|——gralloc //帧缓冲
|——|——hwcomposer //音频相关
|——|——local_time //本地时间
|——|——nfc //nfc功能
|——|——nfc-nci //nfc接口
|——|——power //电源
|——|——usbaudio //USB音频设备
|——|——Android.mk //Makefile
|——|——README.android
|——tests //dex生成相关
|——dexlist //dex列表
|——dexopt //验证和优化
|——docs //文档
从上面的目录结构我们可以分析出,libhardware目录主要是Android系统的某些功能的底层实现,包括audio,nfc,power。
libhardware_legacy目录与libhardware大同小异,只是针对旧的实现方式做的一套硬件库,其目录下还有uevent,wifi以及虚拟机的底层实现。这两个目录下的代码一般会由设备厂家根据自身的硬件平台来实现符合Android机制的硬件库。
ril目录下存放的是无线硬件设备与电话的实现,其目录结构如下所示:
hardware/ril/
|——include //头文件
|——libril //libril库
|——mock-ril
|——reference-ril //reference ril库
|——rild //ril守护进程
|——CleanSpec.mk