今天开始写 Android Framework 相关的文章,平时我们开发用的都是 Android 封装好的 API,理解里面的原理对于我们平时的开发,面试都有很大的帮助。
目录:
1. Android 系统简述
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亿台。
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)。
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)
开放性:
在优势方面,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。
Boot ROM: 手机处于关机状态的时候,长按电源键,此时会引导芯片开始执行固化在 ROM (相当于硬盘) 中的预设代码,然后加载引导程序到 RAM (相当于内存)。
Boot Loader: 启动 Android 系统之前的引导程序,主要是检查 RAM 和初始化硬件参数等。
手机中的 ROM 和 RAM 分别对应电脑的硬盘和内存,内存负责程序的运行以及数据交换,有了它,电脑中的软件才能运行,并有了进程;而硬盘就是一块存储空间,它可以存储各种各样的文件,包括视频、照片、音乐、软件等。
Android 的内核层,此时才刚刚开始进入 Android 系统。
启动 Kernel 的 Swapper 进程 (pid = 0): 这个进程又被称为 idle 进程,是 Kernel 从无到有开启的第一个进程。用于初始化进程管理、内存管理、加载各种驱动等工作。
启动 kthreadd 进程 (pid = 2): 这个进程是 Linux 系统的内核进程,会创建内核工作线程 kworkder,软中断线程 ksoftirqd,thermal 等内核守护进程,kthreadd 进程是所有内核进程的鼻祖。
可以看到 Kernel 层与 Native 层中间有个 SysCall:
Native 和 Kernel 之间,有一层系统调用 SysCall 层,是它们之间通信的桥梁,而 Java 层与 Native(C/C++) 层之间的桥梁是 JNI。
Kernel 层是内核空间,Native 层开始是用户空间。这一层主要包括 Init (pid = 1) 进程孵化出来的用户空间的守护进程、HAL 层和开机动画。
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 协议,这个是可以开源或者不开的。
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 这样重要、繁忙的服务,是运行在单独线程中,而有些没有繁重任务的服务,并没有单独开一个线程。
Zygote 进程孵化出的第一个 App 进程是 Launcher,这是用户看到的桌面 App。Zygote 进程还会创建 Browser、Phone、Email等 App 进程,每个 App 至少运行在一个进程上,所有的 App 进程都是由 Zygote 进程 fork 生成的。