01.Android系统的框架
目录介绍
- 01.Android组件设计
- 1.1 AMS核心设计思想
- 1.2 Binder设计思想
- 1.3 组件通信设计
- 1.4 组件通信Intent
- 1.5 内存回收进程设计
- 02.Android系统架构
- 2.1 系统架构总设计
- 2.2 系统架构分层
- 03.Android硬件抽象层
- 3.1 硬件抽象层介绍
- 3.2 硬件抽象层设计
- 04.Android应用程序组件
- 4.1 应用程序一般框架
- 4.2 应用程序组件介绍
- 4.3 应用程序组件设计
- 05.Android应用程序框架
- 5.1 应用程序框架设计
- 5.2 如何管理硬件
- 5.3 如何提供服务
- 5.4 如何组件管理
- 5.5 如何进程管理
- 06.Android用户界面
- 6.1 用户界面架构设计
- 6.2 窗口管理框架
- 6.3 资源管理框架
01.Android组件设计
组件化设计实现:程序由组件组成;组件与进程剥离;组件皆程序入口
程序由组件组成:Activity:前台交互;Service:后台计算;Broadcast Receiver:广播通信;Content Provider:数据封装
组件与进程剥离:组件关闭时,进程可以继续存在,提高重新启动时的速度;进程关闭时,组件可以继续存在,保护被杀进程里面的组件。
将组件与进程进行剥离,使得进程对组件透明,听起来很好,但是如何解决以下四个问题?
- 谁来负责组件的启动和关闭?
- 谁来维护组件的状态?
- 谁来管理组件运行时所需要的进程?
- 组件之间如何进行通信?
1.1 AMS核心设计思想
Android AMS(Activity Manager Service)是Android操作系统中的一个核心组件,负责管理应用程序的生命周期、任务栈、进程和应用间的交互等。
AMS的设计思想主要包括以下几个方面:
- 统一管理应用生命周期:AMS负责跟踪和管理应用程序的生命周期,包括应用的启动、暂停、停止和销毁等。
- 任务栈管理:AMS通过任务栈的概念来管理应用程序的活动。每个应用程序都有一个与之关联的任务栈,用于存储应用的活动。AMS可以根据用户的操作,如启动新的应用、返回到上一个应用等,对任务栈进行调度和管理,确保应用的切换和切换顺序的正确性。
- 进程管理:AMS负责管理应用程序的进程。它根据应用的需求和系统资源的情况,决定何时创建、启动、停止或销毁应用的进程。AMS通过进程间通信(IPC)机制,使应用程序能够在不同的进程中进行交互和通信。
- 应用间交互:AMS提供了一种机制,使应用程序能够在不同的应用之间进行交互。例如,通过隐式意图(Intent)机制,应用可以请求系统启动其他应用的活动,实现应用间的数据共享和功能调用。
- 安全性和权限管理:AMS负责应用程序的权限管理和安全性。它确保应用程序只能访问其被授权的资源和功能,并对应用程序的行为进行监控和控制,以保护用户的隐私和系统的安全。
进程管理
- 在适当的时候主动回收空进程和后台进程,以及通知进程自己进行内存回收
- 组件的UID和Process Name唯一决定了其所要运行在的进程。
- 每次组件onStop时,都会将自己的状态传递给AMS维护。
AMS在以下四种情况下会调用trimApplications来主动回收进程:
- A.activityStopped,停止Activity
- B.setProcessLimit,设置进程数量限制
- C.unregisterReceiver,注销Broadcast Receiver
- D.finishReceiver,结束Broadcast Receiver
WMS也会主动回收进程:WindowManagerService在处理窗口的过程中发生Out Of Memroy时,会调用reclaimSomeSurfaceMemoryLocked来回收某些Surface占用的内存,reclaimSomeSurfaceMemoryLocked的逻辑如下所示:
- 1).首先检查有没有泄漏的Surface,即那些Session已经不存在但是还没有销毁的Surface,以及那些宿主Activity已经不可见但是还没有销毁的Surface。如果存在的话,就将它们销毁即可,不用KillPids。
- 2).如果不存在没有泄漏的Surface,那么那些存在Surface的进程都有可能被杀掉,这是通过KillPids来实现的。
1.2 Binder设计思想
为组件间通信提供支持:进程间;进程内
高效的IPC机制
- 进程间的组件通信时,通信数据只需一次拷贝
- 进程内的组件通信时,跳过IPC进行直接的通信
传统的IPC,通信数据需要执行两次,一次是从源进程的用户空间拷贝到内核空间,二次是从内核空间拷贝到目标进程的用户空间
1.3 组件通信设计
组件之间的通信是通过Intent、Broadcast、回调和共享数据等方式实现的。以下是Android中常见的组件通信设计:
- Intent(意图):Intent是用于在组件之间传递消息和执行操作的对象。通过在Intent中设置数据和标识符,可以实现不同组件之间的通信和交互。
- Broadcast(广播):Broadcast是一种系统级别的消息机制,用于在应用程序内部或与其他应用程序之间进行通信。
- 回调(Callback):回调是一种通过接口或抽象类定义的方法,用于在组件之间进行回调通知。
- 共享数据(Shared Data):组件之间可以通过共享数据来进行通信。Android提供了ContentProvider机制,允许应用程序共享和访问数据。
- 组件间直接引用:在某些情况下,组件之间可以直接引用彼此,以实现更紧密的通信。这种方式适用于组件之间需要频繁交互和共享状态的场景。
1.4 组件通信Intent
为何要设计Intent?Intent提供了一种统一的机制,使得Android应用程序中的各个组件可以相互协作,共享功能和数据。如果你是谷歌开发者,你会如何设计它?
1.5 内存回收进程设计
内存紧张时回收进程,由于组件与进程是剥离的,因此进程回收不会影响组件的生命周期。如果你是谷歌Android架构师,你该如何设计?需要考虑哪些?
- 低内存级别需要定义:定义了不同的内存级别,如低内存、中等内存和临界内存等级别。方便触发系统按级别回收进程!
- 进程优先级的设计:多个应用在后台,Android系统为每个进程分配了不同的优先级,如前台进程、可见进程、服务进程和缓存进程等。当内存紧张时,系统会优先终止优先级较低的进程。
- 还要设计进程重启和恢复:系统终止一个进程时,它可以选择重启进程或在需要时重新创建进程。这样可以确保重要的应用能够在内存紧张的情况下继续运行,并恢复到之前的状态。
从低优先级进程开始回收
- Empty Process
- Hidden Process
- Perceptible Process
- Visible Process
- Foreground Process
备注:
每一个APP进程都有一个oom_adj值,该值是根据进程所运行的组件计算出来的,值越小,优先级就越级。
Init和System Server进程的oom_adj等于-16,是最高的,保证不会被杀死。
PhoneApp具有persist属性,它的oom_adj被设置为-12,也能保证不会被杀死。
可以通过/proc/oom_adj文件查看进程的oom_adj值。
在Linux内核中,子进程的oom_adj值等于父进程的oom_adj,也就是说,Android里面的Native进程的oom_adj值与fork它的进程的oom_adj值一样。
02.系统框架整体介绍
2.1 系统架构总设计
1.Android系统 = Linux内核 + Android运行时
- Android系统使用的Linux内核包含了一些专用驱动,例如Logger、Binder、Ashmem、Wakelock、Low-Memory Killer和Alarm等
- Android运行时从下到上又包括了HAL层、应用程序框架层和应用程序层。
2.HAL层:将硬件驱动分成内核空间和用户空间两部分,其中用户空间两部分采用的是商业友好的Apache License。
3.应用程序框架层:主要包括系统服务,例如组件管理服务、应用程序安装服务、窗口管理服务、多媒体服务和电信服务等。
4.应用程序层
- 应用程序框架进一步又分为C/C++和Java两个层次,Java代码运行Dalvik虚拟机之上,并且通过JNI方法和C/C++交互。
- 应用程序层主要就是由四大组件Activity、Service、Broadcast Receiver和Content Provider构成,它们是应用开发的基础。
2.2 系统架构分层
Linux内核层:Android基于Linux内核,它提供了底层的硬件驱动、进程管理、内存管理、网络协议栈等功能。Linux内核层为Android系统提供了稳定的底层基础。
系统运行时层:系统运行时层包括核心库和虚拟机,主要有以下几个组件:
- 核心库(Core Libraries):提供了Android应用程序开发所需的核心功能,包括Java核心库、C/C++核心库、媒体库等。
- Dalvik虚拟机(Dalvik Virtual Machine):在早期版本的Android中使用的虚拟机,用于执行Dex字节码。从Android 5.0开始,Dalvik被ART(Android Runtime)虚拟机所取代。
- ART虚拟机(Android Runtime):从Android 5.0及更高版本开始使用的虚拟机,它将Dex字节码转换为本地机器码,提供更高的性能和效率。
应用框架层:应用框架层提供了开发Android应用程序所需的各种API和服务,包括:
- Activity Manager:管理应用程序的生命周期、任务栈和进程。
- Package Manager:管理应用程序的安装、卸载和权限。
- Content Providers:提供数据共享和访问的机制。
- Telephony Manager:提供与电话和移动网络相关的功能。
- Location Manager:提供位置信息和地理位置服务。
- Window Manager:管理应用程序窗口和用户界面。
- Notification Manager:管理通知和状态栏。
- 其他一些服务等等
应用层:应用层是用户直接与之交互的部分,包括各种预装的应用程序(如电话、短信、浏览器、联系人等)以及第三方应用程序。这些应用程序通过应用框架层提供的API和服务与系统进行交互。
03.Android硬件抽象层
3.1 硬件抽象层介绍
Android硬件抽象层(Hardware Abstraction Layer,HAL)是Android系统架构中的一个重要组成部分,它提供了一个标准化的接口,用于在操作系统和底层硬件之间进行通信和交互。
HAL的设计旨在实现硬件的抽象和解耦,使得Android系统可以在不同的硬件平台上运行,而无需对上层应用程序进行修改。
3.2 硬件抽象层设计
Android硬件抽象层的设计包括以下几个关键方面:
接口定义:HAL定义了一组标准化的接口,用于描述硬件功能和操作。这些接口包括了各种硬件组件,如摄像头、传感器、音频、蓝牙、Wi-Fi等。每个接口都定义了一组方法和数据结构,用于与特定硬件进行交互。
HAL实现:每个硬件厂商需要根据HAL接口的定义,实现相应的HAL库。这些HAL库通常以共享库(.so文件)的形式提供,可以在运行时动态加载。HAL库负责与底层硬件进行通信,处理硬件相关的操作和数据传输。
设备树(Device Tree):设备树是一种描述硬件配置和功能的数据结构,它在Android系统中用于描述硬件设备的属性和连接关系。设备树提供了一种统一的方式,使得HAL能够动态识别和加载适当的硬件驱动。
HAL层与上层框架的交互:HAL层通过提供标准化的接口,使得上层应用框架可以与硬件进行交互,而无需关心具体的硬件实现。上层框架可以通过调用HAL接口来访问硬件功能,如使用摄像头、获取传感器数据等。
3.3 硬件抽象层架构图
04.Android应用程序组件
4.1 应用程序一般框架
4.2 应用程序组件介绍
4.3 应用程序组件设计
05.Android应用程序框架
5.1 应用程序框架设计
5.2 如何管理硬件
5.3 如何提供服务
5.4 如何组件管理
5.5 如何进程管理
06.Android用户界面
6.1 用户界面架构设计
6.2 窗口管理框架
Android窗口管理框架是Android系统中负责管理应用程序窗口的关键组件。它负责窗口的创建、显示、布局、焦点管理以及与用户交互等任务。
- Window:Window是一个抽象的概念,代表应用程序中的一个可视区域。
- WindowManagerService:负责管理窗口和处理与窗口相关的任务。比如窗口创建,显示,布局,窗口生命周期,以及交互事件处理,还有动画等。
- View:View系统是窗口管理框架的基础。它负责处理用户界面的绘制、事件分发和交互等任务。View系统通过ViewGroup和View的层次结构来管理和显示UI元素。
- SurfaceFlinger:显示引擎,负责管理和渲染应用程序窗口的内容。主要是做窗口像素数据渲染,包含图像合成,显示帧刷新等,保证徒刑渲染在屏幕上。
6.3 资源管理框架
Android资源管理框架是Android系统中的一个重要组成部分,它负责管理应用程序使用的各种资源,如布局文件、字符串、图像、颜色等。
- Resources:资源访问和加载,用于访问和管理应用程序资源的类。它提供了一种统一的接口,用于访问应用程序的布局、字符串、图像、颜色等各种资源。
- AssetManager:用于管理应用程序的assets文件夹中资源的类,用于存储应用程序需要在运行时读取的非编译资源,如文本文件、音频、视频等。