一、启动电源以及系统启动
- 当电源按下时引导芯片代码从预定义的地方(固化在ROM)开始执行,加载引导程序BootLoader到RAM,然后执行。
二、引导程序BootLoader
- 引导程序BootLoader是在Android操作系统开始运行前的一个小程序,它的主要作用是把系统OS拉起来并运行。
三、Linux内核启动
- 当内核启动,设置缓存、被保护存储器、计划列表、加载驱动。在内核完成系统设置后,它首先在系统文件中寻找init.rc(启动脚本)文件,并启动init进程
注:init.rc是一个非常重要的配置文件,它是由Android初始化语言(Android Init Language)编写的脚本,这种语言主要包含五种类型语句:Action、Command、Service、Option和Import。在Android8.0中对init.rc文件进行了拆分,每个服务对应一个rc文件。
四、init进程启动
- init进程是Android系统中用户空间的第一个进程,进程号为1,是Android系统启动流程中一个关键的步骤。
- init进程做的工作比较多,主要用来创建和挂载启动所需的文件目录、初始化和启动属性服务、启动Zygote进程。
4.1 Zygote
- 在Android系统中,DVM和ART、应用程序进程以及运行系统的关键服务的SystemServer进程都是由Zygote进程来创建的,我们称它为孵化器。它通过fock的形式来创建应用程序进程和SystemServer进程,由于Zygote进程在启动时会创建DVM或者ART,因此通过fock而创建的应用程序进程和SystemServer进程可以在内部获取一个DVM或者ART的实例副本。
- Zygote进程是在init进程启动时创建的,起初Zygote进程的名称并不是叫"zygote",而是叫"app_process",这个名称是在Android.mk中定义的,Zygote进程启动后,Linux系统下的pctrl系统会调用app_process,将其名称换成了"zygote"。
- 从Android5.0开始,Android开始支持64位程序,Zygote也就有了32位和64位的区别,分别对用不同的脚本:init.zygote32.rc、init.zygote32_64.rc、init.zygote64.rc、init.zygote64_32.rc
4.2 Zygote进程启动过程
- 创建AppRuntime并调用其start方法,启动Zygote进程。
- 创建Java虚拟机并为Java虚拟机注册JNI方法。
- 通过JNI调用ZygoteInit的main函数进入Zygote的Java框架层。
- 通过registerZygoteSocket方法创建服务器端Socket,并通过runSelectLoop方法等待AMS的请求来创建新的应用程序进程。
- 启动SystemServer进程。
4.3 SystemServer进程
- 启动Binder线程池,这样就可以与其他进程进行通信。
- 创建SystemServiceManager,其用于对系统的服务进行创建、启动和生命周期管理。
- 启动各种系统服务(引导服务、核心服务、其他服务)。
五、Launcher启动
- 通俗来讲Launcher就是Android系统的桌面,它的作用主要有一下两点:
- 作为Android系统的启动器,用于启动应用程序。
- 作为Android系统的桌面,用于显示和管理应用程序的快捷图标或者其他桌面组件。
网友评论