一、开机流程
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

3658

被折叠的 条评论
为什么被折叠?



