常规系统启动从cpu加电,从缺省的寄存器上读取第一条地址,启动BIOS,BIOS进行硬件检查,初始化中断向量、设置寄存器等,BIOS还会从主引导扇区读取512字节的主引导记录MBR,MBR会寻找活动分区的引导记录,读取硬盘上的系统,加载到内存中。下面从操作系统的第一个进程init进程开始
时序图:
1、init
init进程是第一个用户进程,进程号为1。创建了Zygote进程和属性服务(类似windows下的注册表),源码对应目录:system/core/init。
init进程通过init.rc配置文件来启动系统,在init.rc脚本中有一句import /init.${ro.zygote}.rc,在default.prop中定义ro.zygote=zygote32
查看这个文件:init.zygote32.rc
1 | service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server |
socket关键字表示这个zygote进程需要一个名称为”zygote”的socket资源;onrestart关键字表示这个zygote进程重启时需要执行的命令
可见zygote进程是通过app_process进程创建创建的,app_process进程不仅能启动Zygote进程,它可以根据不同的参数实现不同的功能。
2、app_main.cpp的main方法
/system/bin/app_process的源码位于frameworks\base\cmds\app_process\app_main.cpp,在app_main.cpp的main函数中主要做了:
1、处理分发各种参数
2、创建AppRuntime的实例化对象runtime 2
3、调用runtime.start(“com.android.internal.os.ZygoteInit”, args, zygote),类名、参数、true 3
3、AndroidRuntime.start
frameworks/base/core/jni/AndroidRuntime.cpp
AppRuntime的父类是AndroidRuntime,start函数主要做了三件事:
1、通过startVM启动虚拟机 4
2、startReg注册jni方法 5
3、通过jni调用com.android.internal.os.ZygoteInit的main方法 6
之后进入java层
4、ZygoteInit.main
frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
ZygoteInit.main主要做了四件事:
1、创建ZygoteServer对象 7
1 | ZygoteServer zygoteServer = new ZygoteServer(); |
2、ZygoteServer注册socket,socket文件描述符为zygote 8
1 | zygoteServer.registerServerSocket(socketName); |
3、启动SystemServer超级管理进程 9
SystemServer是zygote孵化的第一个进程,负责所有系统的核心服务,如ActivityManagerService
1 | startSystemServer(abiList, socketName, zygoteServer); |
4、开始选择循环,监听处理消息,等待ActivityManagerService通过socket的请求创建新的应用程序进程 10
1 | zygoteServer.runSelectLoop(abiList); |
总结
一、init进程通过执行一段脚本来启动启动Zygote进程,Zygote进程负责其他应用进程的创建,脚本调用app_process的创建虚拟机
二、在app_main.cpp的main函数中:1、实例化了AndroidRuntime对象;2、调用start方法
三、在start方法中:1、startVM开启虚拟机;2、startReg注册JNI方法;3、通过jni调用ZygoteInit的main方法,进入java世界
四、在ZygoteInit的mian方法中:
1、创建ZygoteServer对象;
2、注册socket端口,名为zygote;
3、启动SystemServer超级管理进程,SystemServer负责启动系统的其他关键服务,如AMS、PMS;
4、开启选择循环,监听消息,等待ActivityManagerService通过socket的请求创建新的应用程序进程