了解Android系统架构

作者: Stan_Z | 来源:发表于2018-01-27 17:02 被阅读193次

    版权声明:本文为作者原创,转载必须注明出处。
    转载请注明出处: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

    相关文章

      网友评论

        本文标题:了解Android系统架构

        本文链接:https://www.haomeiwen.com/subject/yqonaxtx.html