当Linux内核启动后就会运行core/init/main.cpp文件中的main函数,在main函数中调用了InitLogging初始化了系统的日志打印工具,另外会根据linux传给main函数的参数args进行判断调用不同的启动函数。以调用init.cpp中的SecondStageMain为例,在SecondStageMain方法中首先调用StartPropertyService启动一些必须的属性服务,其次通过执行命令的方式调用位于core/rootdir/init.rc中的late-init脚本,脚本主要创建一些目录、设置文件目录访问权限,并且设置boot_completed的值等。如下图所示:
值得注意的是不同的启动方式,有不同之处,如下图所示
在脚本中,根据设备的不同调用了core/rootdir/下不同的init.zygote64.rc文件,在该脚本中对应了framework中的base/cmds/app_process/app_main.cpp文件的main函数。如下图所示:
在main函数中创建了AppRuntime对象,并调用了start方法。如下图所示:
AppRuntime是AndroidRuntime的子类,此处调用的是父类的start。
在start中加载了环境配置,是否是root如下图所示:
接下来继续调用onVmCreated和startVm、startReg创建和加载虚拟机所需要的参数,启动、注册虚拟机。
最后通过jni的方式调用start-system-server中的main函数,start-system-server指的就是SystemServer。
在SystemServer的run方法中启动了各种核心服务,比如AMS,WMS、IMS等等。