有时候分析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进程中要做很多事情,如果都打印出来对开机性能有影响.
具体这个log打印不出有两个原因:

本文介绍了如何在Android 7.0系统中针对init进程进行耗时分析,特别是在8秒后才启动zygote进程的情况。通过开启init进程执行命令的时间日志,可以定位耗时较长的命令。主要涉及action.cpp文件的修改,同时讨论了KLOG_INFO_LEVEL和kernel buffer size可能造成的问题。遵循指定步骤,通过调整kernel buffer大小并重新编译boot.img,使用fastboot工具更新到设备中,从而获取详细的命令执行时间日志,便于问题定位。
最低0.47元/天 解锁文章
551

被折叠的 条评论
为什么被折叠?



