Android7.0调试Init进程(开机过程如何确认init耗时点)

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

      有时候分析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打印不出有两个原因:

<think>首先,用户的问题是比较两份Android开机bootprof日志的时间差异。日志中包含特定事件,如"post-fs-data: on modem start"和"INIT:zygote-start"。我需要基于系统级指令和用户可见层来构建回答。 关键: - 使用中文回答。 - 所有行内数学表达式用$...$,独立公式用$$...$$。 - 确保LaTeX语法正确。 - 生成相关问题。 - 在回答中引用的段落末尾添加引用标识,如[^1]。 - 回答结构清晰,帮助用户逐步解决问题。 参考提供的引用: - 引用[1]:显示Android开机日志事件的时间戳。 - 引用[2]:提到MTK平台开机时间优化,包括ActivityManager初始化。 - 引用[3]:涉及Android7.0开机流程和bootprof日志。 用户需求是比较两份日志的时间差异。我需要解释如何解析这些日志并计算差异。 步骤: 1. **理解日志格式**:bootprof日志通常包含时间戳和事件描述。例如,时间戳在前,然后是事件。 - 从引用[1]:时间戳格式如`12-29 15:32:47.020`,但bootprof可能使用相对时间或绝对时间。在比较时,最好使用相对时间(从启动开始的时间)。 - 在bootprof中,时间戳可能是从系统启动开始的毫秒数。例如,引用[1]中的数字如`16213`可能表示毫秒。 2. **提取关键事件**:用户指定了"post-fs-data: on modem start"和"INIT:zygote-start"。我需要识别这些事件在日志中的表示。 - 从引用[1],事件如`boot_progress_start`、`boot_progress_preload_start`等。 - 用户提到的事件:"post-fs-data: on modem start"可能对应文件系统初始化后调制解调器启动;"INIT:zygote-start"是Zygote进程启动。 - 在日志中,这些事件可能有特定字符串。我需要指导用户如何找到它们。 3. **计算时间差异**: - 对于每个事件,提取时间戳。 - 时间戳可能是绝对时间或相对时间。在比较两份日志时,使用相对时间(从启动开始)更合理。 - 例如,事件A在第一份日志中时间为T1,在第二份中为T2,差异为ΔT = T2 - T1。 - 用数学表达式表示:行内用$...$,如时间差 $\Delta t = t_2 - t_1$。 4. **步骤化回答**: - **步骤1:解析日志文件**:解释如何读取日志,提取事件和时间戳。 - **步骤2:识别事件**:指导用户查找特定字符串。 - **步骤3:提取时间戳**:时间戳可能以毫秒或秒为单位。 - **步骤4:计算差异**:对于每个事件,计算两份日志之间的时间差。 - **步骤5:分析结果**:解释差异可能的原因,如优化效果。 5. **生成相关问题**:在回答末尾添加相关问题,基于主题。 6. **引用**:在回答中引用提供的参考,如果适用。例如,引用[1]显示日志格式,引用[2]和[3]涉及开机时间优化。 结构化回答: - **引言**:简要解释bootprof日志和比较目的。 - **步骤**: 1. 准备日志文件。 2. 识别关键事件。 3. 提取时间戳。 4. 计算时间差异。 5. 分析差异。 - **示例**:提供一个简单的示例,使用数学表达式。 - **相关问题**:在末尾。 数学表达式: - 行内:如时间差 $\Delta t = t_{\text{log2}} - t_{\text{log1}}$。 - 独立公式:如果需要,用$$...$$,但可能不需要,除非复杂公式。 引用: - 在相关部分末尾添加,如[^1]。 完整回答: - 用中文。 - 清晰结构。</think>以下是针对您问题的完整回答:我将帮助您逐步比较两份Android开机bootprof日志的时间差异。这些日志包含关键事件如`post-fs-data: on modem start`和`INIT:zygote-start`。比较的核心是解析日志、提取事件时间戳,并计算差异(单位为毫秒)。回答基于Android开机流程标准日志格式(如bootprof),并结合了您提供的引用内容(引用[1]、[2]、[3])[^1][^2][^3]。所有时间差计算使用相对时间(从系统启动开始),以确保比较的准确性。 ### 步骤1: 理解bootprof日志格式和关键事件 首先,解析日志格式。bootprof日志通常包含时间戳和事件描述: - **时间戳格式**:可能是绝对时间(如`12-29 15:32:47.020`)或相对时间(从启动开始的毫秒数,如`16213`)。在比较时,我们使用相对时间,因为它直接反映启动阶段的耗时[^1][^3]。 - **事件描述**:您指定的两个事件: - `post-fs-data: on modem start`:表示文件系统初始化完成后调制解调器启动,通常在`boot_progress_preload_end`之后。这涉及硬件初始化,时间波动可能受基带固件影响[^2]。 - `INIT:zygote-start`:表示Zygote进程启动,这是Android框架初始化的关键,对应日志中的`boot_progress_ams_ready`或类似事件[^1][^3]。 - **日志示例**:基于引用[1],事件行如`12-29 15:32:47.020 526 526 I boot_progress_start: 16213`,其中`16213`是相对时间(毫秒)。您需在日志中搜索类似字符串来定位事件。 **操作建议**: - 使用文本工具(如`grep`)提取事件行。例如,对于第一份日志`log1.txt`: ```bash grep "post-fs-data: on modem start" log1.txt grep "INIT:zygote-start" log1.txt ``` - 如果事件名不匹配,检查日志中变体(如引用[3]中的`AP_Init`表示初始化)。 ### 步骤2: 提取事件时间戳 从日志行中提取相对时间戳(单位毫秒)。假设时间戳是日志行末尾的数字(如引用[1]中的`16213`): - 对于事件$E$(例如`post-fs-data: on modem start`),在第一份日志中时间为 $t_{E1}$,在第二份日志中为 $t_{E2}$。 - 提取方法:使用正则表达式或脚本解析数字部分。例如,Python脚本: ```python import re def extract_time(log_file, event_name): with open(log_file, 'r') as f: for line in f: if event_name in line: # 匹配行末数字(相对时间) match = re.search(r':\s*(\d+)$', line) if match: return int(match.group(1)) return None # 事件未找到 # 示例:提取两份日志的时间 t1_modem = extract_time('log1.txt', 'post-fs-data: on modem start') t2_modem = extract_time('log2.txt', 'post-fs-data: on modem start') t1_zygote = extract_time('log1.txt', 'INIT:zygote-start') t2_zygote = extract_time('log2.txt', 'INIT:zygote-start') ``` ### 步骤3: 计算时间差异 计算每个事件在两份日志中的时间差 $\Delta t_E = t_{E2} - t_{E1}$(单位毫秒)。如果 $\Delta t_E > 0$,表示第二份日志耗时更长;如果 $\Delta t_E < 0$,表示优化后缩短。 - **通用公式**:对于事件 $E$,时间差 $\Delta t_E = t_{E2} - t_{E1}$。 - **示例计算**: - 假设`log1.txt`中`post-fs-data: on modem start`时间为 $t_{\text{modem1}} = 25000$ ms,`log2.txt`中为 $t_{\text{modem2}} = 26000$ ms,则差异 $\Delta t_{\text{modem}} = 26000 - 25000 = 1000$ ms(增加1秒)。 - 类似地,对于`INIT:zygote-start`,如果 $t_{\text{zygote1}} = 35000$ ms, $t_{\text{zygote2}} = 34000$ ms,则 $\Delta t_{\text{zygote}} = 34000 - 35000 = -1000$ ms(减少1秒)。 ### 步骤4: 分析差异原因 基于差异值 $\Delta t_E$,分析可能原因: - **$\Delta t > 0$(时间增加)**:可能由硬件初始化延迟、固件更新或后台服务增多引起。例如,引用[2]提到MTK平台优化中,modem启动受基带影响[^2]。 - **$\Delta t < 0$(时间减少)**:表明优化有效,如Zygote启动加速可能源于框架裁剪或预加载优化(引用[3]中`AP_Init`事件关联ActivityManager)[^3]。 - **整体启动差异**:计算所有事件的总差异。例如,启动总时间差近似为 $\Delta T = \Delta t_{\text{modem}} + \Delta t_{\text{zygote}}$(但需结合更多事件)。 **建议工具**: - 使用脚本自动化比较:输入两份日志,输出表格。 ```python # 扩展步骤2的脚本 events = ['post-fs-data: on modem start', 'INIT:zygote-start'] results = [] for event in events: t1 = extract_time('log1.txt', event) t2 = extract_time('log2.txt', event) delta = t2 - t1 if t1 and t2 else None results.append((event, t1, t2, delta)) print("事件 | log1时间(ms) | log2时间(ms) | 差异(ms)") for res in results: print(f"{res[0]} | {res[1]} | {res[2]} | {res[3]}") ``` - 输出示例: ``` 事件 | log1时间(ms) | log2时间(ms) | 差异(ms) post-fs-data: on modem start | 25000 | 26000 | 1000 INIT:zygote-start | 35000 | 34000 | -1000 ``` ### 注意事项 1. **日志一致性**:确保两份日志来自相同Android版本和设备型号(如引用[3]为Android 7.0),否则差异可能因平台差异而非优化[^3]。 2. **误差处理**:如果事件未找到,检查日志完整性或使用近似事件(如引用[1]中的`boot_progress_pms_ready`对应Zygote阶段)[^1]。 3. **优化参考**:引用[2]提到开机时间优化方法(如减少广播接收器),可帮助解释差异[^2]。 通过以上步骤,您能系统性地比较时间差异。如果提供实际日志片段,我可以给出更具体分析。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值