Android 进阶解密读书笔记(二)——系统启动

Android 系统启动

Android系统启动流程

  1. 启动电源以及系统启动

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

  2. 引导程序 BootLoader

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

  3. Linux 内核启动

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

  4. init 进程启动

    初始化和启动属性服务,并启动 Zygote 进程

  5. Zygote 进程启动

    创建Java虚拟机并为java虚拟机注册 JNI 方法,创建服务器端 Socket,启动 SystemServer 进程

  6. SystemServer 进程启动

    启动 Binder 线程池和SystemServiceManager,并且启动各种系统服务

  7. Launcher 启动

    被SystemServer进程启动的AMS会启动Launcher,Launcher启动后会将已安装应用的快捷图标显示到界面上


init 进程启动流程

  1. 入口函数: system/core/init/init.cpp—>main()函数

    关注点:

    a. 在开始时创建和挂载启动所需的文件目录,其中挂载tmpfs、devpts、proc、sysfs、selinuxfs共5种系统文件

    b. 调用 property_init() 函数对属性服务进行初始化

    c. 调用 signal_handler_init() 函数设置子进程信号处理函数(system/core/init/signal_handler.cpp),主要用于防止 init 进程的子进程成为僵尸进程

    d. 调用 start_property_service() 函数启动属性服务

    e. 调用 parser.ParseConfig("/init.rc") 解析 init.rc 配置文件

    f. 调用 restart_processes() 重启死去的进程

    僵尸进程与危害:在Linux中,父进程使用 fork 创建子进程,在子进程终止之后,如果父进程并不知道子进程已经终止了,这时子进程虽然已经退出了,但是在系统进程表中还为它保留了一定的信息(比如进程号、退出状态、运行时间等),这个子进程就被称为僵尸进程。系统的进程表是一项有限资源,如果系统进程表被僵尸进程耗尽的话,系统就可能无法创建新的进程了

  2. 解析 init.rc

    init.rc 是由 Android 初始化语言(Android Init Language)编写的脚本,这种语言主要包含五种类型语句据:Action、Command、Service、Option和Import

    Action 类型语句采用 ActionParser 来进行解析

    Service 类型语句采用 ServiceParser (system/core/init/service.cpp)来进行解析

  3. init 启动 Zygote 服务

    Android 系统启动(init,zygote) - feibin筱飞 - 博客园

你可能感兴趣的:(Android进阶解密读书笔记,android,linux)