Android系统启动流程

时间:2022-06-16 16:46:32

     我们先来看一张图,它清晰的说明了整个Android系统的启动流程,参考Android内核开发:图解Android系统的启动过程

     Android系统启动流程

     第一阶段:Android设备上电后,首先会从处理器片上ROM的启动引导代码开始执行,片上ROM会寻找Bootloader代码,并加载到内存。(这一步由“芯片厂商”负责设计和实现)


     第二阶段:Bootloader开始执行,首先负责完成硬件的初始化,然后找到Linux内核代码,并加载到内存。(这一步由“设备厂商”负责设计和实现)


     第三阶段:Linux内核开始启动,初始化各种软硬件环境,加载驱动程序,挂载根文件系统,并执行init程序,由此开启Android的世界。(这一步则是Android内核开发过程中需要涉及的地方)


    第四阶段:Linux内核启动了系统中的第一个进程,init进程,也是root进程。通过脚本文件init.rc启动如下服务。

    1、它启动了一些本地服务(Local Service),也指运行在C++层的系统守护进程,如Service Manager,Installd(后面我们会讲到),Zygote。

    2、启动了一些Android Service,Android服务是指运行在Dalvik虚拟机进程中的服务。

 每一个由init直接启动的本地服务都是一个独立的Linux进程


    Init进程启动Service Mananger

    init.rc位于system/core/rootdir/init.rc中,其中启动servicemanger的代码为:

service servicemanager /system/bin/servicemanager    user system
critical
onrestart restart zygote
onrestart restart media
    第一行关键字service表明Service Manager是以服务的形式启动的,它对应的程序文件和进程名称分别为/system/bin/servicemanager和servicemanager。
    第二行的关键字user表明Service Manager是以系统用户system的身份运行的。

    第三行的关键字critical表明Service Manger是系统的一个关键服务。在系统的运行过程中,关键服务是不可以退出的,一旦退出,就会被系统重启。

    第四行和第五行的关键字onrestart表示一旦Sevice Manger被系统重启,就需要将zygote和media两个进程重新启动。

    Service Manager进程的执行过程,请参考Service Manager进程启动,睡眠等待在进程proc->wait

     

    Init进程启动Installd进程

service installd /system/bin/installd    socket installd stream 600 system system
    Installd进程在端口地址600等待socket的请求。

    表示Installd进程在启动的过程中,需要在内部创建一个名称为"installd"的Socket。这个Socket是用来执行进程间通信的,它的访问权限被设置为600。

   Init进程启动Zygote进程

service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server    socket zygote stream 666    onrestart write /sys/android_power/request_state wake    onrestart write /sys/power/state on    onrestart restart media    onrestart restart netd

    参考Zygote进程的启动流程


    Zygote进程启动System进程

    参考System进程的启动流程第一部分System进程的启动流程第二部分


    启动Launcher进程

     参考Launcher进程的启动

 

    在Launcher进程中启动Home Screen。

    参考Home界面的启动