Android系统进程启动流程

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信息,并将其封装成一个快捷图标显示在系统屏幕

猜你喜欢

转载自blog.csdn.net/qq_36310162/article/details/107462989