我们先来看一张图,它清晰的说明了整个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第一行关键字service表明Service Manager是以服务的形式启动的,它对应的程序文件和进程名称分别为/system/bin/servicemanager和servicemanager。
critical
onrestart restart zygote
onrestart restart media
第二行的关键字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 systemInstalld进程在端口地址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进程启动System进程
参考System进程的启动流程第一部分,System进程的启动流程第二部分。
启动Launcher进程
在Launcher进程中启动Home Screen。
参考Home界面的启动。