android 系统启动

1. init进程启动过程

  init进程是Android系统中用户空间的第一个进程,进程号为1,是Android系统启动流程中的一个关键的步骤,作为第一个进程,它创建Zygote和属性服务等。

1.1 引入init进程 

  1.1.1 启动电源以及系统启动

    当电源按下时引导芯片代码从预定的地方(固化在ROM)开始执行。加载引导程序BootLoader到RAM中,然后执行

  1.1.2 引导程序BootLoader

    引导程序BootLoader是在Android操作系统开始运行发的一个小程序,它的主要作用是把系统OS拉起来并运行

  1.1.3 Linux内核启动

    当内核启动时,设置缓存、被保护存储器、计划列表、加载驱动。在内核完成系统设置后,它首先在系统文件中寻找init.rc文件,并启动init进程

  1.1.4 init进程启动

    init进程主要是用来初始化和启动属性服务,也用来启动Zygote进程。在init的方法里创建和挂载启动所需的文件目录,其中挂载了tmpfs、devpts、proc、sysfs和sellinuxfs共5种文件系统,以及对属性服务进行初始化

  1.1.5总结:

    按下启动电源时,系统启动后会加载引导程序,引导程序又启动Linux内核,在Linux内核加载完成后,第一件事情就是要启动init进程。

1.2 init进程启动总结

  init进程启动做了很多工作,总的来说主要做了以下三件事:

    (1)创建和挂载启动所需的文件目录

    (2)初始化和启动属性服务

    (3)解析init.rc配置文件并启动Zygote进程 

 

2.Zygote进程启动过程 

init启动Zygote时主要是调用 app_main.cpp的main函数中的AppRuntime的start方法来启动Zygote进程的

init ->  app_main.cpp(运行main方法) ->AndroidRuntime(运行start方法,方法里包括startVm(启动虚拟机),startReg(为java虚拟机注册JNI方法))->ZygoteInit(通过反射调用 ZygoteInit的main,ZygoteInit是java类)

解析:app_main.cpp 进入这个类的main方法,在此方法里调用了AndroidRuntime的start方法

   AndroidRuntime.cpp 这个类里执行了startVm去启动虚拟机,执行startReg方法去为java虚拟注册JNI方法,再通过反射,把ZygoteInit.java的main方法调起来,至此,Zygote便进入了java框架层,此前是没有任何代码进入java框架层的

   ZygoteInit.java 的main方法主要做了以下4件事:

    (1) 创建一个Server端的Socket.用于等待ActivityManagerService请求Zytote来创建新的应用程序进程

    (2) 预加载类和资源

    (3)启动SystemServer进程 (系统的服务也会由SystemServer进程启动起来)

    (4)等等AMS请求创建新的应用程序进程 

posted @   白一粥  阅读(81)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示