文章目录
Android系统框架
安卓系统底层到上层框架图
- Linux 内核层:这是安卓系统的底层基础,基于 Linux 内核进行了一些定制和优化。它提供了硬件驱动、内存管理、进程管理、网络协议栈等底层功能,为上层系统和应用程序提供了基本的运行环境。
- 硬件抽象层(HAL):位于 Linux 内核与上层系统之间,它将底层硬件设备的驱动程序进行封装,向上提供统一的接口。这样,上层系统和应用程序可以通过标准的 HAL 接口来访问硬件设备,而不必了解具体硬件的细节,提高了系统的可移植性和稳定性。
- 系统运行库层:包含了一些 C/C++ 库,如 SQLite、OpenGL、SSL 等,这些库为安卓应用程序提供了各种功能支持。此外,还包括安卓运行时环境(ART),在 ART 中,应用程序的字节码会被预先编译成机器码,以提高应用的运行效率。
- 应用框架层:这是安卓系统提供给开发者的主要编程接口,包括 Activity Manager、Window Manager、Content Provider、Broadcast Receiver 等一系列的服务和管理器。开发者可以通过这些接口来开发各种安卓应用程序,实现界面展示、数据存储、消息传递等功能。
- 应用层:即用户在安卓设备上使用的各种应用程序,如社交应用、游戏、办公软件等。这些应用程序是基于应用框架层开发的,通过调用系统提供的各种接口和服务来实现其功能。
安卓应用框架
安卓应用框架层为开发者提供了丰富的 API,借助这些 API,开发者能够便捷地运用系统的各项功能,开发出多样化的应用程序。下面是对其核心组件与服务的详细介绍:
核心组件
活动(Activity)
- 定义:Activity 是安卓应用中用于呈现用户界面的基本组件,一个 Activity 通常对应一个屏幕的内容。
- 用途:主要负责与用户进行交互,处理用户的点击、滑动等操作。比如,在一个新闻应用里,新闻列表页和新闻详情页就可分别用不同的 Activity 来实现。
- 生命周期:Activity 有自己的生命周期,包含创建、开始、恢复、暂停、停止、销毁等状态。开发者需要根据不同的状态来处理数据保存、资源释放等操作,以确保应用的稳定性和性能。
服务(Service)
- 定义:Service 是一种在后台运行的组件,它不提供用户界面,主要用于执行长时间运行的操作或执行远程操作。
- 用途:例如,音乐播放应用中的音乐播放功能就可以通过 Service 在后台持续运行,即使用户切换到其他应用,音乐也能继续播放。另外,一些需要定期从网络获取数据的应用,也可以使用 Service 在后台定时执行网络请求。
- 分类:有启动服务(Started Service)和绑定服务(Bound Service)两种类型。启动服务通过startService()方法启动,一旦启动就会在后台一直运行,直到被停止;绑定服务通过bindService()方法绑定,与调用它的组件进行交互,当所有绑定都解除后,服务会被销毁。
广播接收器(Broadcast Receiver)
- 定义:广播接收器用于接收系统或应用发出的广播消息,并做出相应的处理。
- 用途:系统会在一些特定事件发生时发送广播,如电量变化、网络连接状态改变等。应用可以注册相应的广播接收器来监听这些事件,并在接收到广播时执行特定的操作。例如,当电量低时,应用可以弹出提示框提醒用户充电。
- 注册方式:有静态注册和动态注册两种方式。静态注册通过在 AndroidManifest.xml 文件中配置,即使应用没有启动,也能接收到广播;动态注册需要在代码中调用registerReceiver()方法进行注册,当应用销毁时,动态注册的广播接收器也会被注销。
内容提供者(Content Provider)
- 定义:Content Provider 用于在不同的应用之间共享数据,它提供了一种统一的接口来访问和操作数据。
- 用途:例如,联系人信息、短信信息等系统数据就是通过 Content Provider 来管理和共享的。应用可以通过 Content Provider 来查询、插入、更新和删除这些数据。
- 使用方式:开发者可以创建自己的 Content Provider 来共享应用内部的数据,也可以通过ContentResolver类来访问其他应用提供的 Content Provider。
系统服务
活动管理器(Activity Manager)
- 功能:负责管理 Activity 的生命周期和任务栈。它会记录每个 Activity 的状态,控制 Activity 的启动、暂停、恢复和销毁等操作,确保应用的界面切换流畅。同时,它还管理应用的任务栈,维护 Activity 之间的导航关系。
窗口管理器(Window Manager)
- 功能:负责管理窗口的显示和布局。它会处理窗口的创建、销毁、大小调整、层次关系等操作,确保各个窗口能够正确地显示在屏幕上。例如,当一个新的对话框弹出时,窗口管理器会将其置于合适的位置和层次。
内容提供者管理器(Content Provider Manager)
- 功能:负责管理 Content Provider 的注册和访问。它会维护所有 Content Provider 的信息,当应用请求访问某个 Content Provider 时,内容提供者管理器会找到对应的 Content Provider 并提供访问接口。
通知管理器(Notification Manager)
- 功能:用于在系统状态栏显示通知信息。开发者可以通过通知管理器创建各种类型的通知,如普通通知、进度条通知、横幅通知等,以提醒用户有新的消息或事件发生。
位置管理器(Location Manager)
- 功能:负责管理设备的位置信息。它可以通过 GPS、网络等方式获取设备的当前位置,并提供位置更新的监听功能。应用可以利用位置管理器来实现地图导航、周边搜索等功能。
Framework分层图
红色圈中的部分就是Framework部分
启动流程
- Boot ROM
- BootLoader
- idle
- init
- zygote
- SystemServer
- Apps
init
init是用户空间的鼻祖
- init 进程初始化:init 进程会进行一系列初始化操作,像挂载文件系统、设置系统属性、解析并执行初始化脚本等。
- 启动关键服务:init 进程会依据配置文件来启动系统的关键服务,例如 Zygote 进程、SurfaceFlinger 、MediaServer等。这些服务是安卓系统正常运行的基础。
配置文件
init 进程主要通过解析配置文件来确定要执行的操作和启动的服务。在安卓系统中,常见的配置文件有:
- init.rc:这是最主要的初始化脚本,它定义了系统启动时需要执行的命令和启动的服务。该文件采用了特定的语法来描述服务、动作和属性。
- init..rc:这是针对特定设备的初始化脚本,用于处理该设备特有的初始化需求。
- init..rc:这是针对特定主板的初始化脚本,处理主板相关的初始化工作。
关键功能
- 挂载文件系统:init 进程会挂载根文件系统以及其他必要的文件系统,像 /system、/data 等。
- 设置系统属性:它会设置一系列系统属性,这些属性可用于控制系统的行为和配置。例如,ro.build.version.sdk 属性表示当前系统的 SDK 版本。
- 启动服务:init 进程会依据配置文件启动各种系统服务,这些服务包括:
- Zygote 进程:负责预加载 Java 虚拟机(JVM)和系统资源,为后续创建应用程序进程提供基础。
- SurfaceFlinger:负责管理和合成系统的图形界面,确保界面的流畅显示。
- MediaServer:提供媒体播放和录制的服务。
- 处理信号和事件:init 进程会监听并处理各种信号和事件,比如系统关机、重启等。当接收到相应的信号时,它会执行相应的操作来保证系统的正常关闭或重启。
zygote
zygote是由init进程fork出来的,在Android中,DVM和ART、应用程序进程以及运行系统的关键服务的SyetemService进程都是由Zygote进程来创建的,所以称之为孵化器。
Zygote 进程是 Android 系统中由 init 进程启动的第一个 Java 进程,它运行着一个 Java 虚拟机(JVM)实例,并且预加载了大量的系统资源和类,能够快速创建新的应用程序进程和部分系统服务进程。
- 加载虚拟机:Zygote 进程启动后,会加载 Dalvik 虚拟机(早期 Android 版本)或者 Android Runtime(ART,从 Android 5.0 开始)。
- 预加载资源和类:Zygote 会预加载系统资源(如系统类库、字体、图片等)和常用的 Java 类(会有上万个类),这样在创建新进程时可以避免重复加载,提高进程创建的速度。
- 监听 Socket:Zygote 进程会创建一个 Socket 并监听特定的端口,等待来自系统服务(如 ActivityManagerService–AMS)的请求,以创建新的应用程序进程。
- SystemServer进程 由 Zygote 创建, SystemServer会创建service, SystemServer 启动的服务可能超过 100 个。
作用
- 提高进程创建速度:由于 Zygote 预加载了系统资源和类,新进程可以通过复制 Zygote 进程快速创建,避免了每次创建进程时都要重新加载这些资源,大大缩短了应用程序的启动时间。
- 节省内存:多个应用程序进程可以共享 Zygote 进程中预加载的资源,减少了内存的重复占用,提高了系统的内存使用效率。
- 保证系统稳定性:Zygote 进程作为一个独立的进程,负责管理 Java 虚拟机和系统资源的加载,降低了应用程序进程对系统的影响,提高了系统的稳定性和可靠性。
面试相关
为什么app从zygote fork而不是从init fork(预加载后fork的进程可以共享)。
怎么优化zygote加快启动速度(比如加载的类有上万个,可以异步并发加载)。
Framework学习之系列文章
Android Framework学习一:系统框架、启动过程
Android Framework学习二:Activity创建及View绘制流程
Android Framework学习三:zygote剖析
作者:帅得不敢出门