Framework篇 - Android 系统介绍和架构一览
今天开始写 Android Framework 相关的文章,平时我们开发用的都是 Android 封装好的 API,理解里面的原理对于我们平时的开发,面试都有很大的帮助。
目录:
- Android 系统简述
- AOSP 的下载和编译
- Android 的四层架构
- 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)。
- 1.3 Linux 内核版本
Android Version |API Level |Linux Kernel in AOSP----------------------------------------------------1.5 Cupcake |3 |2.6.271.6 Donut |4 |2.6.292.0/1 Eclair |5-7 |2.6.292.2.x Froyo |8 |2.6.322.3.x Gingerbread |9, 10 |2.6.353.x.x Honeycomb |11-13 |2.6.364.0.x Ice Cream San|14, 15 |3.0.14.1.x Jelly Bean |16 |3.0.314.2.x Jelly Bean |17 |3.4.04.3 Jelly Bean |18 |3.4.394.4 Kit Kat |19, 20 |3.105.x Lollipop |21, 22 |3.16.16.0 Marshmallow |23 |3.18.107.0 Nougat |24 |4.4.17.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 的四层架构
从上往下来看:
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 生成的。
更多相关文章
- 【Android】windows系统上安装与使用Android NDK r5
- IPC机制: Android中的IPC简介和多进程模式
- Android系统源码阅读(10):Android 应用程序的消息处理机制
- Android 7.0系统启动流程分析
- Android面试之----Android系统架构图及简单的系统架构介绍
- Android弹幕实现:基于B站弹幕开源系统(5)-抽象和复用