概述
Android启动过程大致可分为bootloader引导,装载和启动Linux内核,启动Android系统3个大阶段。
其中启动Android系统可以细分为启动Init进程、启动Zygote进程、启动SystemService、启动Home等多个阶段。
1.引导启动bootloader
bootloader做的事情主要有:初始化CPU时钟,内存,串口等;设置linux启动参数;加载Linux各种各样的内核镜像到SDRAM中。
开机按组合键可进入相应的模式,fastboot/recovery模式/按开机则正常启动流程。
- fastboot模式:通过USB来更新手机分区镜像的协议
- recovery模式:Android特有的升级系统,可以进行恢复出厂设置、执行OTA、补丁、固件升级
2.linux内核启动
内核启动时,设置缓存、被保护存储器、计划列表,加载驱动。当内核完成系统设置,它首先在系统文件中寻找”init”文件,然后启动root进程或者系统的第一个进程。
3.启动Android系统
3.1 Init进程
Init进程,它是一个由内核启动的用户级进程。内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。init始终是第一个进程.
- init main函数
system/core/init/init.cpp
int main(int argc, char** argv) {
....
//第一阶段,挂载文件系统和创建文件目录
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));
mount("sysfs", "/sys", "sysfs", 0, NULL);
}
//初始化内核log系统
open_devnull_stdio();
klog_init();
klog_set_level(KLOG_NOTICE_LEVEL);
...
if (!is_first_stage) {
// Indicate that booting is in progress to background fw loaders, etc.
close(open("/dev/.booting", O_WRONLY | O_CREAT | O_CLOEXEC, 0000));
//初始化属性相关资源
property_init();
// If arguments are passed both on the command line and in DT,
// properties set in DT always have priority over the command-line ones.
process_kernel_dt();
process_kernel_cmdline();
// Propagate the kernel variables to internal variables
// used by init as well as the current required properties.
export_kernel_boot_props();
}
//设置SELinux policy策略
// Set up SELinux, including loading the SELinux policy if we're in the kernel domain.
selinux_initialize(is_first_stage);
....
//创建epoll句柄
epoll_fd = epoll_create1(EPOLL_CLOEXEC);
if (epoll_fd == -1) {
ERROR("epoll_create1 failed: %s\n", strerror(errno));
exit(1);
}
signal_handler_init();
property_load_boot_defaults();
export_oem_lock_status();
//启动属性服务
start_property_service();
const BuiltinFunctionMap function_map;
Action::set_function_map(&function_map);
Parser& parser = Parser::GetInstance();
parser.AddSectionParser("service",std::make_unique<ServiceParser>());
parser.AddSectionParser("on", std::make_unique<ActionParser>());
parser.AddSectionParser("import", std::make_unique<ImportParser>());
//解析init.rc。
parser.ParseConfig("/init.rc");
//解析完成配置文件之后,会得到一系列的action动作。init和boot。
ActionManager& am = ActionManager::GetInstance();
...
//while循环不断调用ExecuteOneCommand函数时,匹配的action。
while (true) {
....
//通过epoll来监听,处理属性服务相关的事情。
epoll_event ev;
int nr = TEMP_FAILURE_RETRY(epoll_wait(epoll_fd, &ev, 1, timeout));
if (nr == -1) {
ERROR("epoll_wait failed: %s\n", strerror(errno));
} else if (nr == 1) {
((void (*)()) ev.data.ptr)(