了解Android系统架构

版权声明:本文为作者原创,转载必须注明出处。
转载请注明出处:https://www.jianshu.com/p/c2fffcd5caf2

博主本人以前是做app开发的,之后转做framework开发,因为android系统非常庞大繁杂,以前积累的知识都比较零散,没有一个整体的认识,所以这篇文章希望先对整个android系统架构有个比较完整的了解,之后再细分模块来逐一学习。
那么先来看看整个Android系统的架构:

从图上可以看到,Android使用的是层级式架构,好处就是高内聚、低耦合。各层相对独立,我不需要知道其他层的具体业务和逻辑,我单纯地只需要从下层拿到对应的内容,把它包装好,提供给上层使用,就类似于工厂流水线。
下面对每层做个简单的介绍:

一、应用层:
Android平台的应用层上包括各类与用户直接交互的应用程序,或由java语言编写的运行于后台的服务程序,这里分为系统应用和第三方应用。其中系统应用可用作用户的应用,以及提供开发者可从其自己的应用访问的主要功能。例如,如果您的应用要发短信,您无需自己构建该功能,可以改为调用已安装的短信应用向您指定的接收者发送消息。

二、framework层:该层的实现是Java
提供开发Android应用程序所需的一系列基础API支持,包括了开发所需的一系列组件和系统服务等。
包括:
1)应用程序框架:这一层可以理解为 Android SDK,提供四大组件,视图系统(View System)、各种Manager等等平时开发中用到的基础部件。以下列举一部分:

应用程序框架层类库名称 功能
活动管理器(Activity Mananger) 管理各个应用程序生命周期并提供常用的导航回退功能,为所有程序的窗口提供交互的接口
窗口管理器(Window Manager) 对所有开启的窗口程序进行管理
内容提供器(Content Provider) 提供一个应用程序访问另一个应用程序数据的功能,或者实现应用程序之间的数据共享
视图系统(View System) 创建应用程序的基本组件,包括列表(lists),网格(grids),文本框(text boxes),按钮(buttons),还有可嵌入的web浏览器。
通知管理器(Notification Manager) 使应用程序可以在状态栏中显示自定义的客户提示信息
包管理器(Package Manager) 对应用程序进行管理,提供的功能诸如安装应用程序,卸载应用程序,查询相关权限信息等。
资源管理器(Resource Manager) 提供各种非代码资源供应用程序使用,如本地化字符串,图片,音频等
位置管理器(Location Manager) 提供位置服务
电话管理器(Telephony Manager) 管理所有的移动设备功能
XMPP服务 是Google在线即时交流软件中一个通用的进程,提供后台推送服务

2)Java系统服务: 这部分系统服务又可以分为两种:Java核心系统服务和Java硬件系统服务。
(1)Java核心系统服务是Android系统正常运转的基础,包括大家所熟知的AMS、WMS、PMS等。例如:

(2)Java硬件服务是为应用提供硬件控制服务,如电话服务、wifi服务、PowerManagerService等。例如:

该两层之前,通过Binder实现进程间通信。允许framework来跨进程边界,来调用Android的系统服务的代码,这使得框架API与Android系统服务能够进行交互。

总结:应用程序---SDK---->系统框架层---Binder IPC--->系统服务层。

以app 获取GPS信息为例:

三、native层:该层的实现是C/C++
开篇首张图中,用红线框住的均属于该层:包括C/C++ libs 、android runtime、HAL
1)C/C++ libs:C/C++编写的系统类库
(1) 本地守护进程
init进程根据init.rc文件中的定义,启动本地守护进程。这些进程会常驻在系统中,有的只会启动一次,有的如果退出了,还会被init启动。具体的启动方式就在init.rc中定义。
下面大体列举几个守护进程及其功能。

守护进程 功能
vold 管理存储设备,自动安装存储设备,将设备分区格式化
netd 管理蓝牙、wifi、usb等各种网络连接
installd 负责安装及卸载软件包,确认软件包的完整性
rild 接收来自于phone应用程序或其他客户端程序发出的调制解调控制请求,并传递给调制解调器
adbd 提供可以调试Android的环境
servicemanager binder通信大管家
surfaceflinger 负责android系统的UI图形显示
mediaserver 负责播放音频、视频,camera拍照录像

(2) Native系统服务
由c++语言编写,运行在本地守护进程中。比如mediaserver守护进程中就包含AudioFlinger、MediaPlayerService、CameraService、AudioPolicyService和SoundTriggerHwService等服务。在所属进程初始化的时候会将Native系统服务注册到ServiceManager中。这样,其他的应用或服务就可以通过binder机制调用Native系统服务了。 当然,我们也可以自己开发一个Native系统服务,实现其Binder接口,这样Native层的其他应用或服务就可以调用该服务了。 如果我们开发的Native系统服务想提供给Java层应用使用,就需要实现一个Java接口,然后通过JNI调用Native系统服务。

(3) 功能性的Native类库支持
比如:Webkit 、OpenGL ES 、SQlite等。

通过一张图对系统服务有个大致了解:

2)Android Runtime: Android运行环境,对java提供支持
(1) 虚拟机:Dalvik and Art(android 4.4之后)
作用:面向Linux、为嵌入式操作系统设计的虚拟机,主要负责完成对象生命周期管理、堆栈管理、线程管理、安全和异常管理,以及垃圾回收等。
android为每个程序提供一个vm,可以使每个app都运行在独立的运行环境,使稳定性提高,并且一个vm能运行多个进程。
android apk都被编译成字节码(bytecode),在运行的时候,vm是先将字节码编译真正可执行的代码,否则不同硬件设备的兼容是很大的麻烦。
(2) core libs: 核心库提供了Java se API的多数功能,包括JNI,并提供Android的核心API,如android.os,android.net,android.media等。

  1. HAL 硬件抽象层 基于商业隐私考虑,对Kernel层进行二次封装,屏蔽数据处理细节,运行于用户空间。
    鉴于商业隐私考虑,许多硬件设备厂商不希望公开其设备驱动的源代码,如果能将android的应用框架层与linux系统内核的设备驱动隔离,使应用程序框架的开发尽量独立于具体的驱动程序,则android将减少对Linux内核的依赖。HAL由此而生,它是对Linux内核驱动程序进行的封装,将硬件抽象化,屏蔽掉了底层的实现细节。HAL规定了一套应用层对硬件层读写和配置的统一接口,本质上就是将硬件的驱动分为用户空间和内核空间两个层面;Linux内核驱动程序运行于内核空间,硬件抽象层运行于用户空间。也正是由于这个分层的原因,Android被踢出了Linux内核主线代码树中。大家想想,Android放在内核空间的驱动程序对硬件的支持是不完整的,把Linux内核移植到别的机器上去时,由于缺乏硬件抽象层的支持,硬件就完全不能用了,这也是为什么说Android是开放系统而不是开源系统的原因。

另外谈到该层,还需要了解两个东西:
JNI:Java Native Interface,即 Java本地接口。使得Java 与 本地其他类型语言(如C、C++)交互。JNI 是属于 Java 的,与 Android 无直接关系。
NDK:Native Development Kit,是 Android的一个工具开发包 。快速开发C、 C++的动态库,并自动将so和应用一起打包成 APK 即可通过 NDK在 Android中 使用 JNI与本地代码(如C、C++)交互。NDK是属于 Android 的,与Java并无直接关系。

ndk可以通过native code跨过使用dalvik runtime,直接调用到android内核资源,而sdk则需要在dalvik runtime环境下才能调用到内核资源。然而两者并不是各司其职,各不相关。android提供了JNI(java native interface)使两者可以进行相互调用和通信。

四、Kernel层:
Android以Linux操作系统内核为基础,借助Linux内核服务实现硬件设备驱动,进程和内存管理,网络协议栈,电源管理,无线通信等核心功能。Android4.0版本之前基于Linux2.6系列内核,4.0及之后的版本使用更新的Linux3.X内核,并且两个开源项目开始有了互通。Linux3.3内核中正式包括一些Android代码,可以直接引导进入Android。Linux3.4增添了电源管理等更多功能,以增加与Android的硬件兼容性,使Android在更多设备上得到支持。直到现在最新的android6.0仍然继续延用着linux3.4.0,而linux最新的版本已经到了4.3系列,那么为什么android没有继续去更新Linux kernel的版本也是一个值得探讨的课题。
Android内核 对Linux内核进行了增强,增加了一些面向移动计算的特有功能。例如,低内存管理器LMK(Low Memory Keller),匿名共享内存(Ashmem),以及轻量级的进程间通信Binder机制等。这些内核的增强使Android在继承Linux内核安全机制的同时,进一步提升了内存管理,进程间通信等方面的安全性。下表列举了Android内核的主要驱动模块:

驱动名称 说明
Android电源管理(Power Management) 针对嵌入式设备的,基于标准Linux电源管理系统的,轻量级的电源管理驱动
低内存管理器(Low Memory Keller) 低内存管理器(Low Memory Keller) 可以根据需要杀死进程来释放需要的内存。扩展了Linux的OOM机制,形成独特的LMK机制
匿名共享内存(Ashmem) 为进程之间提供共享内存资源,同时为内核提供回收和管理内存的机制
日志(Android Logger) 一个轻量级的日志设备
定时器(Anroid Alarm) 提供了一个定时器用于把设备从睡眠状态唤醒
物理内存映射管理(Android PMEM) DSP及其他设备只能工作在连续的物理内存上,PMEM用于向用户空间提供 连续的物理内存区域映射
Android定时设备(Android Timed device) 可以执行对设备的定时控制功能
Yaffs2文件系统 Android采用大容量的NAND闪存作为存储设备,使用Yaffs2作为文件系统管理大容量MTD NAND Flash;Yaffs2占用内存小,垃圾回收简洁迅速。
Android Paranoid网络 对Linux内核的网络代码进行了改动,增加了网络认证机制。可在IPV4,IPV6和蓝牙中设置,由ANDROID_PARANOID_NETWORK宏来启用此特性。

参考文章:
http://gityuan.com/2015/08/01/android-arvchitecture/
http://gityuan.com/android/
http://blog.csdn.net/sp6645597/article/details/50472740
http://blog.csdn.net/u010753159/article/details/52193061
http://blog.csdn.net/lpjishu/article/details/50781415
http://blog.csdn.net/luoshengyang/article/details/6567257

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容