大家好,今天来为大家分享Android系统初始化进程详解的一些知识点,和的问题解析,大家要是都明白,那么可以忽略,如果不太清楚的话可以看看本篇文章,相信很大概率可以解决您的问题,接下来我们就一起来看看吧!
android init process Android Init Language
1.init.rc的解析
从android init process一文中可以看出,init.rc的解析是从init进程的main函数开始进行的。
//安卓8.0
//init进程的main函数解析init.rc代码。
//init.rc 文件的解析器条目/system/core/init/init_parse.cpp
解析器解析器=Parser:GetInstance();
//1 为解析类添加解析能力
parser.AddSectionParser("服务",std:make_unique());
parser.AddSectionParser("on", std:make_unique());
parser.AddSectionParser("导入", std:make_unique());
std:string bootscript=GetProperty("ro.boot.init_rc", ""); //2 环境变量中有ro.boot.init_rc吗?
如果(bootscript.empty()){
parser.ParseConfig("/init.rc"); //3 解析
parser.set_is_system_etc_init_loaded(
parser.ParseConfig("/system/etc/init")); //解析system/etc/init文件夹下左右rc文件。
parser.set_is_vendor_etc_init_loaded(
parser.ParseConfig("/vendor/etc/init"));
parser.set_is_odm_etc_init_loaded(parser.ParseConfig("/odm/etc/init"));
} 别的{
parser.ParseConfig(bootscript);
parser.set_is_system_etc_init_loaded(true);
parser.set_is_vendor_etc_init_loaded(true);
parser.set_is_odm_etc_init_loaded(true);
}这是Android init进程解析init.rc文件的代码,
Parser是解析init.rc类文件的入口。 parser.AddSectionParser()函数是添加解析init.rc类文件的能力。根据init.rc文件每一行的内容,会选择不同的处理器。例如:ActionParser。代码2是判断是否有启动配置脚本,根据是否有启动配置脚本进行解析。一般是系统默认的。如果没有启动配置脚本,则使用Android系统的init.rc进行解析。解析在代码3处,ParseConfig函数为解析函数//代码位置/system/core/init/init_parse.cpp
bool Parser:ParseConfig(const std:字符串路径) {
if (is_dir(path.c_str())) {
返回ParseConfigDir(路径);
}
返回ParseConfigFile(路径); //执行文件解析,init.rc被解析
}
bool Parser:ParseConfigFile(const std:字符串路径) {
LOG(INFO) "正在解析文件"路径".";
定时器t;
std:字符串数据;
if (!read_file(path, data)) { //将文件内容读入data,
返回假;
}
data.push_back("n"); //TODO: 修复parse_config。
解析数据(路径,数据); //内容解析函数,分配给各个解析类eg: ActionParse
for (const auto sp :section_parsers_) {
sp.second-EndFile(路径);
}
LOG(VERBOSE) "(解析"路径"花了"t"。)";
返回真;
}
void Parser:ParseData(const std:字符串文件名,const std:字符串数据) {
//TODO: 使用带有const 输入的解析器并删除此副本
std:vectordata_copy(data.begin(), data.end());
data_copy.push_back(" ");
parse_state 状态; //解析过程中用到的结构体,/system/core/init/parse.h parse.cpp
state.filename=filename.c_str();
状态.行=0;
state.ptr=data_copy[0];
状态.nexttoken=0;
SectionParser*section_parser=nullptr;
std:向量参数;
为了(;) {
switch(next_token(state)) {//更多next_token读取state中的内容
案例T_EOF:
如果(节解析器){
section_parser-EndSection(); //结束对文件的分析,
}
返回;
case T_NEWLINE: //分析每一行的命令
状态.line++;
if (args.empty()) {
休息;
}
if (section_parsers_.count(args[0])) {
如果(节解析器){
section_parser-EndSection();
}
//根据args[0],也就是每个init.rc执行逻辑的第一个参数,选择解析的类,选择我们之前添加的ActionParse等
section_parser=section_parsers_[args[0]].get();
std:string ret_err;
if (!section_parser-ParseSection(args, ret_err)) {
parse_error(state, "%sn", ret_err.c_str());
section_parser=nullptr;
}
} else if (section_parser) {
std:string ret_err;
if (!section_parser-ParseLineSection(args, state.filename,
state.line, ret_err)) { //解析一行
parse_error(state, "%sn", ret_err.c_str());
}
}
args.clear();
休息;
案例T_TEXT:
args.emplace_back(state.text);
休息;
}
}
从上面的代码中我们可以看到parseData函数读取并处理了init.rc。它根据读取内容的各个模块(例如:Action为on)选择解析所需的Parse,然后对init.rc中的各个模块进行处理。每一行都会被解析。
1.1:实际解析类的分析
位置/system/core/init/action.cpp ActionParse
//负责根据读取的args在代码类中生成动作
bool ActionParser:ParseSection(const std:向量参数,
std:字符串* 错误){
std:vectortriggers(args.begin() + 1, args.end());
if (triggers.size() 1) {
*err="动作必须有触发器";
返回假;
}
自动操作=std:make_unique(假);
if (!action-InitTriggers(触发器,错误)) {
返回假;
}
action_=std:move(动作);
返回真;
}
//解析一行指令,并将该命令添加到其所属的动作中。
bool ActionParser:ParseLineSection(const std:vector args,
const std:string 文件名,int 行,
std:string* err) const {
返回动作_? action_-AddCommand(参数、文件名、行、错误) : false;
}
//一个action解析完成,将解析后的action添加到ActionManager中。
无效ActionParser:EndSection() {
if (action_action_-NumCommands() 0) {
ActionManager:GetInstance().AddAction(std:move(action_));
}
}上面的代码是构建action和保存action的过程。至此,init.rc中的一个action就已经解析完成了。 ActionManager是所有Action的管理类。所有解析的操作均使用std:vectoractions_ 集合保存。
2.Action的执行。
//1 执行动作和函数绑定/system/core/init/builtins.cpp
const 内置函数映射function_map;
Action:set_function_map(function_map);
.
//2 这里是上面的action分析后形成的ActionManager类。
ActionManager am=ActionManager:GetInstance();
//执行早期初始化动作
am.QueueEventTrigger("early-init");
//查询手写动作是否已经执行
//对等待冷启动完成的操作进行排队,以便我们知道ueventd 已设置所有/dev.
am.QueueBuiltinAction(wait_for_coldboot_done_action, "wait_for_coldboot_done");
//.这样我们就可以开始对需要/dev 中的内容的操作进行排队。
am.QueueBuiltinAction(mix_hwrng_into_linux_rng_action, "mix_hwrng_into_linux_rng");
am.QueueBuiltinAction(set_mmap_rnd_bits_action, "set_mmap_rnd_bits");
am.QueueBuiltinAction(set_kptr_restrict_action, "set_kptr_restrict");
am.QueueBuiltinAction(keychord_init_action, "keychord_init");
am.QueueBuiltinAction(console_init_action, "console_init");
//触发所有启动操作以让我们开始。
//执行动作初始化
am.QueueEventTrigger("init");
//如果/dev/hw_random 或/dev/random 则重复mix_hwrng_into_linux_rng
//wait_for_coldboot_done 之后没有立即准备好
am.QueueBuiltinAction(mix_hwrng_into_linux_rng_action, "mix_hwrng_into_linux_rng");
//不要在充电器模式下挂载文件系统或启动核心系统服务。
std:string bootmode=GetProperty("ro.bootmode", ""); //查询当前启动模式
if (bootmode=="充电器") {
am.QueueEventTrigger("充电器"); //充电时执行充电器动作
} 别的{
am.QueueEventTrigger("late-init"); //执行late-init动作,不收费
}
//根据属性的当前状态运行所有属性触发器。
am.QueueBuiltinAction(queue_property_triggers_action, "queue_property_triggers");
while (true) { //启动循环,执行actionManager中的每个action
//默认情况下,休眠直到有事情发生。
int epoll_timeout_ms=-1;
if (!(waiting_for_prop || ServiceManager:GetInstance().IsWaitingForExec())) {
am.ExecuteOneCommand(); //执行动作的命令
}
if (!(waiting_for_prop || ServiceManager:GetInstance().IsWaitingForExec())) {
restart_processes(); //.rc文件中的服务由ServiceManager管理,与actionManager类似。
//如果有一个进程需要重新启动,请及时唤醒。
if (process_needs_restart_at !=0) {
epoll_timeout_ms=(process_needs_restart_at - 时间(nullptr)) * 1000;
如果(epoll_timeout_ms 0)epoll_timeout_ms=0;
}
//如果还有更多工作要做,请立即再次醒来。
if (am.HasMoreCommands()) epoll_timeout_ms=0;
}
epoll_eventev;
int nr=TEMP_FAILURE_RETRY(epoll_wait(epoll_fd, ev, 1, epoll_timeout_ms));
如果(nr==-1){
PLOG(ERROR) "epoll_wait 失败";
} 否则如果(nr==1) {
((void (*)()) ev.data.ptr)(); //3
关于Android系统初始化进程详解的内容到此结束,希望对大家有所帮助。
【Android系统初始化进程详解】相关文章:
用户评论
听说Android系统启动一个重要的进程叫“init”?
有15位网友表示赞同!
学一下Android系统的init进程,感觉很重要啊!
有5位网友表示赞同!
想了解下Android手机启动后的流程,init进程是什么样的?
有9位网友表示赞同!
学习Android开发需要知道init进程吗?
有9位网友表示赞同!
安卓系统里面有很多神秘的进程名,init进程是哪个类型的?
有11位网友表示赞同!
什么时候才能看到代码中的init进程运作呢?
有6位网友表示赞同!
有没有详细解释一下init进程的角色和功能啊?
有8位网友表示赞同!
了解init进程能够帮助我更好地理解Android系统吗?
有17位网友表示赞同!
想研究如何修改或者扩展Android系统的init进程。
有20位网友表示赞同!
最近在用Android调试,遇到一个跟init进程相关的bug不知该如何解决?
有9位网友表示赞同!
感觉初始化程序的重要性很高啊,学习一下init进程的机制很有帮助吧!
有7位网友表示赞同!
如果想了解Android系统最基础的操作层面,应该从 init 进程开始学习吗?
有8位网友表示赞同!
对Android系统开发很感兴趣,想深入了解init进程的功能和源码。
有11位网友表示赞同!
在阅读Android的源码时,遇到了很多关于init进程的内容,感觉比较困惑。
有11位网友表示赞同!
有没有一些开源的项目可以参考学习Android的init进程实现?
有18位网友表示赞同!
想了解一下不同版本的Android系统中,init进程有哪些区别?
有5位网友表示赞同!
我是不是可以自己构建一个Android系统的init进程呢?
有13位网友表示赞同!
在开发自定义ROM的时候,需要对init进程进行修改吗?
有17位网友表示赞同!
有没有一些工具或者代码分析软件可以直接查看init进程的运行状态?
有14位网友表示赞同!