pollux's Dairy

android-6.0.0源码分析-zygote启动过程

字数统计: 876阅读时长: 5 min
2020/03/25 Share

常规系统启动从cpu加电,从缺省的寄存器上读取第一条地址,启动BIOS,BIOS进行硬件检查,初始化中断向量、设置寄存器等,BIOS还会从主引导扇区读取512字节的主引导记录MBR,MBR会寻找活动分区的引导记录,读取硬盘上的系统,加载到内存中。下面从操作系统的第一个进程init进程开始

时序图:
image-20200325171511529

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
2
3
4
5
6
7
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
class main
socket zygote stream 660 root system
onrestart write /sys/android_power/request_state wake
onrestart write /sys/power/state on
onrestart restart media
onrestart restart netd

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的请求创建新的应用程序进程

参考

https://blog.csdn.net/luoshengyang/article/details/6768304

CATALOG
  1. 1. 1、init
  2. 2. 2、app_main.cpp的main方法
  3. 3. 3、AndroidRuntime.start
  4. 4. 4、ZygoteInit.main
  5. 5. 总结
  6. 6. 参考