1. bootloader
code \bootable\bootloader
开机log;
各种组合键进入不同模式(recovery模式,加载recovery.img和基本文件系统;fastboot模式,可以烧写,不加载);
以及加载boot.img(包含kernel,文件系统等);
2. Kernel
Code Kernel\*
进程号为0;
3. Init
Code \system\core\init\init.c system\core\rootdir\init.rc
第一个用户进程,进程号为1;父进程为kernel;
Init.c的main函数中,解析init.rc;
Init.rc中启动了一些底层linux servers(如adbd,提供adb支持;vold,提供SD挂载;servicemanager;zygote;),并执行了一些命令,rc文件有相应的格式,可以在其中设置开关机动作,如动画,铃音等;
4. 重要的后台程序zygote
Code \frameworks\base\cmds\app_process\app_main.cpp
\frameworks\base\core\jni\AndroidRuntime.cpp
\frameworks\base\core\java\com\android\internal\os\ZygoteInit.java
\dalvik\vm\native\dalvik_system_Zygote.c
启动的第一个服务,对应的命令是/system/bin/app_process;
app_main.cpp中,main函数runtime.star中启动虚拟机,注册JNI函数,并找到zygoteinit的main,进入java环境;
ZygoteInit.java main中,申请端口号为50的监听套接字,用于接收ActivityManageService请求Fork应用程序;并与加载耗时的类和资源;启动systemserver
startSystemServer调用Zygote.forkSystemServer即jni中Dalvik_dalvik_system_Zygote_ forkSystemServer
startSystemServer中,if (pid == 0) 最终会调用invokeStaticMain,从而调用system server main函数;
5. SystemServer
Code frameworks\base\services\java\com\android\server\SystemServer.java
在system_init.cpp system_inith函数中启动AudioFlinger,media playback service,camera service,audio policy service
在init2中,启动必须的server添加到ServiceManage中 如,powermanage;并创建pakagemanageService和activityManageService
6. Launcher
源码:ActivityManagerService.java为入口,packages/apps/launcher*实现
说明:系统启动成功后SystemServer使用xxx.systemReady()通知各个服务,系统已经就绪,桌面程序Home就是在ActivityManagerService.systemReady()通知的过程中建立的,最终调用 resumeTopActivityLocked-> startHomeActivityLocked
7. 解锁
1) 源码:
frameworks/policies/base/phone/com/android/internal/policy/impl/*lock*
2) 说明:系统启动成功后SystemServer调用wm.systemReady()通知WindowManagerService,进而调用PhoneWindowManager,最终通过LockPatternKeyguardView显示解锁界面,跟踪代码可以看到解锁界面并不是一个Activity,这是只是向特定层上绘图,其代码了存放在特殊的位置
8. 开机自启动的第三方应用程序
1) 源码:
frameworks/base/services/java/com/android/server/am/ActivityManagerService.java
2) 说明:系统启动成功后SystemServer调用ActivityManagerNative.getDefault().systemReady()通知ActivityManager启动成功,ActivityManager会通过置变量mBooting,通知它的另一线程,该线程会发送广播android.intent.action.BOOT_COMPLETED以告知已注册的第三方程序在开机时自动启动。
9. 总结
综上所述,系统层次关于启动最核心的部分是zygote(即app_process)和system server,zygote它负责最基本的虚拟机的建立,以支持各个应用程序的启动,而system server用于管理android后台服务,启动步骤及顺序。