本文的分析基于Android 8.1源码。
Android系统启动与应用程序的启动流程、四大组件原理、AMS、ClassLoader等息息相关,因此了解Android系统启动流程对深入理解Android有很大的帮助。
本文将分为以下几个小节讲述Android系统的系统流程,分别是:init进程启动、Zygote进程启动、SystemServer进程启动以及Launcher进程启动。
一、init进程启动
都知道当手机关机时不会启动任何一个进程,所以在init进程启动前,Android就为进程的启动做了很多铺垫。具体为:按下电源键加载BootLoader、拉起系统OS、启动Linux内核…但由于本人暂未学到Linux内核,因此前面的暂不做分析(当我没说emmm…)
本节涉及到的文件有:
文件 | 路径 |
init.cpp | system/core/init/init.cpp |
init.rc | system/core/rootdir/init.rc |
init.zygote64_32.rc | system/core/rootdir/init.zygote64_32.rc |
service.cpp | system/core/init/service.cpp |
builtins.cpp | system/core/init/builtins.cpp |
1.1 init.main()
Linux内核启动后,运行的第一个进程是init进程。
system/core/init/init.cpp |
int main(int argc, char** argv) {
if (!strcmp(basename(argv[0]), "ueventd")) {
return ueventd_main(argc, argv);
}
if (!strcmp(basename(argv[0]), "watchdogd")) {
return watchdogd_main(argc, argv);
}
if (REBOOT_BOOTLOADER_ON_PANIC) {
InstallRebootSignalHandlers();
}
add_environment("PATH", _PATH_DEFPATH);
bool is_first_stage = (getenv("INIT_SECOND_STAGE") == nullptr);
//注释1:挂载必须的文件路径
if (is_first_stage) {
……
mount("tmpfs", "/dev", "tmpfs", MS_NOSUID, "mode=0755");
mkdir("/dev/pts", 0755);
mkdir("/dev/socket", 0755);
mount("devpts", "/dev/pts", "devpts", 0, NULL);
#define MAKE_STR(x) __STRING(x)
mount("proc", "/proc", "proc", 0, "hidepid=2,gid=" MAKE_STR(AID_READPROC));
// Don't expose the raw commandline to unprivileged processes.
chmod("/proc/cmdline", 0440);
gid_t groups[] = { AID_READPROC };
setgroups(arraysize(groups), groups);
mount("sysfs", "/sys", "sysfs", 0, NULL);
mount("selinuxfs", "/sys/fs/selinux", "selinuxfs", 0, NULL);
mknod("/dev/kmsg", S_IFCHR | 0600, makedev(1, 11));
mknod("/dev/random", S_IFCHR | 0666, makedev(1, 8));
mknod("/dev/urandom", S_IFCHR | 0666, makedev(1, 9));
//system/core/init/init_first_stage.cpp
SetInitAvbVersionInRecovery();
//加载及初始化SELinux
selinux_initialize(true);
……
}
//初始化Kernel Log
InitKernelLogging(argv);
//bionic/libc/bionic/system_properties.cpp
//注释2:初始化属性服务
property_init();
……
//
signal_handler_init();
//导入默认的环境变量
//"/system/etc/prop.default,/odm/default.prop,/vendor/default.prop"
p