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请求创建新的应用程序进程 

android 系统启动

上一篇:【SpringBoot2 从0开始】springboot 与 spring


下一篇:Java自学-IO流(2)