有时候分析log时会发现在init进程中耗时较长, 大约过了8s才启动zygote进程, 由于init.rc中的命令都必须按照顺序来执行, 并且是一个一个执行串行了. 这就会发生一个命令执行时间太长阻塞下一个命令执行。这时就需要将init进程执行命令花费时间的log打开, 来具体定位到底执行哪个命令耗时比较长.7.0具体代码位置在:system/core/init/action.cpp
void Action::ExecuteCommand(const Command& command) const {
Timer t;
int result = command.InvokeFunc(); //执行命令对应的函数
if (klog_get_level() >= KLOG_INFO_LEVEL) { //判断klog level是否大于KLOG_INFO_LEVEL
std::string trigger_name = BuildTriggersString();
std::string cmd_str = command.BuildCommandString();
std::string source = command.BuildSourceString();
INFO("Command '%s' action=%s%s returned %d took %.2fs\n",
cmd_str.c_str(), trigger_name.c_str(), source.c_str(),
result, t.duration()); //将命令执行时间,以及所执行的命令以及所在文件路径打印出.
}
}
通过查看开机过程kernel log发现并没有这些log, 主要是由于要执行的命令太多了,整个系统在init进程中要做很多事情,如果都打印出来对开机性能有影响.