(注意:这里并不包括开机动画,而是开机前 “Android” Logo 出现的那个画面,开机动画出现之前还需要进行各种加载,开机动画是在“Android” Logo 出现之后才播放的)
3. SystemServer -- 大部分 Android 系统服务所在地SystemServer 是 Android 进入 Launcher 前的最后准备,它提供了众多的由“Java”语言编写的系统服务。
如果 init.rc 中为 zygote 指定启动参数 --start-system-server,那么 ZygotyeInit 就会调用 startSystemServer 来进入 SystemServer。
startSystemServer函数解析:
首先 ZygoteInit 通过 Zygote.forkSystemServer 来生成一个新的线程(fork),用于承载各种系统服务。(源码角度:Zygote 内部由 Native 函数 Dalvik_dalvik_system_Zygote_forkSystemServer 来进一步实现,最终调用底层接口的 fork 接口来实际产生进程)
根据fork特性,子进程与父进程将获得相同的代码环境。pid为0为子进程,否则为父进程;如果是前者,则进一步调用 handleSystemServerProcess(parseArgs) 函数来完成最核心的工作 -- “启动各系统服务”(源码角度:handleSystemServerProcess 方法将 startSystemServer 中的 parsedArgs.remainingArgs 参数传给 RuntimeInit.zygoteInit,后者又调用 nativeZygoteInit 函数)
nativeZygoteInit 调用后,接着,三个重要的 static 函数就要被执行了:init1 - 完成本地Service(SurfaceFlinger、AudioFlinger等)启动,完成后调用 init2、init2 - 新建一个新的带 Looper 的线程 ServerThread来启动 Java层各 Service
后语上面对 Android 系统启动做了一个简述,意在给大家展现一个整体流程,其中每个环节涉及的知识点只是浅浅掠过,笔者也尚在学习与探索中,希望在后续再作详细分析。
资源推荐Gityuan - Android 开篇
老罗的Android之旅
《深入理解 Android 内核设计思想》 由浅入深,落实到源码层面上进行探索,知识很有深度