Android 7.0 开机速度优化

<div id="article_content" class="article_content clearfix">
        <link rel="stylesheet" href="https://csdnimg.cn/release/blogv2/dist/mdeditor/css/editerView/kdoc_html_views-1a98987dfd.css">
        <link rel="stylesheet" href="https://csdnimg.cn/release/blogv2/dist/mdeditor/css/editerView/ck_htmledit_views-dc4a025e85.css">
                <div id="content_views" class="htmledit_views">
                    <h3><a name="t0"></a>问题描述</h3> 
<p>开机时间相对参考机过慢,大约慢15s左右。Android 系统7.0。</p> 
<h3><a name="t1"></a>问题分析</h3> 
<p>开机问题涉及的层次较多,大致有bootloader--&gt;kernel--&gt;Zygote--&gt;PMS--&gt;AMS--&gt;Launcher<br> 可以借助bootchart来分析,也可以直接通过log分析。不幸的是本项目机器因未知原因导致无法抓取到bootchart。<br> 幸好在我浏览源码时发现了一个神器perfboot工具。具体在system/core/init/perfboot.py。<br> 运行该命令需要在源码编译环境下。详细请参考源码文件,此处不做过多介绍。<br> 使用命令:<br><code>./perfboot.py --iterations=5 --interval=30 -v --output=/data/My_Doc/Performance/Bugs/bootup_op_4200151/J5D_UE.tsv</code><br> 获取问题机与参考机的开机数据。生成下图</p> 
<p style="text-align:center;"><img alt="" src="https://img-blog.csdnimg.cn/img_convert/dfdef1bca1df885a7d94c91bcb109424.png"></p> 
<p>&nbsp;</p> 
<p>上图X轴是开机启动过程中的一些重要节点。Y轴是开机时间。<br> 详细说明下X轴上各个节点表征的含义。</p> 
<p>|boot_progress_start|系统进入用户空间,标志着kernel启动完成,本例中可以看出kernel启动耗时30s左右<br> |:---<br> |boot_progress_preload_start|Zygote启动<br> |boot_progress_preload_end|Zygote结束<br> |boot_progress_system_run|SystemServer ready,开始启动Android系统服务,如PMS,APMS等<br> |boot_progress_pms_start|PMS开始扫描安装的应用<br> |boot_progress_pms_system_scan_start|PMS先行扫描/system目录下的安装包<br> |boot_progress_pms_data_scan_start|PMS扫描/data目录下的安装包<br> |boot_progress_pms_scan_end|PMS扫描结束<br> |boot_progress_pms_ready|PMS就绪<br> |boot_progress_ams_ready|AMS就绪<br> |boot_progress_enable_screen|AMS启动完成后开始激活屏幕,从此以后屏幕才能响应用户的触摸,它在WindowManagerService发出退出开机动画的时间节点之前,而真正退出开机动画还会花费少许时间,具体依赖animation zip 包中的desc.txt。wm_boot_animation_done才是用户感知到的动画结束时间节点<br> |sf_stop_bootanim|SF设置service.bootanim.exit属性值为1,标志系统要结束开机动画了,可以用来跟踪开机动画结尾部分消耗的时间<br> |wm_boot_animation_done|开机动画结束,这一步用户能直观感受到开机结束<br> 通过上图可以直观的看到问题机在进入boot_progress_start节点之前相对参考机耗时较多。而这之前主要涉及bootloader和kernel。</p> 
<h4><a name="t2"></a>bootloader 优化</h4> 
<p>这一块没有接触过,交给底层同事优化。大概说下抓取log的方式.</p> 
<p></p> 
<blockquote> 
 <p>adb shell cat /proc/bootmsg &gt; bootmsg.txt.</p> 
</blockquote> 
<p>从log里底层同事发现是bootimg签名有问题,更详细的分析,自己对这块真心不懂,总结不出帮助性的意见。</p> 
<h4><a name="t3"></a>kernel层优化</h4> 
<p>kernel的优化先check一遍config的配置,kernel中config的配置种类繁多,就算是工作几年的kernel工程师也不一定能清楚每一个config值的作用。Android提供了一个基础配置表。<br> 可以用脚本:kernel/scripts/kconfig/merge_config.sh来生成一份config文件。具体用法<a href="https://link.jianshu.com?t=https://source.android.com/devices/tech/config/kernel" title="戳这">戳这</a><br> 拿生成的config文件和当前项目中的config做对比,同时也对比参考机的config文件。对比的时候可以用一个现成的工具kernel/scripts/diffconfig来比较。<br> 综合比较后的结果,本地一点点调试,查找资料。最终去掉了如下config:</p> 
<blockquote> 
 <pre data-index="0" class="set-code-hide" name="code"><code class="hljs language-cobol"><ol class="hljs-ln" style="width:100%"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">CONFIG_MTD_TESTS<span class="hljs-operator">=</span>m ----<span class="hljs-operator">&gt;</span> m改为n</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">CONFIG_SERIAL_MSM_HSL<span class="hljs-operator">=</span>y ----<span class="hljs-operator">&gt;</span> y改为n</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">CONFIG_SERIAL_MSM_HSL_CONSOLE<span class="hljs-operator">=</span>y ----<span class="hljs-operator">&gt;</span> y改为n</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">CONFIG_MMC_<span class="hljs-keyword">BLOCK</span>_<span class="hljs-keyword">TEST</span><span class="hljs-operator">=</span>m ----<span class="hljs-operator">&gt;</span>注释掉</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">CONFIG_MMC_<span class="hljs-keyword">TEST</span><span class="hljs-operator">=</span>m ----<span class="hljs-operator">&gt;</span>注释掉</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">CONFIG_SERIAL_MSM_HSL<span class="hljs-operator">=</span>y ----<span class="hljs-operator">&gt;</span> y改为n</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">CONFIG_SERIAL_MSM_HSL_CONSOLE<span class="hljs-operator">=</span>y ----<span class="hljs-operator">&gt;</span> y改为n</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="8"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">CONFIG_MSM_SMD_DEBUG<span class="hljs-operator">=</span>y ----<span class="hljs-operator">&gt;</span>注释掉</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="9"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">CONFIG_CGROUP_DEBUG<span class="hljs-operator">=</span>y ----<span class="hljs-operator">&gt;</span>注释掉</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="10"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">CONFIG_RELAY<span class="hljs-operator">=</span>y ----<span class="hljs-operator">&gt;</span>注释掉</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="11"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">CONFIG_RMNET_<span class="hljs-keyword">DATA</span>_DEBUG_PKT<span class="hljs-operator">=</span>y ----<span class="hljs-operator">&gt;</span>注释掉</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="12"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">CONFIG_DEBUG_GPIO<span class="hljs-operator">=</span>y ----<span class="hljs-operator">&gt;</span>注释掉</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="13"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">CONFIG_CORESIGHT<span class="hljs-operator">=</span>y ----<span class="hljs-operator">&gt;</span>注释掉</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="14"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">CONFIG_CORESIGHT_EVENT<span class="hljs-operator">=</span>y ----<span class="hljs-operator">&gt;</span>注释掉</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="15"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">CONFIG_CORESIGHT_FUSE<span class="hljs-operator">=</span>y ----<span class="hljs-operator">&gt;</span>注释掉</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="16"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">CONFIG_CORESIGHT_CTI<span class="hljs-operator">=</span>y ----<span class="hljs-operator">&gt;</span>注释掉</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="17"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">CONFIG_CORESIGHT_TMC<span class="hljs-operator">=</span>y ----<span class="hljs-operator">&gt;</span>注释掉</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="18"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">CONFIG_CORESIGHT_TPIU<span class="hljs-operator">=</span>y ----<span class="hljs-operator">&gt;</span>注释掉</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="19"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">CONFIG_CORESIGHT_FUNNEL<span class="hljs-operator">=</span>y ----<span class="hljs-operator">&gt;</span>注释掉</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="20"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">CONFIG_CORESIGHT_REPLICATOR<span class="hljs-operator">=</span>y ----<span class="hljs-operator">&gt;</span>注释掉</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="21"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">CONFIG_CORESIGHT_STM<span class="hljs-operator">=</span>y ----<span class="hljs-operator">&gt;</span>注释掉</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="22"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">CONFIG_CORESIGHT_HWEVENT<span class="hljs-operator">=</span>y ----<span class="hljs-operator">&gt;</span>注释掉</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="23"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">CONFIG_DEBUG_MEMORY_INIT<span class="hljs-operator">=</span>y ----<span class="hljs-operator">&gt;</span>注释掉</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="24"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">CONFIG_<span class="hljs-keyword">DYNAMIC</span>_DEBUG<span class="hljs-operator">=</span>y ----<span class="hljs-operator">&gt;</span>注释掉</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="25"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-operator">/</span><span class="hljs-operator">/</span>以下也全部注释掉</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="26"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">CONFIG_SCHED_DEBUG</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="27"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">CONFIG_DEBUG_KMEMLEAK</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="28"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">CONFIG_DEBUG_KMEMLEAK_EARLY_LOG_<span class="hljs-keyword">SIZE</span><span class="hljs-operator">=</span><span class="hljs-number">400</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="29"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">CONFIG_DEBUG_KMEMLEAK_<span class="hljs-keyword">DEFAULT</span>_<span class="hljs-keyword">OFF</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="30"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">CONFIG_DEBUG_SPINLOCK</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="31"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">CONFIG_DEBUG_MUTEXES</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="32"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">CONFIG_DEBUG_ATOMIC_SLEEP</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="33"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">CONFIG_DEBUG_STACK_<span class="hljs-keyword">USAGE</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="34"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">CONFIG_DEBUG_LIST</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="35"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">CONFIG_FAULT_INJECTION_DEBUG_FS</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="36"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">CONFIG_LOCKUP_DETECTOR</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="37"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">CONFIG_DEBUG_PAGEALLOC</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="38"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">CONFIG_<span class="hljs-keyword">PAGE</span>_POISONING</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="39"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">CONFIG_RMNET_<span class="hljs-keyword">DATA</span>_DEBUG_PKT</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="40"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">CONFIG_MMC_PERF_PROFILING</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="41"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">CONFIG_DEBUG_BUS_VOTER</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="42"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">CONFIG_SLUB_DEBUG</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="43"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">CONFIG_DEBUG_BUGVERBOSE</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="44"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">CONFIG_ALLOC_BUFFERS_<span class="hljs-keyword">IN</span>_<span class="hljs-number">4</span>K_CHUNK</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="45"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">CONFIG_SERIAL_CORE</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="46"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">CONFIG_SERIAL_CORE_CONSOLE</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="47"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">CONFIG_SERIAL_MSM_HSL</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="48"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">CONFIG_SERIAL_MSM_HSL_CONSOLE</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="49"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">CONFIG_MSM_TZ_LOG</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="50"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">CONFIG_<span class="hljs-keyword">DYNAMIC</span>_DEBUG </div></div></li></ol></code><div class="hide-preCode-box"><span class="hide-preCode-bt"><img class="look-more-preCode contentImg-no-view" src="https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png" alt="" title=""></span></div><div class="hljs-button {2}" data-title="复制" οnclick="hljs.copyCode(event)"></div></pre> 
</blockquote> 
<p>这里说下config的配置有y,n,m,m表示编译成模块,不编译进内核。不配置的话相当于n。<br> CONFIG_DEBUG_INFO 不能去掉, 会引起CTS不过。由于config的的各项值可能散落在kernel的不同文件中,我们可以单独编译下kernel,然后去out目录下查看obj/KERNEL_OBJ/.config 文件,这里面的配置项是完全的。</p> 
<p>kernel关闭掉一些debug开关后。在新版本上复测结果如下:</p> 
<p><br> &nbsp;</p> 
<p style="text-align:center;"><img alt="" src="https://img-blog.csdnimg.cn/img_convert/ab95aeb6fe00dbb5eb26545affb556e4.png"></p> 
<p>&nbsp;</p> 
<blockquote> 
 <p>这里提下如何看kernel的log,<br> 开机后用命令:adb shell dmesg &gt; dmesg.txt抓取Log<br> log里面搜关键字"Bootloader start count"--&gt;LK 启动<br> “Bootloader end count”--&gt;LK 结束<br> "Kernel MPM timestamp"--&gt;bootloader运行完成</p> 
</blockquote> 
<p><br> 通过对bootloader和kernel的优化,直接减少了14s左右的开机时间,可以看到优化的效果还是比较明显的。</p> 
<p></p> 
<h4><a name="t4"></a>frameworks层优化</h4> 
<p>用命令:&nbsp;<code>adb logcat -b events|grep boot</code>我们过滤出启动阶段的主要事件。</p> 
<pre data-index="1"><code class="hljs language-cobol"><ol class="hljs-ln" style="width:100%"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">01</span>-<span class="hljs-number">01</span> <span class="hljs-number">13</span>:<span class="hljs-number">38</span>:<span class="hljs-number">52.139</span>   <span class="hljs-number">391</span>   <span class="hljs-number">391</span> I boot_progress_<span class="hljs-keyword">start</span>: <span class="hljs-number">15452</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">01</span>-<span class="hljs-number">01</span> <span class="hljs-number">13</span>:<span class="hljs-number">38</span>:<span class="hljs-number">53.329</span>   <span class="hljs-number">391</span>   <span class="hljs-number">391</span> I boot_progress_preload_<span class="hljs-keyword">start</span>: <span class="hljs-number">16641</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">01</span>-<span class="hljs-number">01</span> <span class="hljs-number">13</span>:<span class="hljs-number">38</span>:<span class="hljs-number">56.675</span>   <span class="hljs-number">391</span>   <span class="hljs-number">391</span> I boot_progress_preload_<span class="hljs-keyword">end</span>: <span class="hljs-number">19989</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">01</span>-<span class="hljs-number">01</span> <span class="hljs-number">13</span>:<span class="hljs-number">38</span>:<span class="hljs-number">57.020</span>  <span class="hljs-number">1729</span>  <span class="hljs-number">1729</span> I boot_progress_system_<span class="hljs-keyword">run</span>: <span class="hljs-number">20333</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">01</span>-<span class="hljs-number">01</span> <span class="hljs-number">13</span>:<span class="hljs-number">38</span>:<span class="hljs-number">57.824</span>  <span class="hljs-number">1729</span>  <span class="hljs-number">1729</span> I boot_progress_pms_<span class="hljs-keyword">start</span>: <span class="hljs-number">21137</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">01</span>-<span class="hljs-number">01</span> <span class="hljs-number">13</span>:<span class="hljs-number">38</span>:<span class="hljs-number">58.865</span>  <span class="hljs-number">1729</span>  <span class="hljs-number">1729</span> I boot_progress_pms_system_scan_<span class="hljs-keyword">start</span>: <span class="hljs-number">22179</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">01</span>-<span class="hljs-number">01</span> <span class="hljs-number">13</span>:<span class="hljs-number">39</span>:<span class="hljs-number">08.852</span>  <span class="hljs-number">1729</span>  <span class="hljs-number">1729</span> I boot_progress_pms_<span class="hljs-keyword">data</span>_scan_<span class="hljs-keyword">start</span>: <span class="hljs-number">32166</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="8"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">01</span>-<span class="hljs-number">01</span> <span class="hljs-number">13</span>:<span class="hljs-number">39</span>:<span class="hljs-number">08.907</span>  <span class="hljs-number">1729</span>  <span class="hljs-number">1729</span> I boot_progress_pms_scan_<span class="hljs-keyword">end</span>: <span class="hljs-number">32221</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="9"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">01</span>-<span class="hljs-number">01</span> <span class="hljs-number">13</span>:<span class="hljs-number">39</span>:<span class="hljs-number">10.109</span>  <span class="hljs-number">1729</span>  <span class="hljs-number">1729</span> I boot_progress_pms_ready: <span class="hljs-number">33422</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="10"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">01</span>-<span class="hljs-number">01</span> <span class="hljs-number">13</span>:<span class="hljs-number">39</span>:<span class="hljs-number">12.557</span>  <span class="hljs-number">1729</span>  <span class="hljs-number">1729</span> I boot_progress_ams_ready: <span class="hljs-number">35871</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="11"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">01</span>-<span class="hljs-number">01</span> <span class="hljs-number">13</span>:<span class="hljs-number">39</span>:<span class="hljs-number">15.189</span>  <span class="hljs-number">1729</span>  <span class="hljs-number">1782</span> I boot_progress_enable_<span class="hljs-keyword">screen</span>: <span class="hljs-number">38503</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="12"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">01</span>-<span class="hljs-number">01</span> <span class="hljs-number">13</span>:<span class="hljs-number">39</span>:<span class="hljs-number">17.973</span>   <span class="hljs-number">290</span>   <span class="hljs-number">321</span> I sf_<span class="hljs-keyword">stop</span>_bootanim: <span class="hljs-number">41287</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="13"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">01</span>-<span class="hljs-number">01</span> <span class="hljs-number">13</span>:<span class="hljs-number">39</span>:<span class="hljs-number">18.887</span>  <span class="hljs-number">1729</span>  <span class="hljs-number">1961</span> I wm_boot_animation_done: <span class="hljs-number">42201</span></div></div></li></ol></code><div class="hljs-button {2}" data-title="复制" οnclick="hljs.copyCode(event)"></div></pre> 
<p>结合对比图看,boot_progress_enable_screen之前问题机跟对比机各个节点耗时相差不大。在这里说明下,Android M上启动阶段到boot_progress_enable_screen就结束了,而Android N上还多了sf_stop_bootanim和wm_boot_animation_done两个事件。这也就是图-优化kernel后棕红色的线条到boot_progress_enable_screen就没有延生的原因,因为它表示的参考机,而参考机正好是Android M系统。<br> 从log的时间戳可以看出:<br> boot_progress_enable_screen---&gt;花费2s左右的时间到达sf_stop_bootanim---&gt;花费1s多时间到达wm_boot_animation_done。多出来的两个过程总共多花接近4s的时间。<br> 我们要重点看下这个过程发生了什么,为什么会多出来这近4s时间。</p> 
<p>1.先看下boot_progress_enable_screen出现的位置。<br> 它在frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java</p> 
<pre data-index="2"><code class="hljs language-scss"><ol class="hljs-ln" style="width:100%"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">void <span class="hljs-built_in">enableScreenAfterBoot</span>() {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    EventLog<span class="hljs-selector-class">.writeEvent</span>(EventLogTags.BOOT_PROGRESS_ENABLE_SCREEN,</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">            SystemClock.uptimeMillis());</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    mWindowManager<span class="hljs-selector-class">.enableScreenAfterBoot</span>();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    synchronized (this) {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        <span class="hljs-built_in">updateEventDispatchingLocked</span>();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="8"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="9"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">}</div></div></li></ol></code><div class="hljs-button {2}" data-title="复制" οnclick="hljs.copyCode(event)"></div></pre> 
<p>&nbsp;</p> 
<p>2.sf_stop_bootanim出现的位置。<br> 它在frameworks/native/services/surfaceflinger/SurfaceFlinger_hwc1.cpp。<br> 这里特别说明下SurfaceFlinger_hwc1.cpp是SurfaceFlinger.cpp的升级版,它支持HWC 2.0,使用的是SurfaceFlinger.cpp还是SurfaceFlinger_hwc1.cpp跟平台选择相关。</p> 
<pre data-index="3"><code class="hljs language-cobol"><ol class="hljs-ln" style="width:100%"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">void SurfaceFlinger<span class="hljs-operator">::</span>bootFinished()</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">{</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    ...</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    <span class="hljs-operator">/</span><span class="hljs-operator">/</span> <span class="hljs-keyword">stop</span> boot animation</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    <span class="hljs-operator">/</span><span class="hljs-operator">/</span> formerly we would <span class="hljs-keyword">just</span> kill the process, but we now ask it <span class="hljs-keyword">to</span> <span class="hljs-keyword">exit</span> so it</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    <span class="hljs-operator">/</span><span class="hljs-operator">/</span> can choose where <span class="hljs-keyword">to</span> <span class="hljs-keyword">stop</span> the animation.</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    <span class="hljs-keyword">property</span>_<span class="hljs-keyword">set</span>(<span class="hljs-string">"service.bootanim.exit"</span>, <span class="hljs-string">"1"</span>);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="8"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    const int LOGTAG_SF_<span class="hljs-keyword">STOP</span>_BOOTANIM <span class="hljs-operator">=</span> <span class="hljs-number">60110</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="9"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    LOG_EVENT_LONG(LOGTAG_SF_<span class="hljs-keyword">STOP</span>_BOOTANIM,</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="10"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">                   ns<span class="hljs-number">2</span>ms(systemTime(SYSTEM_<span class="hljs-keyword">TIME</span>_MONOTONIC)));</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="11"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">}</div></div></li></ol></code><div class="hljs-button {2}" data-title="复制" οnclick="hljs.copyCode(event)"></div></pre> 
<p>&nbsp;</p> 
<p>3.wm_boot_animation_done出现的位置。<br> frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java</p> 
<pre data-index="4" class="set-code-hide" name="code"><code class="hljs language-kotlin"><ol class="hljs-ln" style="width:100%"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-keyword">public</span> void performEnableScreen() {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    ...</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    <span class="hljs-comment">// Don't enable the screen until all existing windows have been drawn.</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    <span class="hljs-keyword">if</span> (!mForceDisplayEnabled &amp;&amp; checkWaitingForWindowsLocked()) {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        <span class="hljs-keyword">return</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    <span class="hljs-keyword">if</span> (!mBootAnimationStopped) {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="8"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        <span class="hljs-comment">// Do this one time.</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="9"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        Trace.asyncTraceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, <span class="hljs-string">"Stop bootanim"</span>, <span class="hljs-number">0</span>);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="10"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        <span class="hljs-keyword">try</span> {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="11"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">            IBinder surfaceFlinger = ServiceManager.getService(<span class="hljs-string">"SurfaceFlinger"</span>);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="12"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">            <span class="hljs-keyword">if</span> (surfaceFlinger != <span class="hljs-literal">null</span>) {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="13"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">                <span class="hljs-comment">//Slog.i(TAG_WM, "******* TELLING SURFACE FLINGER WE ARE BOOTED!");</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="14"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">                Parcel <span class="hljs-keyword">data</span> = Parcel.obtain();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="15"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">                <span class="hljs-keyword">data</span>.writeInterfaceToken(<span class="hljs-string">"android.ui.ISurfaceComposer"</span>);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="16"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">                surfaceFlinger.transact(IBinder.FIRST_CALL_TRANSACTION, <span class="hljs-comment">// BOOT_FINISHED</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="17"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">                        <span class="hljs-keyword">data</span>, <span class="hljs-literal">null</span>, <span class="hljs-number">0</span>);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="18"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">                <span class="hljs-keyword">data</span>.recycle();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="19"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">            }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="20"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        } <span class="hljs-keyword">catch</span> (RemoteException ex) {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="21"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">            Slog.e(TAG_WM, <span class="hljs-string">"Boot completed: SurfaceFlinger is dead!"</span>);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="22"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="23"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        mBootAnimationStopped = <span class="hljs-literal">true</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="24"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="25"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    <span class="hljs-keyword">if</span> (!mForceDisplayEnabled &amp;&amp; !checkBootAnimationCompleteLocked()) {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="26"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        <span class="hljs-keyword">if</span> (DEBUG_BOOT) Slog.i(TAG_WM, <span class="hljs-string">"performEnableScreen: Waiting for anim complete"</span>);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="27"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">            <span class="hljs-keyword">return</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="28"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="29"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    ...</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="30"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    EventLog.writeEvent(EventLogTags.WM_BOOT_ANIMATION_DONE, SystemClock.uptimeMillis());</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="31"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    ...</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="32"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">}</div></div></li></ol></code><div class="hide-preCode-box"><span class="hide-preCode-bt" data-report-view="{&quot;spm&quot;:&quot;1001.2101.3001.7365&quot;}"><img class="look-more-preCode contentImg-no-view" src="https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png" alt="" title=""></span></div><div class="hljs-button {2}" data-title="复制" οnclick="hljs.copyCode(event)"></div></pre> 
<p>&nbsp;</p> 
<p>找到了3个节点出现的位置,现在再来分析如何将这3个节点串联起来。<br> 1--&gt;2过程: AMS的enableScreenAfterBoot调用WMS的enableScreenAfterBoot方法,在WMS中的enableScreenAfterBoot会继续调用内部方法performEnableScreen,该方法内部判断开机动画如果没有停止,就调用SurfaceFlinger去停止开机动画</p> 
<pre data-index="5"><code class="hljs language-cobol"><ol class="hljs-ln" style="width:100%"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">surfaceFlinger.transact(IBinder.<span class="hljs-keyword">FIRST</span>_<span class="hljs-keyword">CALL</span>_TRANSACTION, <span class="hljs-operator">/</span><span class="hljs-operator">/</span> BOOT_FINISHED</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">                                <span class="hljs-keyword">data</span>, <span class="hljs-keyword">null</span>, <span class="hljs-number">0</span>);</div></div></li></ol></code><div class="hljs-button {2}" data-title="复制" οnclick="hljs.copyCode(event)"></div></pre> 
<p>&nbsp;这里的FIRST_CALL_TRANSACTION实际上就是BOOT_FINISHED。<br> frameworks/native/include/gui/ISurfaceComposer.h</p> 
<p></p> 
<pre data-index="6"><code class="hljs language-cobol"><ol class="hljs-ln" style="width:100%"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-keyword">class</span> BnSurfaceComposer: public BnInterface<span class="hljs-operator">&lt;</span>ISurfaceComposer<span class="hljs-operator">&gt;</span> {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">public:</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    enum {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        <span class="hljs-operator">/</span><span class="hljs-operator">/</span> Note: BOOT_FINISHED must remain this <span class="hljs-keyword">value</span>, it <span class="hljs-keyword">is</span> called <span class="hljs-keyword">from</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        <span class="hljs-operator">/</span><span class="hljs-operator">/</span> Java <span class="hljs-keyword">by</span> ActivityManagerService.</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        BOOT_FINISHED <span class="hljs-operator">=</span> IBinder<span class="hljs-operator">::</span><span class="hljs-keyword">FIRST</span>_<span class="hljs-keyword">CALL</span>_TRANSACTION,</div></div></li></ol></code><div class="hljs-button {2}" data-title="复制" οnclick="hljs.copyCode(event)"></div></pre> 
<p>surfaceFlinger.transact发出的调用请求会被ISurfaceComposer处理。<br> frameworks/native/libs/gui/ISurfaceComposer.cpp</p> 
<pre data-index="7"><code class="hljs language-cobol"><ol class="hljs-ln" style="width:100%"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-keyword">status</span>_t BnSurfaceComposer<span class="hljs-operator">::</span>onTransact(</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    uint<span class="hljs-number">32</span>_t <span class="hljs-keyword">code</span>, const Parcel<span class="hljs-operator">&amp;</span> <span class="hljs-keyword">data</span>, Parcel<span class="hljs-operator">*</span> reply, uint<span class="hljs-number">32</span>_t flags)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">{</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    ...</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    switch(<span class="hljs-keyword">code</span>) {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        case BOOT_FINISHED: {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">                CHECK_<span class="hljs-keyword">INTERFACE</span>(ISurfaceComposer, <span class="hljs-keyword">data</span>, reply);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="8"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">                bootFinished();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="9"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">                <span class="hljs-keyword">return</span> <span class="hljs-keyword">NO</span>_<span class="hljs-keyword">ERROR</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="10"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">            }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="11"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="12"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    ...</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="13"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">}</div></div></li></ol></code><div class="hljs-button {2}" data-title="复制" οnclick="hljs.copyCode(event)"></div></pre> 
<p>&nbsp;</p> 
<p>这里的bootFinished就是SurfaceFlinger_hwc1.cpp定义的bootFinished()方法,最终来到了第2个节点sf_stop_bootanim。<br> 为了验证上述调用过程,我们添加上打印调用栈的log看看输出。</p> 
<pre data-index="8" class="set-code-hide" name="code"><code class="hljs language-cobol"><ol class="hljs-ln" style="width:1237px"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">void SurfaceFlinger<span class="hljs-operator">::</span>bootFinished()</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">{</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    const nsecs_t now <span class="hljs-operator">=</span> systemTime();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    const nsecs_t duration <span class="hljs-operator">=</span> now<span class="hljs-operator"> - </span>mBootTime;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    ALOGI(<span class="hljs-string">"Boot is finished (%ld ms)"</span>, long(ns<span class="hljs-number">2</span>ms(duration)) );</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    mBootFinished <span class="hljs-operator">=</span> <span class="hljs-keyword">true</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    android<span class="hljs-operator">::</span>CallStack stack;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="8"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    stack.update();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="9"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    stack.log(<span class="hljs-string">"azhengye"</span>, ANDROID_LOG_DEBUG, <span class="hljs-string">" "</span>);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="10"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    <span class="hljs-keyword">String</span><span class="hljs-number">8</span> strtemp <span class="hljs-operator">=</span> stack.toString(<span class="hljs-string">""</span>);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="11"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    ALOGD(<span class="hljs-string">"Sunny\t%s"</span>, strtemp.<span class="hljs-keyword">string</span>());</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="12"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">}</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="13"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">---------------------------------------------------------------------------------</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="14"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">04</span>-<span class="hljs-number">28</span> <span class="hljs-number">12</span>:<span class="hljs-number">41</span>:<span class="hljs-number">15.978</span>   <span class="hljs-number">308</span>  <span class="hljs-number">2956</span> D azhengye:  #<span class="hljs-number">00</span> pc <span class="hljs-number">0002</span>b<span class="hljs-number">761</span>  <span class="hljs-operator">/</span>system<span class="hljs-operator">/</span>lib<span class="hljs-operator">/</span>libsurfaceflinger.so</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="15"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">04</span>-<span class="hljs-number">28</span> <span class="hljs-number">12</span>:<span class="hljs-number">41</span>:<span class="hljs-number">15.978</span>   <span class="hljs-number">308</span>  <span class="hljs-number">2956</span> D azhengye:  #<span class="hljs-number">01</span> pc <span class="hljs-number">00045</span>c<span class="hljs-number">9</span>f  <span class="hljs-operator">/</span>system<span class="hljs-operator">/</span>lib<span class="hljs-operator">/</span>libgui.so</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="16"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">04</span>-<span class="hljs-number">28</span> <span class="hljs-number">12</span>:<span class="hljs-number">41</span>:<span class="hljs-number">15.978</span>   <span class="hljs-number">308</span>  <span class="hljs-number">2956</span> D azhengye:  #<span class="hljs-number">02</span> pc <span class="hljs-number">000310</span><span class="hljs-keyword">cf</span>  <span class="hljs-operator">/</span>system<span class="hljs-operator">/</span>lib<span class="hljs-operator">/</span>libsurfaceflinger.so</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="17"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">04</span>-<span class="hljs-number">28</span> <span class="hljs-number">12</span>:<span class="hljs-number">41</span>:<span class="hljs-number">15.978</span>   <span class="hljs-number">308</span>  <span class="hljs-number">2956</span> D azhengye:  #<span class="hljs-number">03</span> pc <span class="hljs-number">000359</span>b<span class="hljs-number">3</span>  <span class="hljs-operator">/</span>system<span class="hljs-operator">/</span>lib<span class="hljs-operator">/</span>libbinder.so</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="18"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">04</span>-<span class="hljs-number">28</span> <span class="hljs-number">12</span>:<span class="hljs-number">41</span>:<span class="hljs-number">15.979</span>   <span class="hljs-number">308</span>  <span class="hljs-number">2956</span> D azhengye:  #<span class="hljs-number">04</span> pc <span class="hljs-number">0003</span>d<span class="hljs-number">159</span>  <span class="hljs-operator">/</span>system<span class="hljs-operator">/</span>lib<span class="hljs-operator">/</span>libbinder.so</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="19"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">04</span>-<span class="hljs-number">28</span> <span class="hljs-number">12</span>:<span class="hljs-number">41</span>:<span class="hljs-number">15.979</span>   <span class="hljs-number">308</span>  <span class="hljs-number">2956</span> D azhengye:  #<span class="hljs-number">05</span> pc <span class="hljs-number">0003</span>cdb<span class="hljs-number">7</span>  <span class="hljs-operator">/</span>system<span class="hljs-operator">/</span>lib<span class="hljs-operator">/</span>libbinder.so</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="20"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">04</span>-<span class="hljs-number">28</span> <span class="hljs-number">12</span>:<span class="hljs-number">41</span>:<span class="hljs-number">15.979</span>   <span class="hljs-number">308</span>  <span class="hljs-number">2956</span> D azhengye:  #<span class="hljs-number">06</span> pc <span class="hljs-number">0003</span>d<span class="hljs-number">2</span>bb  <span class="hljs-operator">/</span>system<span class="hljs-operator">/</span>lib<span class="hljs-operator">/</span>libbinder.so</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="21"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">04</span>-<span class="hljs-number">28</span> <span class="hljs-number">12</span>:<span class="hljs-number">41</span>:<span class="hljs-number">15.979</span>   <span class="hljs-number">308</span>  <span class="hljs-number">2956</span> D azhengye:  #<span class="hljs-number">07</span> pc <span class="hljs-number">0004</span>f<span class="hljs-number">5</span>f<span class="hljs-number">5</span>  <span class="hljs-operator">/</span>system<span class="hljs-operator">/</span>lib<span class="hljs-operator">/</span>libbinder.so</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="22"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">04</span>-<span class="hljs-number">28</span> <span class="hljs-number">12</span>:<span class="hljs-number">41</span>:<span class="hljs-number">15.979</span>   <span class="hljs-number">308</span>  <span class="hljs-number">2956</span> D azhengye:  #<span class="hljs-number">08</span> pc <span class="hljs-number">0000</span>e<span class="hljs-number">349</span>  <span class="hljs-operator">/</span>system<span class="hljs-operator">/</span>lib<span class="hljs-operator">/</span>libutils.so</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="23"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">04</span>-<span class="hljs-number">28</span> <span class="hljs-number">12</span>:<span class="hljs-number">41</span>:<span class="hljs-number">15.979</span>   <span class="hljs-number">308</span>  <span class="hljs-number">2956</span> D azhengye:  #<span class="hljs-number">09</span> pc <span class="hljs-number">000473</span>d<span class="hljs-number">3</span>  <span class="hljs-operator">/</span>system<span class="hljs-operator">/</span>lib<span class="hljs-operator">/</span>libc.so</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="24"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">04</span>-<span class="hljs-number">28</span> <span class="hljs-number">12</span>:<span class="hljs-number">41</span>:<span class="hljs-number">15.979</span>   <span class="hljs-number">308</span>  <span class="hljs-number">2956</span> D azhengye:  #<span class="hljs-number">10</span> pc <span class="hljs-number">0001</span>a<span class="hljs-number">0</span>c<span class="hljs-number">9</span>  <span class="hljs-operator">/</span>system<span class="hljs-operator">/</span>lib<span class="hljs-operator">/</span>libc.so</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="25"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">---------------------------------------------------------------------------------</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="26"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">SurfaceFlinger_hwc<span class="hljs-number">1</span>.cpp:<span class="hljs-number">312</span>   android<span class="hljs-operator">::</span>SurfaceFlinger<span class="hljs-operator">::</span>bootFinished()</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="27"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">ISurfaceComposer.cpp:<span class="hljs-number">371</span>      android<span class="hljs-operator">::</span>BnSurfaceComposer<span class="hljs-operator">::</span>onTransact(unsigned int, android<span class="hljs-operator">::</span>Parcel const<span class="hljs-operator">&amp;</span>, android<span class="hljs-operator">::</span>Parcel<span class="hljs-operator">*</span>, unsigned int)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="28"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">SurfaceFlinger_hwc<span class="hljs-number">1</span>.cpp:<span class="hljs-number">3103</span>  android<span class="hljs-operator">::</span>SurfaceFlinger<span class="hljs-operator">::</span>onTransact(unsigned int, android<span class="hljs-operator">::</span>Parcel const<span class="hljs-operator">&amp;</span>, android<span class="hljs-operator">::</span>Parcel<span class="hljs-operator">*</span>, unsigned int)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="29"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Binder.cpp:<span class="hljs-number">126</span>                android<span class="hljs-operator">::</span>BBinder<span class="hljs-operator">::</span>transact(unsigned int, android<span class="hljs-operator">::</span>Parcel const<span class="hljs-operator">&amp;</span>, android<span class="hljs-operator">::</span>Parcel<span class="hljs-operator">*</span>, unsigned int)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="30"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">IPCThreadState.cpp:<span class="hljs-number">1111</span>       android<span class="hljs-operator">::</span>IPCThreadState<span class="hljs-operator">::</span>executeCommand(int)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="31"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">IPCThreadState.cpp:<span class="hljs-number">445</span>        android<span class="hljs-operator">::</span>IPCThreadState<span class="hljs-operator">::</span>getAndExecuteCommand()</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="32"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">IPCThreadState.cpp:<span class="hljs-number">513</span>        android<span class="hljs-operator">::</span>IPCThreadState<span class="hljs-operator">::</span>joinThreadPool(bool)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="33"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">ProcessState.cpp:<span class="hljs-number">63</span> (discriminator <span class="hljs-number">1</span>)android<span class="hljs-operator">::</span>PoolThread<span class="hljs-operator">::</span>threadLoop()</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="34"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Threads.cpp:<span class="hljs-number">751</span>               android<span class="hljs-operator">::</span>Thread<span class="hljs-operator">::</span>_threadLoop(void<span class="hljs-operator">*</span>)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="35"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">pthread_create.cpp:<span class="hljs-number">198</span> (discriminator <span class="hljs-number">1</span>)__pthread_<span class="hljs-keyword">start</span>(void<span class="hljs-operator">*</span>)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="36"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">clone.cpp:<span class="hljs-number">41</span> (discriminator <span class="hljs-number">1</span>)__<span class="hljs-keyword">start</span>_thread</div></div></li></ol></code><div class="hide-preCode-box"><span class="hide-preCode-bt" data-report-view="{&quot;spm&quot;:&quot;1001.2101.3001.7365&quot;}"><img class="look-more-preCode contentImg-no-view" src="https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png" alt="" title=""></span></div><div class="hljs-button {2}" data-title="复制" οnclick="hljs.copyCode(event)"></div></pre> 
<p>&nbsp;</p> 
<p>上述log也印证了之前的分析,至此1--&gt;2的过程算是通了。在来看2--&gt;3过程,在3节点出现之前还有一次判断:</p> 
<pre data-index="9"><code class="hljs language-cobol"><ol class="hljs-ln" style="width:100%"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-keyword">if</span> (!mForceDisplayEnabled <span class="hljs-operator">&amp;</span><span class="hljs-operator">&amp;</span> !checkBootAnimationCompleteLocked()) {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">                <span class="hljs-keyword">if</span> (DEBUG_BOOT) Slog.i(TAG_WM, <span class="hljs-string">"performEnableScreen: Waiting for anim complete"</span>);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">                <span class="hljs-keyword">return</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">}</div></div></li></ol></code><div class="hljs-button {2}" data-title="复制" οnclick="hljs.copyCode(event)"></div></pre> 
<p>这里系统需要去检测开机动画是否还在播放,</p> 
<pre data-index="10"><code class="hljs language-typescript"><ol class="hljs-ln" style="width:100%"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-keyword">private</span> <span class="hljs-built_in">boolean</span> <span class="hljs-title function_">checkBootAnimationCompleteLocked</span>(<span class="hljs-params"></span>) {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    <span class="hljs-keyword">if</span> (<span class="hljs-title class_">SystemService</span>.<span class="hljs-title function_">isRunning</span>(<span class="hljs-variable constant_">BOOT_ANIMATION_SERVICE</span>)) {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        mH.<span class="hljs-title function_">removeMessages</span>(H.<span class="hljs-property">CHECK_IF_BOOT_ANIMATION_FINISHED</span>);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        mH.<span class="hljs-title function_">sendEmptyMessageDelayed</span>(H.<span class="hljs-property">CHECK_IF_BOOT_ANIMATION_FINISHED</span>,</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">                <span class="hljs-variable constant_">BOOT_ANIMATION_POLL_INTERVAL</span>);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        <span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="8"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    <span class="hljs-keyword">return</span> <span class="hljs-literal">true</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="9"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">}</div></div></li></ol></code><div class="hljs-button {2}" data-title="复制" οnclick="hljs.copyCode(event)"></div></pre> 
<p>BOOT_ANIMATION_SERVICE是在初始化SurfaceFlinger时启动的。<br> frameworks/native/services/surfaceflinger/SurfaceFlinger_hwc1.cpp</p> 
<pre data-index="11"><code class="hljs language-typescript"><ol class="hljs-ln" style="width:100%"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-built_in">void</span> <span class="hljs-title class_">SurfaceFlinger</span>::<span class="hljs-title function_">init</span>(<span class="hljs-params"></span>) {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    ...</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    <span class="hljs-comment">// start boot animation</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    <span class="hljs-title function_">startBootAnim</span>();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">}</div></div></li></ol></code><div class="hljs-button {2}" data-title="复制" οnclick="hljs.copyCode(event)"></div></pre> 
<p>&nbsp;</p> 
<p>顺藤摸瓜来到了BootAnimation,前面分析过在SurfaceFlinger的bootFinished方法中将"service.bootanim.exit"置为了1,这个设置在BootAnimation就被读取了。<br> frameworks/base/cmds/bootanimation/BootAnimation.cpp</p> 
<pre data-index="12" class="set-code-hide" name="code"><code class="hljs language-cobol"><ol class="hljs-ln" style="width:100%"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">...</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">#define <span class="hljs-keyword">EXIT</span>_PROP_NAME <span class="hljs-string">"service.bootanim.exit"</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">...</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">void BootAnimation<span class="hljs-operator">::</span>checkExit() {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    <span class="hljs-operator">/</span><span class="hljs-operator">/</span> Allow surface flinger <span class="hljs-keyword">to</span> gracefully request shutdown</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    char <span class="hljs-keyword">value</span>[<span class="hljs-keyword">PROPERTY</span>_<span class="hljs-keyword">VALUE</span>_MAX];</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    <span class="hljs-keyword">property</span>_<span class="hljs-keyword">get</span>(<span class="hljs-keyword">EXIT</span>_PROP_NAME, <span class="hljs-keyword">value</span>, <span class="hljs-string">"0"</span>);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="8"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    int exitnow <span class="hljs-operator">=</span> atoi(<span class="hljs-keyword">value</span>);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="9"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    <span class="hljs-keyword">if</span> (exitnow) {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="10"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        requestExit();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="11"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        <span class="hljs-keyword">if</span> (mAudioPlayer !<span class="hljs-operator">=</span> <span class="hljs-keyword">NULL</span>) {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="12"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">            mAudioPlayer-<span class="hljs-operator">&gt;</span>requestExit();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="13"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="14"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="15"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">}</div></div></li></ol></code><div class="hide-preCode-box"><span class="hide-preCode-bt" data-report-view="{&quot;spm&quot;:&quot;1001.2101.3001.7365&quot;}"><img class="look-more-preCode contentImg-no-view" src="https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png" alt="" title=""></span></div><div class="hljs-button {2}" data-title="复制" οnclick="hljs.copyCode(event)"></div></pre> 
<p>&nbsp;</p> 
<p>跟踪到这2--&gt;3过程也就通畅了。在理清了该过程的调用逻辑后,问题也浮出了水面。原来之前的同事在解决一个开机进桌面出现黑屏问题时,在checkExit内部人为delay了几秒的时间...</p> 
<p>在排查log时还发现下面的错误:</p> 
<pre data-index="13"><code class="hljs language-cobol"><span class="hljs-number">01</span>-<span class="hljs-number">01</span> <span class="hljs-number">15</span>:<span class="hljs-number">55</span>:<span class="hljs-number">23.506</span>  <span class="hljs-number">1865</span>  <span class="hljs-number">1865</span> E BitmapFactory: Unable <span class="hljs-keyword">to</span> decode stream: java.io.FileNotFoundException: <span class="hljs-operator">/</span><span class="hljs-keyword">data</span><span class="hljs-operator">/</span>system<span class="hljs-operator">/</span>users<span class="hljs-operator">/</span><span class="hljs-number">0</span><span class="hljs-operator">/</span>wallpaper_orig (<span class="hljs-keyword">No</span> such <span class="hljs-keyword">file</span> <span class="hljs-keyword">or</span> directory)</code><div class="hljs-button {2}" data-title="复制" οnclick="hljs.copyCode(event)"></div></pre> 
<p>&nbsp;</p> 
<p>adb shell 进入手机发现确实没有/data/system/users/0/wallpaper_orig文件。<br> 会不会是是wallpaper异常导致消耗时间多余呢?<br> 为了清晰debug在过滤下log</p> 
<blockquote> 
 <p>adb logcat -b all|grep -E "Wallpaper may change|haveWall|sf_stop_bootanim|boot_progress_enable_screen"</p> 
</blockquote> 
<p>输出如下log:</p> 
<pre data-index="14" class="set-code-hide" name="code"><code class="hljs language-cobol"><ol class="hljs-ln" style="width:1398px"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">01</span>-<span class="hljs-number">02</span> <span class="hljs-number">12</span>:<span class="hljs-number">13</span>:<span class="hljs-number">03.814</span>  <span class="hljs-number">1851</span>  <span class="hljs-number">2082</span> V WindowManager: Wallpaper may change!  Adjusting</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">01</span>-<span class="hljs-number">02</span> <span class="hljs-number">12</span>:<span class="hljs-number">13</span>:<span class="hljs-number">04.865</span>  <span class="hljs-number">1851</span>  <span class="hljs-number">2082</span> V WindowManager: Wallpaper may change!  Adjusting</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">01</span>-<span class="hljs-number">02</span> <span class="hljs-number">12</span>:<span class="hljs-number">13</span>:<span class="hljs-number">06.986</span>  <span class="hljs-number">1851</span>  <span class="hljs-number">2006</span> I boot_progress_enable_<span class="hljs-keyword">screen</span>: <span class="hljs-number">40388</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">01</span>-<span class="hljs-number">02</span> <span class="hljs-number">12</span>:<span class="hljs-number">13</span>:<span class="hljs-number">06.988</span>  <span class="hljs-number">1851</span>  <span class="hljs-number">2082</span> V WindowManager: Wallpaper may change!  Adjusting</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">01</span>-<span class="hljs-number">02</span> <span class="hljs-number">12</span>:<span class="hljs-number">13</span>:<span class="hljs-number">07.052</span>  <span class="hljs-number">1851</span>  <span class="hljs-number">2006</span> I WindowManager: <span class="hljs-operator">**</span><span class="hljs-operator">**</span><span class="hljs-operator">**</span><span class="hljs-operator">**</span> booted<span class="hljs-operator">=</span><span class="hljs-keyword">true</span> msg<span class="hljs-operator">=</span><span class="hljs-keyword">false</span> haveBoot<span class="hljs-operator">=</span><span class="hljs-keyword">false</span> haveApp<span class="hljs-operator">=</span><span class="hljs-keyword">false</span> haveWall<span class="hljs-operator">=</span><span class="hljs-keyword">false</span> wallEnabled<span class="hljs-operator">=</span><span class="hljs-keyword">true</span> haveKeyguard<span class="hljs-operator">=</span><span class="hljs-keyword">true</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">01</span>-<span class="hljs-number">02</span> <span class="hljs-number">12</span>:<span class="hljs-number">13</span>:<span class="hljs-number">07.056</span>  <span class="hljs-number">1851</span>  <span class="hljs-number">2082</span> I WindowManager: <span class="hljs-operator">**</span><span class="hljs-operator">**</span><span class="hljs-operator">**</span><span class="hljs-operator">**</span> booted<span class="hljs-operator">=</span><span class="hljs-keyword">true</span> msg<span class="hljs-operator">=</span><span class="hljs-keyword">false</span> haveBoot<span class="hljs-operator">=</span><span class="hljs-keyword">false</span> haveApp<span class="hljs-operator">=</span><span class="hljs-keyword">false</span> haveWall<span class="hljs-operator">=</span><span class="hljs-keyword">false</span> wallEnabled<span class="hljs-operator">=</span><span class="hljs-keyword">true</span> haveKeyguard<span class="hljs-operator">=</span><span class="hljs-keyword">true</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">01</span>-<span class="hljs-number">02</span> <span class="hljs-number">12</span>:<span class="hljs-number">13</span>:<span class="hljs-number">07.184</span>  <span class="hljs-number">1851</span>  <span class="hljs-number">2082</span> I WindowManager: <span class="hljs-operator">**</span><span class="hljs-operator">**</span><span class="hljs-operator">**</span><span class="hljs-operator">**</span> booted<span class="hljs-operator">=</span><span class="hljs-keyword">true</span> msg<span class="hljs-operator">=</span><span class="hljs-keyword">false</span> haveBoot<span class="hljs-operator">=</span><span class="hljs-keyword">false</span> haveApp<span class="hljs-operator">=</span><span class="hljs-keyword">false</span> haveWall<span class="hljs-operator">=</span><span class="hljs-keyword">false</span> wallEnabled<span class="hljs-operator">=</span><span class="hljs-keyword">true</span> haveKeyguard<span class="hljs-operator">=</span><span class="hljs-keyword">true</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="8"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">01</span>-<span class="hljs-number">02</span> <span class="hljs-number">12</span>:<span class="hljs-number">13</span>:<span class="hljs-number">08.049</span>  <span class="hljs-number">1851</span>  <span class="hljs-number">2082</span> V WindowManager: Wallpaper may change!  Adjusting</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="9"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">01</span>-<span class="hljs-number">02</span> <span class="hljs-number">12</span>:<span class="hljs-number">13</span>:<span class="hljs-number">08.066</span>  <span class="hljs-number">1851</span>  <span class="hljs-number">2082</span> I WindowManager: <span class="hljs-operator">**</span><span class="hljs-operator">**</span><span class="hljs-operator">**</span><span class="hljs-operator">**</span> booted<span class="hljs-operator">=</span><span class="hljs-keyword">true</span> msg<span class="hljs-operator">=</span><span class="hljs-keyword">false</span> haveBoot<span class="hljs-operator">=</span><span class="hljs-keyword">false</span> haveApp<span class="hljs-operator">=</span><span class="hljs-keyword">false</span> haveWall<span class="hljs-operator">=</span><span class="hljs-keyword">false</span> wallEnabled<span class="hljs-operator">=</span><span class="hljs-keyword">true</span> haveKeyguard<span class="hljs-operator">=</span><span class="hljs-keyword">true</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="10"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">01</span>-<span class="hljs-number">02</span> <span class="hljs-number">12</span>:<span class="hljs-number">13</span>:<span class="hljs-number">08.067</span>  <span class="hljs-number">1851</span>  <span class="hljs-number">2082</span> I WindowManager: <span class="hljs-operator">**</span><span class="hljs-operator">**</span><span class="hljs-operator">**</span><span class="hljs-operator">**</span> booted<span class="hljs-operator">=</span><span class="hljs-keyword">true</span> msg<span class="hljs-operator">=</span><span class="hljs-keyword">false</span> haveBoot<span class="hljs-operator">=</span><span class="hljs-keyword">false</span> haveApp<span class="hljs-operator">=</span><span class="hljs-keyword">false</span> haveWall<span class="hljs-operator">=</span><span class="hljs-keyword">false</span> wallEnabled<span class="hljs-operator">=</span><span class="hljs-keyword">true</span> haveKeyguard<span class="hljs-operator">=</span><span class="hljs-keyword">true</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="11"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">01</span>-<span class="hljs-number">02</span> <span class="hljs-number">12</span>:<span class="hljs-number">13</span>:<span class="hljs-number">08.071</span>  <span class="hljs-number">1851</span>  <span class="hljs-number">2082</span> I WindowManager: <span class="hljs-operator">**</span><span class="hljs-operator">**</span><span class="hljs-operator">**</span><span class="hljs-operator">**</span> booted<span class="hljs-operator">=</span><span class="hljs-keyword">true</span> msg<span class="hljs-operator">=</span><span class="hljs-keyword">false</span> haveBoot<span class="hljs-operator">=</span><span class="hljs-keyword">false</span> haveApp<span class="hljs-operator">=</span><span class="hljs-keyword">false</span> haveWall<span class="hljs-operator">=</span><span class="hljs-keyword">false</span> wallEnabled<span class="hljs-operator">=</span><span class="hljs-keyword">true</span> haveKeyguard<span class="hljs-operator">=</span><span class="hljs-keyword">true</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="12"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">01</span>-<span class="hljs-number">02</span> <span class="hljs-number">12</span>:<span class="hljs-number">13</span>:<span class="hljs-number">08.072</span>  <span class="hljs-number">1851</span>  <span class="hljs-number">2082</span> I WindowManager: <span class="hljs-operator">**</span><span class="hljs-operator">**</span><span class="hljs-operator">**</span><span class="hljs-operator">**</span> booted<span class="hljs-operator">=</span><span class="hljs-keyword">true</span> msg<span class="hljs-operator">=</span><span class="hljs-keyword">false</span> haveBoot<span class="hljs-operator">=</span><span class="hljs-keyword">false</span> haveApp<span class="hljs-operator">=</span><span class="hljs-keyword">false</span> haveWall<span class="hljs-operator">=</span><span class="hljs-keyword">false</span> wallEnabled<span class="hljs-operator">=</span><span class="hljs-keyword">true</span> haveKeyguard<span class="hljs-operator">=</span><span class="hljs-keyword">true</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="13"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">01</span>-<span class="hljs-number">02</span> <span class="hljs-number">12</span>:<span class="hljs-number">13</span>:<span class="hljs-number">08.076</span>  <span class="hljs-number">1851</span>  <span class="hljs-number">2082</span> I WindowManager: <span class="hljs-operator">**</span><span class="hljs-operator">**</span><span class="hljs-operator">**</span><span class="hljs-operator">**</span> booted<span class="hljs-operator">=</span><span class="hljs-keyword">true</span> msg<span class="hljs-operator">=</span><span class="hljs-keyword">false</span> haveBoot<span class="hljs-operator">=</span><span class="hljs-keyword">false</span> haveApp<span class="hljs-operator">=</span><span class="hljs-keyword">false</span> haveWall<span class="hljs-operator">=</span><span class="hljs-keyword">false</span> wallEnabled<span class="hljs-operator">=</span><span class="hljs-keyword">true</span> haveKeyguard<span class="hljs-operator">=</span><span class="hljs-keyword">true</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="14"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">01</span>-<span class="hljs-number">02</span> <span class="hljs-number">12</span>:<span class="hljs-number">13</span>:<span class="hljs-number">09.894</span>  <span class="hljs-number">1851</span>  <span class="hljs-number">2082</span> V WindowManager: Wallpaper may change!  Adjusting</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="15"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">01</span>-<span class="hljs-number">02</span> <span class="hljs-number">12</span>:<span class="hljs-number">13</span>:<span class="hljs-number">09.908</span>  <span class="hljs-number">1851</span>  <span class="hljs-number">3413</span> V WindowManager: Wallpaper may change!  Adjusting</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="16"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">01</span>-<span class="hljs-number">02</span> <span class="hljs-number">12</span>:<span class="hljs-number">13</span>:<span class="hljs-number">10.178</span>  <span class="hljs-number">1851</span>  <span class="hljs-number">2082</span> I WindowManager: <span class="hljs-operator">**</span><span class="hljs-operator">**</span><span class="hljs-operator">**</span><span class="hljs-operator">**</span> booted<span class="hljs-operator">=</span><span class="hljs-keyword">true</span> msg<span class="hljs-operator">=</span><span class="hljs-keyword">false</span> haveBoot<span class="hljs-operator">=</span><span class="hljs-keyword">false</span> haveApp<span class="hljs-operator">=</span><span class="hljs-keyword">false</span> haveWall<span class="hljs-operator">=</span><span class="hljs-keyword">true</span> wallEnabled<span class="hljs-operator">=</span><span class="hljs-keyword">true</span> haveKeyguard<span class="hljs-operator">=</span><span class="hljs-keyword">true</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="17"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">01</span>-<span class="hljs-number">02</span> <span class="hljs-number">12</span>:<span class="hljs-number">13</span>:<span class="hljs-number">10.186</span>   <span class="hljs-number">292</span>  <span class="hljs-number">3736</span> I sf_<span class="hljs-keyword">stop</span>_bootanim: <span class="hljs-number">43587</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="18"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">01</span>-<span class="hljs-number">02</span> <span class="hljs-number">12</span>:<span class="hljs-number">13</span>:<span class="hljs-number">10.191</span>  <span class="hljs-number">1851</span>  <span class="hljs-number">2082</span> I WindowManager: <span class="hljs-operator">**</span><span class="hljs-operator">**</span><span class="hljs-operator">**</span><span class="hljs-operator">**</span> booted<span class="hljs-operator">=</span><span class="hljs-keyword">true</span> msg<span class="hljs-operator">=</span><span class="hljs-keyword">false</span> haveBoot<span class="hljs-operator">=</span><span class="hljs-keyword">false</span> haveApp<span class="hljs-operator">=</span><span class="hljs-keyword">false</span> haveWall<span class="hljs-operator">=</span><span class="hljs-keyword">true</span> wallEnabled<span class="hljs-operator">=</span><span class="hljs-keyword">true</span> haveKeyguard<span class="hljs-operator">=</span><span class="hljs-keyword">true</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="19"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">01</span>-<span class="hljs-number">02</span> <span class="hljs-number">12</span>:<span class="hljs-number">13</span>:<span class="hljs-number">10.196</span>  <span class="hljs-number">1851</span>  <span class="hljs-number">2082</span> I WindowManager: <span class="hljs-operator">**</span><span class="hljs-operator">**</span><span class="hljs-operator">**</span><span class="hljs-operator">**</span> booted<span class="hljs-operator">=</span><span class="hljs-keyword">true</span> msg<span class="hljs-operator">=</span><span class="hljs-keyword">false</span> haveBoot<span class="hljs-operator">=</span><span class="hljs-keyword">false</span> haveApp<span class="hljs-operator">=</span><span class="hljs-keyword">false</span> haveWall<span class="hljs-operator">=</span><span class="hljs-keyword">true</span> wallEnabled<span class="hljs-operator">=</span><span class="hljs-keyword">true</span> haveKeyguard<span class="hljs-operator">=</span><span class="hljs-keyword">true</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="20"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">01</span>-<span class="hljs-number">02</span> <span class="hljs-number">12</span>:<span class="hljs-number">13</span>:<span class="hljs-number">10.397</span>  <span class="hljs-number">1851</span>  <span class="hljs-number">2082</span> I WindowManager: <span class="hljs-operator">**</span><span class="hljs-operator">**</span><span class="hljs-operator">**</span><span class="hljs-operator">**</span> booted<span class="hljs-operator">=</span><span class="hljs-keyword">true</span> msg<span class="hljs-operator">=</span><span class="hljs-keyword">false</span> haveBoot<span class="hljs-operator">=</span><span class="hljs-keyword">false</span> haveApp<span class="hljs-operator">=</span><span class="hljs-keyword">false</span> haveWall<span class="hljs-operator">=</span><span class="hljs-keyword">true</span> wallEnabled<span class="hljs-operator">=</span><span class="hljs-keyword">true</span> haveKeyguard<span class="hljs-operator">=</span><span class="hljs-keyword">true</span></div></div></li></ol></code><div class="hide-preCode-box"><span class="hide-preCode-bt" data-report-view="{&quot;spm&quot;:&quot;1001.2101.3001.7365&quot;}"><img class="look-more-preCode contentImg-no-view" src="https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png" alt="" title=""></span></div><div class="hljs-button {2}" data-title="复制" οnclick="hljs.copyCode(event)"></div></pre> 
<p>&nbsp;然后在做实验push一个wallpaper_orig到指定目录,BitmapFactory的错误虽然不见了。然而对于缩短时间并没有什么卵用。<br> 看来不是这个异常没有拖慢开机速度。但我注意到</p> 
<pre data-index="15"><code class="hljs language-cobol"><ol class="hljs-ln" style="width:1389px"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">01</span>-<span class="hljs-number">02</span> <span class="hljs-number">12</span>:<span class="hljs-number">13</span>:<span class="hljs-number">10.178</span>  <span class="hljs-number">1851</span>  <span class="hljs-number">2082</span> I WindowManager: <span class="hljs-operator">**</span><span class="hljs-operator">**</span><span class="hljs-operator">**</span><span class="hljs-operator">**</span> booted<span class="hljs-operator">=</span><span class="hljs-keyword">true</span> msg<span class="hljs-operator">=</span><span class="hljs-keyword">false</span> haveBoot<span class="hljs-operator">=</span><span class="hljs-keyword">false</span> haveApp<span class="hljs-operator">=</span><span class="hljs-keyword">false</span> haveWall<span class="hljs-operator">=</span><span class="hljs-keyword">true</span> wallEnabled<span class="hljs-operator">=</span><span class="hljs-keyword">true</span> haveKeyguard<span class="hljs-operator">=</span><span class="hljs-keyword">true</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">01</span>-<span class="hljs-number">02</span> <span class="hljs-number">12</span>:<span class="hljs-number">13</span>:<span class="hljs-number">10.186</span>   <span class="hljs-number">292</span>  <span class="hljs-number">3736</span> I sf_<span class="hljs-keyword">stop</span>_bootanim: <span class="hljs-number">43587</span></div></div></li></ol></code><div class="hljs-button {2}" data-title="复制" οnclick="hljs.copyCode(event)"></div></pre> 
<p>&nbsp;</p> 
<p>这段log中haveWall=true之前一直都是haveWall=false,haveWall表示系统Window已经成功加载好了Wallpaper。Log中不断的输出<br> WindowManager: Wallpaper may change! Adjusting<br> 这里究竟为什么Wallpaper会不断的Adjusting呢?看起来一旦Wallpaper调整好就会将haveWall置true。<br> 追踪了下该句log在代码中的位置:<br> frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java</p> 
<pre data-index="16" class="set-code-hide" name="code"><code class="hljs language-cobol"><ol class="hljs-ln" style="width:100%"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">private <span class="hljs-keyword">boolean</span> checkWaitingForWindowsLocked() {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        <span class="hljs-operator">/</span><span class="hljs-operator">/</span>省略无关代码</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        <span class="hljs-keyword">if</span> (DEBUG_<span class="hljs-keyword">SCREEN</span>_<span class="hljs-keyword">ON</span> || DEBUG_BOOT) {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">            Slog.i(TAG_WM, <span class="hljs-string">"******** booted="</span> <span class="hljs-operator">+</span> mSystemBooted <span class="hljs-operator">+</span> <span class="hljs-string">" msg="</span> <span class="hljs-operator">+</span> mShowingBootMessages</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">                    <span class="hljs-operator">+</span> <span class="hljs-string">" haveBoot="</span> <span class="hljs-operator">+</span> haveBootMsg <span class="hljs-operator">+</span> <span class="hljs-string">" haveApp="</span> <span class="hljs-operator">+</span> haveApp</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">                    <span class="hljs-operator">+</span> <span class="hljs-string">" haveWall="</span> <span class="hljs-operator">+</span> haveWallpaper <span class="hljs-operator">+</span> <span class="hljs-string">" wallEnabled="</span> <span class="hljs-operator">+</span> wallpaperEnabled</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="8"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">                    <span class="hljs-operator">+</span> <span class="hljs-string">" haveKeyguard="</span> <span class="hljs-operator">+</span> haveKeyguard);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="9"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="10"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="11"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        <span class="hljs-operator">/</span><span class="hljs-operator">/</span> <span class="hljs-keyword">If</span> we <span class="hljs-keyword">are</span> turning <span class="hljs-keyword">on</span> the <span class="hljs-keyword">screen</span> <span class="hljs-keyword">to</span> show the boot message,</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="12"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        <span class="hljs-operator">/</span><span class="hljs-operator">/</span> don<span class="hljs-string"><span class="hljs-string">'t do it until the boot message is actually displayed.</span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="13"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-string">        if (!mSystemBooted &amp;&amp; !haveBootMsg) {</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="14"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-string">            return true;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="15"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-string">        }</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="16"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-string"></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="17"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-string">        // If we are turning on the screen after the boot is completed</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="18"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-string">        // normally, don'</span>t do so <span class="hljs-keyword">until</span> we have the application <span class="hljs-keyword">and</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="19"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        <span class="hljs-operator">/</span><span class="hljs-operator">/</span> wallpaper.</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="20"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        <span class="hljs-keyword">if</span> (mSystemBooted <span class="hljs-operator">&amp;</span><span class="hljs-operator">&amp;</span> ((!haveApp <span class="hljs-operator">&amp;</span><span class="hljs-operator">&amp;</span> !haveKeyguard) ||</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="21"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">                (wallpaperEnabled <span class="hljs-operator">&amp;</span><span class="hljs-operator">&amp;</span> !haveWallpaper))) {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="22"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">            <span class="hljs-keyword">return</span> <span class="hljs-keyword">true</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="23"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="24"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="25"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        <span class="hljs-keyword">return</span> <span class="hljs-keyword">false</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="26"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    }</div></div></li></ol></code><div class="hide-preCode-box"><span class="hide-preCode-bt" data-report-view="{&quot;spm&quot;:&quot;1001.2101.3001.7365&quot;}"><img class="look-more-preCode contentImg-no-view" src="https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png" alt="" title=""></span></div><div class="hljs-button {2}" data-title="复制" οnclick="hljs.copyCode(event)"></div></pre> 
<p>这个checkWaitingForWindowsLocked表示是否需要等待系统Windows就绪。被同在WindowManagerService类中的performEnableScreen方法调用</p> 
<p></p> 
<pre data-index="17"><code class="hljs language-csharp"><ol class="hljs-ln" style="width:100%"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">performEnableScreen</span>()</span> {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        <span class="hljs-comment">// Don't enable the screen until all existing windows have been drawn.</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        <span class="hljs-keyword">if</span> (!mForceDisplayEnabled &amp;&amp; checkWaitingForWindowsLocked()) {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">            <span class="hljs-keyword">return</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">}</div></div></li></ol></code><div class="hljs-button {2}" data-title="复制" οnclick="hljs.copyCode(event)"></div></pre> 
<p>&nbsp;</p> 
<p>从注释看performEnableScreen执行的是激活屏幕动作,然而在此之前需要等待系统必要的windows已经被画好了,也就是说我屏幕一旦激活了,绘制好的windows就能马上显示出来。否则performEnableScreen直接就退出了。<br> 而performEnableScreen又是被同在WindowManagerService类中enableScreenAfterBoot方法调用。大致的调用过程如下:<br> AMS打印出boot_progress_enable_screen----&gt;调用WMS的enableScreenAfterBoot---&gt;调用WMS的performEnableScreen---&gt;调用WMS的checkWaitingForWindowsLocked检查是否可以Enable Screen,因为Wallpaper没有准备好,因此checkWaitingForWindowsLocked返回了true,进而导致performEnableScreen直接返回,没有去执行本来要做的Enable Screen动作。</p> 
<p>WindowManager: Wallpaper may change! Adjusting<br> 是在下面的code打印出来的。<br> frameworks/base/services/core/java/com/android/server/wm/WindowSurfacePlacer.java</p> 
<pre data-index="18"><code class="hljs language-typescript"><ol class="hljs-ln" style="width:100%"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-comment">// "Something has changed!  Let's make it correct now."</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-keyword">private</span> <span class="hljs-built_in">void</span> <span class="hljs-title function_">performSurfacePlacementInner</span>(<span class="hljs-params"><span class="hljs-built_in">boolean</span> recoveringMemory</span>) {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        <span class="hljs-comment">//省略无关代码</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        <span class="hljs-keyword">if</span> (mWallpaperMayChange) {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">            <span class="hljs-keyword">if</span> (<span class="hljs-variable constant_">DEBUG_WALLPAPER_LIGHT</span>)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">                <span class="hljs-title class_">Slog</span>.<span class="hljs-title function_">v</span>(<span class="hljs-variable constant_">TAG</span>, <span class="hljs-string">"Wallpaper may change!  Adjusting"</span>);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">            defaultDisplay.<span class="hljs-property">pendingLayoutChanges</span> |= <span class="hljs-variable constant_">FINISH_LAYOUT_REDO_WALLPAPER</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="8"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">            <span class="hljs-keyword">if</span> (<span class="hljs-variable constant_">DEBUG_LAYOUT_REPEATS</span>) <span class="hljs-title function_">debugLayoutRepeats</span>(<span class="hljs-string">"WallpaperMayChange"</span>,</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="9"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">                    defaultDisplay.<span class="hljs-property">pendingLayoutChanges</span>);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="10"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="11"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">       <span class="hljs-comment">//省略无关代码</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="12"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">}</div></div></li></ol></code><div class="hljs-button {2}" data-title="复制" οnclick="hljs.copyCode(event)"></div></pre> 
<p>debug调用栈如下:</p> 
<pre data-index="19"><code class="hljs language-cobol"><ol class="hljs-ln" style="width:1372px"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">1</span>-<span class="hljs-number">01</span> <span class="hljs-number">21</span>:<span class="hljs-number">18</span>:<span class="hljs-number">30.572</span>  <span class="hljs-number">2912</span>  <span class="hljs-number">2962</span> W System.err: java.lang.<span class="hljs-keyword">Exception</span>: print stack</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">01</span>-<span class="hljs-number">01</span> <span class="hljs-number">21</span>:<span class="hljs-number">18</span>:<span class="hljs-number">30.573</span>  <span class="hljs-number">2912</span>  <span class="hljs-number">2962</span> W System.err:    <span class="hljs-keyword">at</span> com.android.server.wm.WindowManagerService.checkWaitingForWindowsLocked(WindowManagerService.java:<span class="hljs-number">5841</span>)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">01</span>-<span class="hljs-number">01</span> <span class="hljs-number">21</span>:<span class="hljs-number">18</span>:<span class="hljs-number">30.574</span>  <span class="hljs-number">2912</span>  <span class="hljs-number">2962</span> W System.err:    <span class="hljs-keyword">at</span> com.android.server.wm.WindowManagerService.performEnableScreen(WindowManagerService.java:<span class="hljs-number">5905</span>)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">01</span>-<span class="hljs-number">01</span> <span class="hljs-number">21</span>:<span class="hljs-number">18</span>:<span class="hljs-number">30.575</span>  <span class="hljs-number">2912</span>  <span class="hljs-number">2962</span> W System.err:    <span class="hljs-keyword">at</span> com.android.server.wm.WindowManagerService$H.handleMessage(WindowManagerService.java:<span class="hljs-number">8390</span>)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">01</span>-<span class="hljs-number">01</span> <span class="hljs-number">21</span>:<span class="hljs-number">18</span>:<span class="hljs-number">30.576</span>  <span class="hljs-number">2912</span>  <span class="hljs-number">2962</span> W System.err:    <span class="hljs-keyword">at</span> android.os.Handler.dispatchMessage(Handler.java:<span class="hljs-number">102</span>)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">01</span>-<span class="hljs-number">01</span> <span class="hljs-number">21</span>:<span class="hljs-number">18</span>:<span class="hljs-number">30.577</span>  <span class="hljs-number">2912</span>  <span class="hljs-number">2962</span> W System.err:    <span class="hljs-keyword">at</span> android.os.Looper.loop(Looper.java:<span class="hljs-number">154</span>)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">01</span>-<span class="hljs-number">01</span> <span class="hljs-number">21</span>:<span class="hljs-number">18</span>:<span class="hljs-number">30.578</span>  <span class="hljs-number">2912</span>  <span class="hljs-number">2962</span> W System.err:    <span class="hljs-keyword">at</span> android.os.HandlerThread.<span class="hljs-keyword">run</span>(HandlerThread.java:<span class="hljs-number">61</span>)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="8"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">01</span>-<span class="hljs-number">01</span> <span class="hljs-number">21</span>:<span class="hljs-number">18</span>:<span class="hljs-number">30.578</span>  <span class="hljs-number">2912</span>  <span class="hljs-number">2962</span> W System.err:    <span class="hljs-keyword">at</span> com.android.server.ServiceThread.<span class="hljs-keyword">run</span>(ServiceThread.java:<span class="hljs-number">46</span>)</div></div></li></ol></code><div class="hljs-button {2}" data-title="复制" οnclick="hljs.copyCode(event)"></div></pre> 
<p>这块没有检查出多余的操作,没继续check了。<br> 经过以上分析后修改代码,最终问题机的开机速度达到了参考机的标准。性能问题是一个持续挖掘改善的过程,开机过程中还能优化的地方肯定还有。</p> 
<p></p> 
<h2><a name="t5"></a>debug 技术说明</h2> 
<p>汇总下分析该问题时,汇集的一些debug技术。</p> 
<ul><li> <p>java代码中打印堆栈 Slog.d("azhengye", "Stack=="+new RuntimeException("azhengye debug").fillInStackTrace());<br> 或者new Exception("print stack").printStackTrace(); 然后log中搜索"System.err:"</p> </li><li> <p>c++ debug: 为了在native查看函数调用栈可以在需要的地方添加如下代码。<br> #include &lt;utils/CallStack.h&gt;<br> android::CallStack stack;<br> stack.update();<br> String8 strtemp = stack.toString("");<br> ALOGD("\t%s", strtemp.string());<br> 过滤出的log还需要用arm-linux-androideabi-addr2line转行下,好在有现成的脚本帮我们做这件事,这里一并贴出来。</p> </li></ul> 
<pre data-index="20" class="set-code-hide" name="code"><code class="hljs language-cobol"><ol class="hljs-ln" style="width:100%"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">#!<span class="hljs-operator">/</span>usr<span class="hljs-operator">/</span>bin<span class="hljs-operator">/</span>python  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"># stack symbol parser  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">import os  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">import <span class="hljs-keyword">string</span>  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">import sys  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="8"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">ANDROID_TARGET_OUT <span class="hljs-operator">=</span> os.getcwd()<span class="hljs-operator">+</span><span class="hljs-string">"/"</span>  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="9"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="10"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"># addr<span class="hljs-number">2</span><span class="hljs-keyword">line</span> tool path <span class="hljs-keyword">and</span> symbol path  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="11"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">addr<span class="hljs-number">2</span><span class="hljs-keyword">line</span>_tool <span class="hljs-operator">=</span> <span class="hljs-string">'arm-linux-androideabi-addr2line'</span>  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="12"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">symbol_dir <span class="hljs-operator">=</span> ANDROID_TARGET_OUT <span class="hljs-operator">+</span> <span class="hljs-string">'/symbols'</span>  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="13"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">symbol_bin <span class="hljs-operator">=</span> symbol_dir <span class="hljs-operator">+</span> <span class="hljs-string">'/system/bin/'</span>  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="14"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">symbol_lib <span class="hljs-operator">=</span> symbol_dir <span class="hljs-operator">+</span> <span class="hljs-string">'/system/lib/'</span>  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="15"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="16"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-keyword">class</span> ReadLog:  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="17"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    def __init__(<span class="hljs-keyword">self</span>,filename):  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="18"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        <span class="hljs-keyword">self</span>.logname <span class="hljs-operator">=</span> filename  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="19"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    def parse(<span class="hljs-keyword">self</span>):  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="20"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        f <span class="hljs-operator">=</span> <span class="hljs-keyword">file</span>(<span class="hljs-keyword">self</span>.logname,<span class="hljs-string">'r'</span>)  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="21"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        <span class="hljs-keyword">lines</span> <span class="hljs-operator">=</span> f.readlines()  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="22"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        <span class="hljs-keyword">if</span> <span class="hljs-keyword">lines</span> !<span class="hljs-operator">=</span> []:  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="23"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">            print <span class="hljs-string">'read file ok'</span>  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="24"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        <span class="hljs-keyword">else</span>:  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="25"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">            print <span class="hljs-string">'read file failed'</span>  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="26"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        result <span class="hljs-operator">=</span>[]  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="27"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        <span class="hljs-keyword">for</span> <span class="hljs-keyword">line</span> <span class="hljs-keyword">in</span> <span class="hljs-keyword">lines</span>:  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="28"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">            <span class="hljs-keyword">if</span> <span class="hljs-keyword">line</span>.find(<span class="hljs-string">'stack'</span>) !<span class="hljs-operator">=</span> -<span class="hljs-number">1</span>:  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="29"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">                print <span class="hljs-string">'stop search'</span>  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="30"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">                break  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="31"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">            elif <span class="hljs-keyword">line</span>.find(<span class="hljs-string">'system'</span>) !<span class="hljs-operator">=</span> -<span class="hljs-number">1</span>:  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="32"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">                #print <span class="hljs-string">'find one item'</span> <span class="hljs-operator">+</span> <span class="hljs-keyword">line</span>  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="33"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">                result.append(<span class="hljs-keyword">line</span>)  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="34"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        <span class="hljs-keyword">return</span> result  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="35"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="36"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-keyword">class</span> ParseContent:  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="37"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    def __init__(<span class="hljs-keyword">self</span>,addr,lib):  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="38"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">            <span class="hljs-keyword">self</span>.<span class="hljs-keyword">address</span> <span class="hljs-operator">=</span> addr # pc <span class="hljs-keyword">address</span>  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="39"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">            <span class="hljs-keyword">self</span>.exename <span class="hljs-operator">=</span> lib  # executable <span class="hljs-keyword">or</span> shared library  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="40"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    def addr<span class="hljs-number">2</span><span class="hljs-keyword">line</span>(<span class="hljs-keyword">self</span>):  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="41"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        cmd <span class="hljs-operator">=</span> addr<span class="hljs-number">2</span><span class="hljs-keyword">line</span>_tool <span class="hljs-operator">+</span> <span class="hljs-string">" -C -f -s -e "</span> <span class="hljs-operator">+</span> symbol_dir <span class="hljs-operator">+</span> <span class="hljs-keyword">self</span>.exename <span class="hljs-operator">+</span> <span class="hljs-string">" "</span> <span class="hljs-operator">+</span> <span class="hljs-keyword">self</span>.<span class="hljs-keyword">address</span>  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="42"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        #print cmd  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="43"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        stream <span class="hljs-operator">=</span> os.popen(cmd)  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="44"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        <span class="hljs-keyword">lines</span> <span class="hljs-operator">=</span> stream.readlines();  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="45"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        list <span class="hljs-operator">=</span> map(<span class="hljs-keyword">string</span>.strip,<span class="hljs-keyword">lines</span>)  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="46"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        <span class="hljs-keyword">return</span> list  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="47"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">      </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="48"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">inputarg <span class="hljs-operator">=</span> sys.argv  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="49"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-keyword">if</span> len(inputarg) <span class="hljs-operator">&lt;</span> <span class="hljs-number">2</span>:  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="50"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    print <span class="hljs-string">'Please input panic log'</span>  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="51"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    <span class="hljs-keyword">exit</span>()  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="52"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="53"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">filename <span class="hljs-operator">=</span> inputarg[<span class="hljs-number">1</span>]  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="54"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">readlog <span class="hljs-operator">=</span> ReadLog(filename)  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="55"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">inputlist <span class="hljs-operator">=</span> readlog.parse()  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="56"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="57"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-keyword">for</span> item <span class="hljs-keyword">in</span> inputlist:  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="58"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    itemsplit <span class="hljs-operator">=</span> item.split()  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="59"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    <span class="hljs-keyword">test</span> <span class="hljs-operator">=</span> ParseContent(itemsplit[-<span class="hljs-number">2</span>],itemsplit[-<span class="hljs-number">1</span>])  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="60"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    list <span class="hljs-operator">=</span> <span class="hljs-keyword">test</span>.addr<span class="hljs-number">2</span><span class="hljs-keyword">line</span>()  </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="61"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    print <span class="hljs-string">"%-30s%s"</span> % (list[<span class="hljs-number">1</span>],list[<span class="hljs-number">0</span>])  </div></div></li></ol></code><div class="hide-preCode-box"><span class="hide-preCode-bt" data-report-view="{&quot;spm&quot;:&quot;1001.2101.3001.7365&quot;}"><img class="look-more-preCode contentImg-no-view" src="https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png" alt="" title=""></span></div><div class="hljs-button {2}" data-title="复制" οnclick="hljs.copyCode(event)"></div></pre> 
<p>&nbsp;在源码编译的imge文</p> 
<p>件夹下执行上面的脚本,调试 SF 的bootFinished就用的该脚本,下面是个输出例子。</p> 
<p>&nbsp;</p> 
<pre data-index="21" class="set-code-hide" name="code"><code class="hljs language-cobol"><ol class="hljs-ln" style="width:993px"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">01</span>-<span class="hljs-number">02</span> <span class="hljs-number">01</span>:<span class="hljs-number">38</span>:<span class="hljs-number">13.305</span>   <span class="hljs-number">477</span>  <span class="hljs-number">3072</span> D azhengye   :   #<span class="hljs-number">00</span> pc <span class="hljs-number">000059</span>b<span class="hljs-number">9</span>  <span class="hljs-operator">/</span>system<span class="hljs-operator">/</span>bin<span class="hljs-operator">/</span>bootanimation</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">01</span>-<span class="hljs-number">02</span> <span class="hljs-number">01</span>:<span class="hljs-number">38</span>:<span class="hljs-number">13.305</span>   <span class="hljs-number">477</span>  <span class="hljs-number">3072</span> D azhengye   :   #<span class="hljs-number">01</span> pc <span class="hljs-number">00006515</span>  <span class="hljs-operator">/</span>system<span class="hljs-operator">/</span>bin<span class="hljs-operator">/</span>bootanimation</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">01</span>-<span class="hljs-number">02</span> <span class="hljs-number">01</span>:<span class="hljs-number">38</span>:<span class="hljs-number">13.305</span>   <span class="hljs-number">477</span>  <span class="hljs-number">3072</span> D azhengye   :   #<span class="hljs-number">02</span> pc <span class="hljs-number">0000591</span>f  <span class="hljs-operator">/</span>system<span class="hljs-operator">/</span>bin<span class="hljs-operator">/</span>bootanimation</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">01</span>-<span class="hljs-number">02</span> <span class="hljs-number">01</span>:<span class="hljs-number">38</span>:<span class="hljs-number">13.305</span>   <span class="hljs-number">477</span>  <span class="hljs-number">3072</span> D azhengye   :   #<span class="hljs-number">03</span> pc <span class="hljs-number">000054</span>f<span class="hljs-number">1</span>  <span class="hljs-operator">/</span>system<span class="hljs-operator">/</span>bin<span class="hljs-operator">/</span>bootanimation</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">01</span>-<span class="hljs-number">02</span> <span class="hljs-number">01</span>:<span class="hljs-number">38</span>:<span class="hljs-number">13.305</span>   <span class="hljs-number">477</span>  <span class="hljs-number">3072</span> D azhengye   :   #<span class="hljs-number">04</span> pc <span class="hljs-number">0000</span>e<span class="hljs-number">349</span>  <span class="hljs-operator">/</span>system<span class="hljs-operator">/</span>lib<span class="hljs-operator">/</span>libutils.so</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">01</span>-<span class="hljs-number">02</span> <span class="hljs-number">01</span>:<span class="hljs-number">38</span>:<span class="hljs-number">13.305</span>   <span class="hljs-number">477</span>  <span class="hljs-number">3072</span> D azhengye   :   #<span class="hljs-number">05</span> pc <span class="hljs-number">000473</span>d<span class="hljs-number">3</span>  <span class="hljs-operator">/</span>system<span class="hljs-operator">/</span>lib<span class="hljs-operator">/</span>libc.so</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">01</span>-<span class="hljs-number">02</span> <span class="hljs-number">01</span>:<span class="hljs-number">38</span>:<span class="hljs-number">13.305</span>   <span class="hljs-number">477</span>  <span class="hljs-number">3072</span> D azhengye   :   #<span class="hljs-number">06</span> pc <span class="hljs-number">0001</span>a<span class="hljs-number">0</span>c<span class="hljs-number">9</span>  <span class="hljs-operator">/</span>system<span class="hljs-operator">/</span>lib<span class="hljs-operator">/</span>libc.so</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="8"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">------------------------------------------------------------------------------------</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="9"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">python panic.py <span class="hljs-operator">/</span><span class="hljs-keyword">data</span><span class="hljs-operator">/</span>My_Doc<span class="hljs-operator">/</span>Performance<span class="hljs-operator">/</span>boot_c_log </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="10"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-keyword">read</span> <span class="hljs-keyword">file</span> ok</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="11"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">BootAnimation.cpp:<span class="hljs-number">534</span>         android<span class="hljs-operator">::</span>BootAnimation<span class="hljs-operator">::</span>checkExit()</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="12"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">BootAnimation.cpp:<span class="hljs-number">972</span>         android<span class="hljs-operator">::</span>BootAnimation<span class="hljs-operator">::</span>playAnimation(android<span class="hljs-operator">::</span>BootAnimation<span class="hljs-operator">::</span>Animation const<span class="hljs-operator">&amp;</span>)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="13"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">BootAnimation.cpp:<span class="hljs-number">870</span>         android<span class="hljs-operator">::</span>BootAnimation<span class="hljs-operator">::</span>movie()</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="14"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">BootAnimation.cpp:<span class="hljs-number">452</span>         android<span class="hljs-operator">::</span>BootAnimation<span class="hljs-operator">::</span>threadLoop()</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="15"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Threads.cpp:<span class="hljs-number">751</span>               android<span class="hljs-operator">::</span>Thread<span class="hljs-operator">::</span>_threadLoop(void<span class="hljs-operator">*</span>)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="16"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">pthread_create.cpp:<span class="hljs-number">198</span> (discriminator <span class="hljs-number">1</span>)__pthread_<span class="hljs-keyword">start</span>(void<span class="hljs-operator">*</span>)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="17"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">clone.cpp:<span class="hljs-number">41</span> (discriminator <span class="hljs-number">1</span>)__<span class="hljs-keyword">start</span>_thread</div></div></li></ol></code><div class="hide-preCode-box"><span class="hide-preCode-bt" data-report-view="{&quot;spm&quot;:&quot;1001.2101.3001.7365&quot;}"><img class="look-more-preCode contentImg-no-view" src="https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png" alt="" title=""></span></div><div class="hljs-button {2}" data-title="复制" οnclick="hljs.copyCode(event)"></div></pre> 
<ul><li>堆栈dump 
  <blockquote> 
   <p>adb shell kill -3 &lt;pid&gt;</p> 
  </blockquote> </li></ul> 
<p>输出的trace会保存在 /data/anr/traces.txt文件中。这个需要注意,如果没有 /data/anr/这个目录 或/data/anr/traces.txt这个文件,需要手工创建一下,并设置好读写权限。如果是native thread的堆栈打印,可能需要修改dalvik/vm/Thread.cpp的dumpNativeThread方法。</p> 
<ul><li>debuggerd coredump 这个是开始分析问题查资料找到的debug方法,不过自己没有实践,仅作记录参考。<br> debuggerd是android的一个daemon进程,负责在进程异常出错时,将进程的运行时信息dump出来供分析。debuggerd生成的coredump数据是以文本形式呈现,被保存在 /data/tombstone/ 目录下,它可以在不中断进程执行的情况下打印当前进程的native堆栈。使用方法是:</li></ul> 
<blockquote> 
 <p>debuggerd -b &lt;pid&gt;</p> 
</blockquote> 
<p>这可以协助我们分析进程执行行为,也可以用来定位native进程中锁死或错误逻辑引起的死循环的代码位置。</p> 
<h2><a name="t6"></a>总结</h2> 
<p>各家厂商都会定制不同的开机行为,因此没有一个固定的方法能fix所有的开机问题,但通过本文我们总结分析该类问题的套路,那就是关注boot阶段的各个event事件,先量化出开机慢在哪里,然后在去针对性的优化。<br> 源码真的是个宝库,多读吧。</p> 
<p></p> 
<p>文章转载:</p> 
<p id="articleContentId"><a class="link-info" href="https://blog.csdn.net/wd229047557/article/details/80773797">Android开机速度优化(第三篇)</a></p> 
<p></p>
                </div><div data-report-view="{&quot;mod&quot;:&quot;1585297308_001&quot;,&quot;spm&quot;:&quot;1001.2101.3001.6548&quot;,&quot;dest&quot;:&quot;https://lumeng.blog.csdn.net/article/details/121977229&quot;,&quot;extend1&quot;:&quot;pc&quot;,&quot;ab&quot;:&quot;new&quot;}"><div></div></div>
        </div>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值