Android性能优化笔记(一)——启动优化

论坛 期权论坛     
选择匿名的用户   2021-5-23 02:15   12   0
<div class="article-content">
<blockquote></blockquote>
<p>本文主要是学习了极客时间张绍文老师的 <a href="https://link.juejin.im?target&#61;https%3A%2F%2Ftime.geekbang.org%2Fcolumn%2F142"><b><u>Android开发高手课</u></b></a> 以及 <b><u><a href="https://link.juejin.im?target&#61;https%3A%2F%2Fdeveloper.android.google.cn%2Ftopic%2Fperformance%2Fvitals%2Flaunch-time">谷歌官网文章</a> </u></b>的启动优化笔记~</p>
<blockquote>
  参考文章:
  <br>https://time.geekbang.org/column/article/73651 https://mp.weixin.qq.com/s/eaArt5Udc4WZ3NoH5RlEkQ https://juejin.im/post/5874bff0128fe1006b443fa0 https://developer.android.google.cn/topic/performance/vitals/launch-time
  <br>
</blockquote>
<h2>应用启动类型</h2>
<p></p>
<ul><li><b>冷启动</b></li></ul>
<p></p>
<ol><li>场景:开机后第一次启动应用 或者 应用被杀死后再次启动<br></li><li>生命周期:Process.start-&gt;Application创建-&gt;attachBaseContext-&gt;onCreate-&gt;onStart-&gt;onResume-&gt;Activity生命周期<br></li><li>启动速度:在几种启动类型中最慢,也是我们优化启动速度最大的拦路虎</li></ol>
<p></p>
<ul><li><b>温启动</b></li></ul>
<p></p>
<ol><li>场景:应用已经启动,返回键退出</li><li>生命周期:onCreate-&gt;onStart-&gt;onResume-&gt;Activity生命周期</li><li>启动速度:较快</li></ol>
<p></p>
<ul><li><b>热启动</b></li></ul>
<p></p>
<ol><li>场景:Home键最小化应用</li><li>生命周期:onResume-&gt;Activity生命周期</li><li>启动速度:快</li></ol>
<p></p>
<p></p>
<p>从上面的总结可以看出,在应用的启动过程中,冷启动是最慢最耗时的,系统以及应用本身都有大量的工作需要处理,所以,冷启动对于应用的启动速度是最具挑战以及最有必要进行优化的。</p>
<p><br></p>
<h2>冷启动流程</h2>
<p>冷启动指的是应用程序从进程在系统不存在,到系统创建应用运行进程空间的过程。冷启动通常会发生在一下两种情况:</p>
<ul><li>设备启动以来首次启动应用程序</li><li>系统杀死应用程序之后再次启动应用程序</li></ul>
<p>在冷启动的最开始,系统需要负责做三件事:</p>
<ul><li>加载以及启动app</li><li>app启动之后立刻显示一个空白的预览窗口</li><li>创建app进程</li></ul>
<p>一旦系统完成创建app进程后,app进程将要接着负责完成下面的工作:</p>
<ul><li>创建Application对象</li><li>创建并且启动主线程ActivityThread</li><li>创建启动第一个Activity</li><li>Inflating views</li><li>布局屏幕</li><li>执行第一次绘制</li></ul>
<p>一旦app进程完完成了第一次绘制工作,系统进程就会用main activity替换前面显示的预览窗口,这个时候,用户就可以正式开始与app进行交互了。</p>
<p>           <br></p>
<p><b>从冷启动的流程看,我们无法干预app进程创建等系统操作,我们能够干预的有:</b></p>
<ul><li><b>预览窗口</b><br></li><li><b>Application生命周期回调</b><br></li><li><b>Activity生命周期回调</b></li></ul>
<p><br></p>
<h2>优化分析测量工具</h2>
<p>对研发人员来说,启动速度是我们的“门面”,它清清楚楚可以被所有人看到,我们都希望自己应用的启动速度可以秒杀所有竞争对手。</p>
<p>“工欲善其事必先利其器”,我们需要先找到一款适合做启动优化分析的工具或者方式。</p>
<ul><li><b>adb shell am start -W [packageName]/[ packageName. AppstartActivity]</b><br></li></ul>
<p> 在统计 app 启动时间时,系统为我们提供了 adb 命令,可以输出启动时间。系统在绘制完成后,ActivityManagerService 会回调该方法,但是能够方便我们通过脚本多次启动测量 TotalTime,对比版本间启动时间差异。但是统计时间不如 Systrace 准确。</p>
<ul><li><b>代码埋点</b><br></li></ul>
<p>通过代码埋点来准确获取记录每个方法的执行时间,知道哪些地方耗时,然后再有针对性地优化。例如通过在 app 启动生命周期中,关键位置加入时间点记录,达到测量目的;又例如可以在 Application 的 <code>attachBaseContext</code>方法中记录开始时间,然后在启动的第一个 Activity 的 <code>onWindowFocusChanged</code>方法记录结束时间。</p>
<p>但是从用户点击 app Icon 到 Application 被创建,再到 Activity 的渲染,中间还是有很多步骤的,比如冷启动的进程创建过程,而这个时间用此版本是没办法统计了,必须得承受这点数据的不准确性。</p>
<ul><li><p><b>Nanoscope</b></p></li></ul>
<p>Nanoscope 非常真实,不过暂时只支持 Nexus 6 和 x86 模拟器。<br></p>
<ul><li><p><b>Simpleperf</b></p></li></ul>
<p>Simpleperf 的火焰图并不适合做启动流程分析。</p>
<ul><li><b>TraceView</b></li></ul>
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP