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开发精要》

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

  1. Android开发艺术探索读书笔记(一)

    首先向各位严重推荐主席这本书<Android开发艺术探索>. 再感谢主席邀请写这篇读书笔记 + 书评.书已经完整的翻完一遍了,但是还没有细致的品读并run代码,最近有时间正好系统的把整本书 ...

  2. Android开发艺术探索 读书笔记

    啥也不说了,@主席的<Android开发艺术探索>真是业界良心之作,不得不看!感谢主席,膜拜主席!主席主席,我要跟你生猴子!(>^ω^<) 读书笔记中若有任何问题请留言告知,谢 ...

  3. 张绍文android开发高手课读书笔记1

    本系列博文 基于是前微信高级工程师张绍文专栏 <Android开发高手课>的读书笔记. 文章所写内容是本人读完的感悟,需要原文的朋友请自行购买. Android的开发前景如何 移动互联网发 ...

  4. Android 开发艺术探索 - 读书笔记目录

    仅作为读书笔记使用,建议阅读原书. 书中代码部分已和现版本不符,建议对比最新版本学习. 读了这本书,越发认识到和大佬们的差距.嗯,加油吧. 过去の自分が今仆の土台となる 第 1 章 - Activit ...

  5. Android开发艺术探索读书笔记

    前言 Android开发艺术(这本书真的是艺术,太崇拜刚哥了,值得每一个做Android开发刷十遍的书) 1,Activity生命周期和启动模式 典型情况下的生命周期分析 onCreate() onS ...

  6. android开发读书笔记,android开发权威指南读书笔记

    第17章 Fragment 1.在res目录下增加 layout-sw600dp 目录,用于存放7英寸及以上尺寸屏幕的布局文件.10英寸以上平板用 sw720dp.如果是更小的屏幕,如 480*800 ...

  7. android 优化启动事件,张绍文android开发高手课读书笔记4-启动优化篇

    启动优化篇 在说如何对启动时间进行优化之前,我们得先知道从用户点击应用图标开始,一共经历了那些阶段. 主要阶段如下图. image T0-T1阶段 这个阶段是手机系统解析点击事件,效应快慢跟手机性能有 ...

  8. android开发 解析 b5,张绍文android开发高手课读书笔记4-启动优化篇

    启动优化篇 在说如何对启动时间进行优化之前,我们得先知道从用户点击应用图标开始,一共经历了那些阶段. 主要阶段如下图. image T0-T1阶段 这个阶段是手机系统解析点击事件,效应快慢跟手机性能有 ...

  9. Android开发艺术探索读书笔记(二)

    首先感谢大家支持,昨天第一篇写出来之后反响很好,主席本人也非常赞赏(捂脸-),再接再厉,推出第二篇.这篇的主要内容是对两章View的内容进行总结.不得不说,自定义View是很多开发者的痛点,一方面我们 ...

  10. Android开发艺术探索读书笔记(第5章 RemoteView)

    原理 RemoteView的作用是在其他进程中显示并更新view界面. 大量的IPC操作会影响效率,为了解决这个问题,系统并没有通过Binder去直接支持View的跨进程访问,而是提供了一个Actio ...

最新文章

  1. 图文详解并联机器人,你了解吗?
  2. 一.Python 基础
  3. DataVeryLite和Nhibernate性能对比
  4. 如何使我的Python程序休眠50毫秒?
  5. Tencent JDK 国产化CPU架构支持分享
  6. 【报告分享】转变与机遇:从京东大数据看2020消费市场与品牌成长.pdf(附下载链接)...
  7. 记2个月来,我在Csdn 掀起的微软面试风暴
  8. 监听input框值得改变
  9. Android支付实践(三)之银联支付功能(客户端+服务端)
  10. 高质量程序设计指南c++/c语言(19)--赋值操作符“=”
  11. Unity学习日志_NGUI简介
  12. C++ socket编程实例
  13. Python之字典遍历元素
  14. 且看三星刚发布的Smart TV如何窃听你的枕边细语 - 硅谷路透社
  15. 天刀手游服务器维护11月7号,天涯明月刀手游11月11日正式服维护公告
  16. Erebus 0.5 发布,2D 实时角色扮演游戏
  17. 汇纳科技张宏俊:加强布局AI大数据,为实体商业服务
  18. 浅谈Fiddler4 如何进行Idea抓包操作
  19. ibm service guide
  20. 多方安全计算(MPC)知识汇总

热门文章

  1. 上传图片的表单java代码_java模拟post方式提交表单实现图片上传(示例代码)
  2. android自定义图片加载,Android自定义ProgressDialog加载图片
  3. shell(一)——概述、变量、运算符
  4. My_software_list
  5. php 什么情况下加异常,PHP中的异常
  6. c语言分治法求众数重数_五大常见算法策略之——递归与分治策略
  7. php redis decr,Redis Decr 命令
  8. matplotlib调整子图尺寸,消除大图白边框
  9. java对csv格式的读写操作
  10. grafana官方使用文档_5. Centos7 下部署使用 nmon2influxdb