Android 系统启动流分析系统启动流分析 & Zygote启动流程分析启动流程分析
本文是基于Android 7.1进行分析
Zygote在Android系统扮演着不可或缺的角色,Android系统的启动首先需要Zygote参与,比如启动SystemService , 还有一个就是孵化应用的进程,比如我们创建一个Activity也是需要
Zygote参与.
Zygote 启动分为两个部分启动分为两个部分:
1.Native程序涉及文件
system/core/ini/service.cpp
system/core/rootdir/init.rc
system/core/rootdir/init.zygote64_32.rc
frameworks/base/cmds/app_process/Android.mk
frameworks/base/core/jni/AndroidRuntime.cpp
2.Java程序 涉及文件路径
frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
frameworks/base/services/java/com/android/server/SystemServer.java
我们先看一下系统启动的流程图先有一个大概的了解我们先看一下系统启动的流程图先有一个大概的了解
一一.底层程序底层程序
那么Zygote是怎么启动的? 首先是开机的时候会Linux会先启动init进行,这也是手机开机的第一个进程,这个进程启动之后会去加载启动文件init.rc 而init进程的源代码位于
system/core/ini/service.cpp 文件,是由 Service::Start()函数来解释init.rc文件中的命令,而pid_t pid = fork(); 是 0 的时候则返回的是子线程.非0 返回的是父进程.
bool Service::Start() {
......省略代码.........
pid_t pid = fork();
if (pid == 0) {
umask(077);
for (const auto& ei : envvars_) {
add_environment(ei.name.c_str(), ei.value.c_str());
}
for (const auto& si : sockets_) {
int socket_type = ((si.type == "stream" ? SOCK_STREAM :
(si.type == "dgram" ? SOCK_DGRAM :
SOCK_SEQPACKET)));
const char* socketcon =
!si.socketcon.empty() ? si.socketcon.c_str() : scon.c_str();
int s = create_socket(si.name.c_str(), socket_type, si.perm,
si.uid, si.gid, socketcon);
if (s >= 0) {
PublishSocket(si.name, s);
}
}
......省略代码.........
return true;
}
我们来查看一下init.rc文件 文件位置在 system/core/rootdir/ 文件夹下
查看一下文件夹结构