Init进程
1.简介:
init进程是android系统中用户空间的第一个进程
目录:android/system/core/init
职责:创建Zygote和属性服务等
2.Android系统启动流程
1.启动电源 -- 引导芯片开始从预定义扇区开始执行(固化在ROM),加载引导程序BootLoader到RAM执行
2.BootLoader -- Android系统开始运行前的一个小程序,作用是把系统os拉起并运行
3.Linux内核启动 -- 内核完成系统设置后寻找init文件,启动root进程或系统第一个进程
4.启动init进程
3.init入口函数分析
system/core/init/init.cpp
步骤:创建文件并挂载 -- 初始化属性相关资源 -- 启动属性服务 -- 解析init.rc
4.init.rc
system/core/i/rootdir/init.rc
.rc是一个配置文件,由AIL编写的脚本
Android7.0后对rc文件进行了拆分,每个服务一个rc文件 -- Zygote服务在init.Zygote.rc中定义system/core/init/init.cpp
5.init启动Zygote
init/builtins.cpp
init/service.cpp
进入cmds/app_process/app_main.cpp目录启动Zygote
6.属性服务
init/property_service.cpp
类似windows注册表,采用键值对记录用户/软件的使用信息,即使软件/系统重启也能根据注册表记录进行相应的初始化工作
在init.cpp中 property_init() / start_property_service() 方法与属性服务相关(初始化属性服务配置/启动属性服务)
创建非阻塞Socket并调用Lister对其监听,这样创建的socket就成了server
init进程总结:
1.创建文件并挂载
2.初始化和启动属性服务
3.解析ini.rc配置文件并启动Zygote 进程
Zygote进程
通过JNI调用ZygoteInit的main函数后,Zygote便进入了Java框架层 -- Zygote开创了Java框架层
base/core/java/com/android/internal/os/ZygoteInit.java
base/core/java/com/android/internal/os/RuntimeInit.java
SystemServer进程
启动binder线程池 -- SystemServer进程就可以使用binder与其他线程通信了
创建 SystemServiceManager -- 对系统的服务进行创建启动和生命周期的管理
启动系统服务
ServiceManager -- 用来管理系统中的各种service,用于系统C/S架构中的Binder机制通信
C端要使用某个服务 -- 到ServiceManager查询Service的相关信息 -- 根据信息与Service所在进程建立通讯通路 -- 使用
ActivityManagerService将Launcher启动起来
systemServer启动过程会启动PackagerManagerService,PMS启动后将系统app安装完成
Launcher启动
android系统启动的作后一步是启动一个Launcher应用程序,用来显示系统中已经安装的应用程序
Luncher在启动过程中会请求PackageManagerService返回系统中已安装的app信息,并将其封装成一个快捷图标显示在系统屏幕