Framework篇 - Android 系统介绍和架构一览

Framework篇 - Android 系统介绍和架构一览_第1张图片

今天开始写 Android Framework 相关的文章,平时我们开发用的都是 Android 封装好的 API,理解里面的原理对于我们平时的开发,面试都有很大的帮助。

 

目录:

  1. Android 系统简述
  2. AOSP 的下载和编译
  3. Android 的四层架构
  4. Android 系统的启动架构 

 

 

1. Android 系统简述

 

  • 1.1 简述

Android 是一种基于 Linux 的开源操作系统。主要使用于移动设备,如智能手机和平板电脑,由 Google 公司和开放手机联盟领导及开发。尚未有统一中文名称,中国大陆地区较多人使用"安卓"或"安致"。Android 操作系统最初由 Andy Rubin 开发,主要支持手机。2005年8月由 Google 收购注资,2007年11月,Google 与84家硬件制造商、软件开发商及电信营运商组建开放手机联盟共同研发改良 Android 系统。随后 Google 以 Apache 开源许可证的授权方式,发布了 Android 的源代码。第一部 Android 智能手机发布于2008年10月,Android 逐渐扩展到平板电脑及其他领域上,如电视、游戏机、智能手表等。2011年第一季度,Android 在全球的市场份额首次超过塞班,跃居全球第一。 2013年的第四季度,Android 平台手机的全球市场份额已经达到78.1%。2013年09月24日 Google 开发的操作系统 Android 迎来了5岁生日,全世界采用这款系统的设备数量已经达到10亿台。

 

  • 1.2 版本

Android 在正式发行之前,最开始拥有两个内部测试版本,并且以著名的机器人名称来对其进行命名,它们分别是:阿童木 (AndroidBeta),发条机器人 (Android 1.0)。后来由于涉及到版权问题,Google 将其命名规则变更为用甜点作为它们系统版本的代号的命名方法。甜点命名法开始于 Android 1.5发布的时候。作为每个版本代表的甜点的尺寸越变越大,然后按照26个字母数序:纸杯蛋糕 (Android 1.5),甜甜圈 (Android 1.6),松饼 (Android 2.0/2.1),冻酸奶 (Android 2.2),姜饼 (Android 2.3),蜂巢 (Android 3.0),冰激凌三明治 (Android 4.0),果冻豆 (Jelly Bean,Android 4.1和 Android 4.2),奇巧 (KitKat,Android 4.4),棒棒糖 (Lollipop,Android 5.0),棉花糖    (Marshmallow,Android 6.0),牛轧糖 (Nougat,Android 7.0),奥利奥 (Oreo,Android 8.0),派 (Pie, Android 9.0)。

Framework篇 - Android 系统介绍和架构一览_第2张图片

 

  • 1.3 Linux 内核版本
Android Version    |API Level  |Linux Kernel in AOSP
----------------------------------------------------
1.5   Cupcake      |3          |2.6.27
1.6   Donut        |4          |2.6.29
2.0/1 Eclair       |5-7        |2.6.29
2.2.x Froyo        |8          |2.6.32
2.3.x Gingerbread  |9, 10      |2.6.35
3.x.x Honeycomb    |11-13      |2.6.36
4.0.x Ice Cream San|14, 15     |3.0.1
4.1.x Jelly Bean   |16         |3.0.31
4.2.x Jelly Bean   |17         |3.4.0
4.3   Jelly Bean   |18         |3.4.39
4.4   Kit Kat      |19, 20     |3.10
5.x   Lollipop     |21, 22     |3.16.1
6.0   Marshmallow  |23         |3.18.10
7.0   Nougat       |24         |4.4.1
7.1   Nougat       |25         |4.4.1 (To be updated)

 

  • 1.4 优势

开放性

在优势方面,Android 平台首先就是其开放性,开发的平台允许任何移动终端厂商加入到 Android 联盟中来。显著的开放性可以使其拥有更多的开发者,随着用户和应用的日益丰富,一个崭新的平台也将很快走向成熟。
开放性对于 Android 的发展而言,有利于积累人气,这里的人气包括消费者和厂商,而对于消费者来讲,最大的受益正是丰富的软件资源。开放的平台也会带来更大竞争,如此一来,消费者将可以用更低的价位购得心仪的手机。


丰富的硬件:

这一点还是与 Android 平台的开放性相关,由于 Android 的开放性,众多的厂商会推出千奇百怪,功能特色各具的多种产品。功能上的差异和特色,却不会影响到数据同步、甚至软件的兼容,如同从诺基亚 Symbian 风格手机一下改用苹果iPhone,同时还可将 Symbian 中优秀的软件带到 iPhone 上使用,联系人等资料更是可以方便地转移。


方便开发

Android 平台提供给第三方开发商一个十分宽泛、自由的环境,不会受到各种条条框框的阻扰,可想而知,会有多少新颖别致的软件会诞生。但也有其两面性,血腥、暴力、情色方面的程序和游戏如何控制正是留给 Android 难题之一。


Google 应用

在互联网的 Google 已经走过10年度历史,从搜索巨人到全面的互联网渗透,Google 服务如地图、邮件、搜索等已经成为连接用户和互联网的重要纽带,而 Android 平台手机将无缝结合这些优秀的 Google 服务。

 

 

2. AOSP 的下载和编译

AOSP "Android Open-Source Project" 的缩写,中文意为 "Android 开放源代码项目"。

关于下载编译 AOSP 不是本章的重点,网上也有很多相关的文章,我给大家推荐一篇:AOSP源码编译

如果只是想看 Framework 的代码,可以从这扒一下:https://github.com/CyanogenMod/android_frameworks_base

 

 

3. Android 的四层架构

Framework篇 - Android 系统介绍和架构一览_第3张图片

从上往下来看:

Application 层 

Home、Contacts、Phone、Browser 等。

Java Framework 层

ActivityManager、WindowManager、ContentProvider、ViewSystem、NotificationManager、PackageManager、TelephonyManager、ResourceManager、LocationManager、XMPPManager 等。

Libraries & Android Runtime 层

Libraries: Surface Manager、MediaFramework (c++ Framework)、SQLite、OpenGL/ES、FreeType、Webkit、SGL、SSL、Libc 等。
Android Runtime: Core Libraries、Dalvik VM / ART VM。

Linux Kernel 层

Display Driver、Camera Driver、Bluetooth Driver、Flash Mem Driver、Binder (IPC) Driver、USB Driver、Keypad Driver、WIFI Driver、Audio Driver、Power Management 等。

 

 

4. Android 系统的启动架构 

从下往上分别是:Loader - Kernel - Native - C++ Framework (Media) - Java Framework - App。

 

  • 4.1 Loader 层

Boot ROM: 手机处于关机状态的时候,长按电源键,此时会引导芯片开始执行固化在 ROM (相当于硬盘) 中的预设代码,然后加载引导程序到 RAM (相当于内存)。

Boot Loader: 启动 Android 系统之前的引导程序,主要是检查 RAM 和初始化硬件参数等。

手机中的 ROM 和 RAM 分别对应电脑的硬盘和内存,内存负责程序的运行以及数据交换,有了它,电脑中的软件才能运行,并有了进程;而硬盘就是一块存储空间,它可以存储各种各样的文件,包括视频、照片、音乐、软件等。

 

  • 4.2 Kernel 层

Android 的内核层,此时才刚刚开始进入 Android 系统。

启动 Kernel 的 Swapper 进程 (pid = 0): 这个进程又被称为 idle 进程,是 Kernel 从无到有开启的第一个进程。用于初始化进程管理、内存管理、加载各种驱动等工作。

启动 kthreadd 进程 (pid = 2): 这个进程是 Linux 系统的内核进程,会创建内核工作线程 kworkder,软中断线程 ksoftirqd,thermal 等内核守护进程,kthreadd 进程是所有内核进程的鼻祖。

 

  • 4.3 Native 层

可以看到 Kernel 层与 Native 层中间有个 SysCall:

Native 和 Kernel 之间,有一层系统调用 SysCall 层,是它们之间通信的桥梁,而 Java 层与 Native(C/C++) 层之间的桥梁是 JNI。

Kernel 层是内核空间,Native 层开始是用户空间。这一层主要包括 Init (pid = 1) 进程孵化出来的用户空间的守护进程、HAL 层和开机动画。

  • Init 进程是所有用户进程的鼻祖,Init 进程会孵化出 ueventd、logd、healthd、installd、adbd、lmkd 等用户守护进程;
  • Init 进程还启动 ServiceManager (binder服务管家)、bootanim (开机动画) 等重要服务;
  • Init 进程孵化出 Zygote 进程,Zygote 进程是 Android 系统的第一个 Java 进程 (即虚拟机进程),Zygote 是所有 Java 进程的父进程, Zygote 进程本身是由 Init 进程孵化而来的。

ServiceManager 这个类的主要方法有 addService()、getService()、listServices()。所以这个类的主要职责是控制用户访问服务, 控制服务是否可以使用这一接口 (通过注册时的检查权限),管理 Service。ServiceManager 并不负责创建和启动服务实例,一般服务的启动都是在创建服务实例时完成的,而没有额外调用一个方法去启动它。

硬件抽象层 (HAL) 是介于 内核 Kernel 和上层之间抽象出来的一层结构。它是对 Linux 驱动的一个封装,对上层提供统一接口,上层应用不必知道下层硬件具体怎么实现工作的,它屏蔽了底层的实现细节。

传统的 Linux 对硬件的操作基本上在内核空间的 Linux 驱动程序中实现了,那么现在为什么那么多此一举把对硬件的操作分为两部分:HAL 和 Linux 驱动呢?而且 HAL 属于用户空间,Linux 驱动属于内核空间。其实并不多余,理由如下:

  • Google 搭好了 HAL 的框架,为上层 Framework 打通过 JNI 调用 HAL 提供了统一的 API,硬件开发商或者移植人员只需要按照框架开发即可,无需话费精力在与上层的交互上的实现上,将精力放在 HAL 层本身的实现上即可。
  • 从商业角度,许多硬件厂商不愿意将自己硬件相关一些核心的东西开源出去,假如将对自己硬件的驱动程序全部放入内核空间驱动程序实现,那么必须遵循 GPL 协议,是必需开源的。有了 HAL 层之后,他们可以把一些核心的算法之类的东西的实现放在 HAL 层,而 HAL 层位于用户空间,不属于 Linux 内核,和 Android 源码一样遵循的是 Apache 协议,这个是可以开源或者不开的。

 

  • 4.4 Framework 层

Media Server 进程,是由 Init 进程 fork 而来,负责启动和管理整个 C++ framework,包含 AudioFlinger,Camera Service等服务。

Zygote 进程,是由 Init 进程通过解析 init.rc 文件后 fork 生成的,Zygote 进程主要包含:

  • 加载 ZygoteInit 类;
  • 注册 Zygote Socket 服务端套接字;
  • 加载虚拟机;
  • preloadClasses;
  • preloadResouces。

System Server 进程,是由 Zygote 进程 fork 而来,System Server 是 Zygote 孵化的第一个进程, System Server 负责启动和管理整个 Java framework。其中 WindowManagerService,ActivityManagerService 等重要的可以 binder 通信的服务都运行在 System Server 进程。像 WindowManagerService,ActivityManagerService 这样重要、繁忙的服务,是运行在单独线程中,而有些没有繁重任务的服务,并没有单独开一个线程。

 

  • 4.5 App 层

Zygote 进程孵化出的第一个 App 进程是 Launcher,这是用户看到的桌面 App。Zygote 进程还会创建 Browser、Phone、Email等 App 进程,每个 App 至少运行在一个进程上,所有的 App 进程都是由 Zygote 进程 fork 生成的。

 

 

 

你可能感兴趣的:(Framework篇)