了解Android系统架构

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

博主本人以前是做app开发的,之后转做framework开发,因为android系统非常庞大繁杂,以前积累的知识都比较零散,没有一个整体的认识,所以这篇文章希望先对整个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等。例如:

《了解Android系统架构》

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

《了解Android系统架构》

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

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

以app 获取GPS信息为例:

《了解Android系统架构》

三、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的环境
servicemanagerbinder通信大管家
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等。

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

《了解Android系统架构》

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并无直接关系。

《了解Android系统架构》

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

    原文作者:ZHTo0
    原文地址: https://www.jianshu.com/p/c2fffcd5caf2
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞