Android Framework框架与启动过程初识一
文章目录
- Android系统框架
- init
- 配置文件
- 关键功能
- zygote
- 作用
- 面试相关
Android系统框架
-
框架图
-
Framework分层图
红色圈中的部分就是Framework部分
-
启动流程
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加快启动速度(比如加载的类有上万个,可以异步并发加载)。
作者:帅得不敢出门