安卓开机启动流程简述

一、开机流程
1.BootLoader阶段(加载引导程序BootLoader到RAM中)
2. kernel 阶段
3. init 进程启动
4. Zygote启动
5. zygote启动SystemServer
6. 启动桌面

二、各个阶段
1.init阶段解析init.rc
init.rc:启动zygote && surfaceflinger(开机动画)
--开机动画 bootanimation_main.cpp
----loadAnimation()解析bootanimation.zip  --desc.txt

2.zygote -- fork出 应用进程与system_server (直接或间接孵化出系统所有的java进程)
(zygote进程在启动的时候会创建java虚拟机环境,然后fork出来的都继承zygote的状态,懂这个意思?)
  也就是说不用单独再给进程创建java虚拟机环境,这种机制也就显著提高了系统的效率和性能
--zygote:
----启动:
    执行文件/system/bin/app_process64 (framework/base/cmds/app_process)
    app_main.cpp --> AndroidRuntime 准备虚拟机(jvm)环境 ,通过JNI调用到java --> ZygoteInit.java的main方法
    ZygoteInit主要执行:
    (1)创建了服务端的Socket,以接受AMS创建新进程的请求
    (2)通过调用preloadClasses()方法,ZygoteInit预加载了一些系统核心类,如Activity和ActivityThread,以及必要的资源和库文件,例如OpenGL和.so库
    (3)启动了system_server进程
    (4)通过runSelectLoop()方法循环等待AMS请求以创建新的进程
ZygoteInit.java 核心接口 forkSystemServer() 还会调用到 Zygote.forkSystemServer() --> nativeForkSystemServer() --> ForkCommon  --> pid_t pid =fork() [这里的fork()是Linux中创建子进程的函数,也就是说,Zygote最终通过调用Linux的fork()来创建一个独立进程]
/frameworks/base/core/jni/com_android_internal_os_Zygote.cpp

zygote启动 有个zygoteServer对于SystemServer进程这个没啥用,所以再孵化SystemServer的时候,需要先调用closeServerSocket()将其关闭
-->ZygoteInit.forkSystemServer() -->... --> SystemServer().run()

3.SystemServer:
--(1)createSystemContext()用于创建一个systemContext,通过这个Context枢纽来获取进程的环境信息
   (2)SystemServiceManager是SystemServer中的一个普通类,负责保存各个SystemService的全局变量,本身不涉及跨进程。。SystemManager与Binder机制紧密关联,实现跨进程
--(1)启动引导类服务 startBootstrapServices()
   (2)启动核心服务 startCoreServices()
   (3)启动其他服务 startOtherServices()
   (4)启动Apex服务 startApexServices()  [android10新增]
---实战:增加系统服务 以添加DevicesService为例:
(1)编写aidl接口:frameworks/base/core/java/android/app/IDevices.aidl   --声明接口
(2)同级目录增加对应ServiceManager:frameworks/base/core/java/android/app/DevicesManager.java    --ServiceManager跨进程规范要求,调用系统服务,会先调用到这个再去跨进程调用到DevicesService
(3)添加系统服务,实现AIDL文件的接口:frameworks/base/services/core/java/com/android/server/DevicesService.java    --实现IDevices.aidl
(4)在Context中的特定位置添加对应的服务名称:frameworks/base/core/java/android/content/Context.java   --其实就是定义了个名字变量
(5)最后,将实现的服务注册到系统中:frameworks/base/services/java/com/android/server/SystemServer.java   -- ServiceManager.addService(xxx,xxx)
(6)在frameworks/base/Android.bp 的metalava_framework_docs_args 增加 "--api-lint-ignore-prefix android.app. " 让lint检查忽略此模块,否则编译会报错 (Android11以上要注意)
可以在串口输入,service list | grep Device 即可看到此服务正在运行

4.ams启动:
SystemServer()进程中的startBootstrapServices()方法来启动ams

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值