1.main
//android10\system\core\init\main.cpp
int main(int argc, char** argv) {
if (argc > 1) {
if (!strcmp(argv[1], "second_stage")) {//4.second_stage
r.eturn SecondStageMain(argc, argv);
}
}
}
2.SecondStageMain
//android10\system\core\init\init.cpp
int SecondStageMain(int argc, char** argv) {
property_init(); //2.1.初始化系统属性
//2.2.创建Epoll对象
Epoll epoll;
if (auto result = epoll.Open(); !result) {
PLOG(FATAL) << result.error();
}
//注册epoll
InstallSignalFdHandler(&epoll);
//开启属性服务
StartPropertyService(&epoll);
//加载init.rc文件
LoadBootScripts(am, sm);
}
2.1.property_init
//android10\system\core\init\property_service.cpp
void property_init() {
mkdir("/dev/__properties__", S_IRWXU | S_IXGRP | S_IXOTH); //创建目录
if (__system_property_area_init()) {}//初始化目录内存空间
}
(来自chaggpt的回答)
在 Android 系统初始化的过程中,`property_init()` 函数被用于初始化系统属性(system properties)。系统属性是一种键值对,用于存储和传递设备的配置信息、状态和运行时参数。
具体来说,`property_init()` 主要执行以下几个任务:
- 读取默认属性值
从预定义的源(通常是设备树或其他配置文件)中读取系统属性的默认值。这些默认值在设备启动时会被加载。
- 处理属性覆盖
如果设备的启动过程中存在覆盖属性的机制,`property_init()` 将会处理这些覆盖。覆盖属性通常是由引导加载程序、命令行参数或其他配置文件提供的。
- 应用属性值
将最终确定的属性值应用到系统中。这些属性值可以在系统的整个生命周期中用于配置各种组件、决策和行为。
系统属性在 Android 中被广泛用于配置设备的各个方面,例如网络设置、硬件配置、调试开关等。`property_init()` 通常是在 Android 系统启动的早期阶段调用的,确保在其他组件和服务启动之前,系统属性已经得到适当的初始化。
请注意,具体的系统属性的定义和用途可能因设备型号、Android 版本和制造商而异。这些属性可以通过 Android 的属性服务(Property Service)进行访问和管理。
2.2.Epoll
`epoll` 是一种 I/O 复用机制,通常用于 Linux 操作系统中。它允许程序监控多个文件描述符上的事件,以便在它们变为可读、可写或发生错误时得到通知。`epoll` 通常用于提高 I/O 操作的效率,特别是在需要同时处理多个套接字连接的情况下。
使用 `epoll`的情景包括替代传统的 `select` 和 `poll`,尤其在高并发的网络编程中能够更有效地处理。通过注册多个文件描述符,程序可以等待其中之一或多个就绪,从而减少了不必要的轮询操作。
在 `epoll` 的使用过程中,程序需要创建一个 `epoll` 对象。通过调用 `epoll_create` 函数,可以创建这个对象,并得到一个文件描述符。之后,程序可以使用这个文件描述符来注册、删除文件描述符,并等待事件通知。
`epoll` 在 Android 和 Linux 上广泛应用于高效的事件驱动编程,特别适用于处理大量并发连接或大规模数据的场景。