您的位置:首页 > 运维架构 > 网站架构

《Android开发精要》读书笔记——Android的系统架构

2016-02-29 17:05 435 查看

1. 概况

1.1 按照功能结构和面向人群进行划分

应用部分:包含在Android设备上运行的所有应用,它们是Android系统中直接面向用户的部分。

核心部分:Android系统中核心的功能实现,包括应用框架、核心类库等,每个Android应用的开发者,都是在此基础上进行应用开发的。

底层部分:主要指Android寄宿的linux操作系统及相关驱动。通常来说,只有硬件厂商和从事Android移植的开发者,才会基于此来进行开发。

1.2 实际架构模型层次

应用层

Android的应用都是基于java语言来开发的。但在很多应用(尤其是游戏)中,需要进行大规模的运算和图形处理,以及使用开源c/c++类库。因此在Android开发中,开发者可以使用c/c++来实现底层模块,并添加JNI(Java Native Interface)接口与上层java实现交互,然后利用Android提供的交叉编译工具生成类库并添加到应用中。

但在Android上,开发者通常只能使用c/c++编写功能类库,而不是整个应用。这是因为,诸如界面绘制、进程调度等核心机制是部署在框架层并通过java来实现的,应用只有按照它们规定的模式去编写特定的java模块和配置信息,才能被识别、加载和执行。

框架层

框架层由多个系统服务(System Service)共同组成,包括组件管理服务、窗口管理服务、地理信息服务、电源管理服务、通话管理服务,等等。所有服务都寄宿在系统核心进程(System Core Process)中,在运行时,每个服务都占据一个独立的线程,彼此通过进程间的通信机制(IPC)发送消息和传递数据。

应用层中的应用,时刻都在于这些系统服务打交道。每一次构造窗口、处理用户交互事件、绘制界面、获得当前地理信息、了解设备信息等操作,都是在各个系统服务的支持下实现的。

对于开发者而言,框架层最直观的体现就是SDK,它通过一系列的java功能模块,来实现应用所需的功能。

从系统设计的角度来看,Android期望框架层是所有应用运行的核心,参与到应用层的每一次操作中,并进行全局统筹。Android应用的最大特征是基于组件的设计方式。每个应用都由若干个组件构成,组件和组件之间并不会建立通信信道,而是通过框架层的系统服务,集中地调度和传递消息。这样的设计方式相当于增加了一个中间层,该层了解所有组件的状况,可以更只能地进行协调,从而提升了整个系统的灵活性。

运行时

和所有的Java程序运行平台一样,为了实现Java程序在运行阶段的二次编译,Android为它们提供了运行时(Runtime)的支撑。

Android的运行时由java核心类库和Java虚拟机Dalvik共同构成。

Java核心类库涵盖了Android框架层和应用程序所要用到的基础Java库,包括Java对象库、文件管理库、网络通信库,等等。

Dalvik是为Android量身打造的Java虚拟机,负责动态解析执行应用、分配空间、管理对象生命周期等工作。

如果说框架层是整个Android的大脑,决定了Android应用的设计特征,那么Dalvik就是Android的心脏,为Android的应用提供动力,决定了它们的执行效率。

核心类库

对于框架层而言,核心类库就是它的“贤内助”。每一次Android系统升级,能看到的都是框架层SDK的变迁,增加了新的功能,提供了新的接口。而在这些新功能的背后,核心类库都是居功至伟。

核心类库由一系列的二进制动态库共同构成,通常使用c/c++进行开发,与框架层的系统服务相比,核心类库不能独立运行于线程中,而需要被系统服务加载到其进程空间里,通过类库提供的JNI接口进行调用。

核心类库的来源主要有两种,一种是系统原生类库,Android为了提高框架层的执行效率,使用C/C++来实现它的一些性能关键模块,如:资源文件管理模块,基础算法库,等等。而另一种则是第三方类库,大部分都是对优秀开源项目的移植,它们是Android能够提供丰富功能的重要保障,如:Android的多媒体处理,依赖于开源项目OpenCORE的支持;浏览器空间的核心实现,是从Webkit移植而来;而数据库功能,则是得益于Sqlite。Android会为所有移植的第三方类库封装一层JNI接口,以供框架层调用。

为了帮助游戏和图形图像处理等领域的开发者搭建更高效的应用,Android将数学函数库、OpenGL库等核心类库以NDK的形式提供给开发者,开发者可以基于NDK更高效地构建算法,进行图形图像绘制。

硬件抽象层和linux内核

Android系统并不是从零开始设计的,而是搭建在Linux内核之上。

狭义的Android系统,主要指的是Linux内核以上的各层,从运行的角度来看,它们只是运行在linux系统上的一些进程,并不是完整的系统,离开了linux的支撑,就像鱼儿离开了水一样,无法运行。

Linux至于Android最大的价值,便是其强大的可移植性。Linux可以运行在各式各样的芯片架构和硬件环境下,而依托于它的Android系统,也便有了强大的可移植性。

2. Android的核心功能模块

了解Android的核心功能模块,可以帮助我们对它的能力有整体上的认识,进而在应用开发之前可以更好地评估技术上的可能性和风险性。

界面框架

数据本地存储

Android本地数据存储的最大特点是数据的私有化。

每个应用的配置信息和数据库文件等数据,都是其私有的,其他应用没有权限进行读写,从而保证了应用数据的安全性。

而对于如何将其数据分享给其他应用,一个策略是构造一个数据源组件,其他应用的组件可以通过数据源组件的接口访问它所提供的数据;而另一个常用的策略是将数据放入扩展存储设备(通常是SD卡等扩展存储卡)中,在该存储设备中的数据,可以被所有应用共同访问。

网络通信

在Android中,系统会负责底层网络的连接和管理,开发者可以直接通过HTTP或Socket与远端服务器建立连接,而不需要关心是通过GPRS/EDGE/3G/wifi建立的。

Android不仅支持点到端的连接,同样还支持点到点的蓝牙连接、NFC连接等。

地理信息

Android对于地理信息获取的支持十分强大,不仅可以基于GPS定位,还可以通过网络利用基站信息进行定位。

基站定位的精度要比GPS低一些,通常在数十米到数百米之间,但它的适应能力更强,只要有移动信号和网络连接,便可以进行定位,而不像GPS那样会受到周围建筑的影响。

图形和多媒体处理

Android的音视频处理主要依托于开源的OpenCORE项目,这是一个基于C/C++实现的音视频处理库,放在Android的核心类库层,可以进行多种格式文件的编解码及流媒体处理。

对于大多数图形处理的开发者而言,图形学知识和OpenGL的使用才是重点,具体的开发平台并不会成为他们的桎梏。

3. Android的架构特征和设计思想

平台的设计思想决定了整个平台的架构和功能设计。

平台开放性

在底层,Android假设在Linux之上。

在上层,Android为应用提供了很多能够增强兼容性的机制,比如:基于资源目录的应用资源体系,用于适配不同的屏幕。

基于组件的应用设计

Android的应用是高度组件化的,就像搭建积木,开发者需要依照Android规范,编写一个个独立的组件,然后通过配置文件对每个组件的需求和能力进行描述,Android系统会统一调度这些组件。

这就意味着,应用中的某一项功能,可能是由来自很多应用的若干组件共同完成的,各个Android应用,只有明确的组件边界,而不再有明确的进程边界和应用边界。

正是这种组件化的设计思想,衍生出了很多相关的设计,比如基于意图(Intent)的通信模式、进程托管、组件的生命周期,等等。

将这些设计单独独立出来看会让人感觉有些莫名其妙,但站在组件化的角度来思考,却都是合情合理。

对于开发者而言,需要充分理解基于组件化的应用设计模式,根据Android的机制,合理地管理应用中的数据,控制好对象的生命周期,并充分利用组件化带来的灵活性和可复用性。

参考:《Android开发精要》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: