启动目标:2s内优秀,2-5s普通,之后的都需要优化,热启动则是1.5s-2s内
1 看下大致串联启动流程:
App 进程在 Fork 之后,需要首先执行 bindApplication
Application 的环境创建好之后,就开始activity的启动
Activity 的生命周期函数会在 Activity 组件创建的时候执行,包括 onStart、onCreate、onResume ,然后还要经过一次 Choreographer.doFrame 的执行(包括 measure、layout、draw,animation,input)以及 RenderThread 的初始化和第一帧任务的绘制,
再加上 SurfaceFlinger 一个 Vsync 周期的合成,应用第一帧才会真正显示
2 使用技巧:
首先抓取systrace 查看进程是否占用率过高,过高的话,就看下线程是不是太多了,不多的话,就是系统的原因了。再看下uithread线程哪里耗时比较大的,可以考虑下面方案:
要按顺序执行,影响依次降低。
1 是否可以放到子线程
2 是否可以延时加载
3 代码里优化主线程耗时部分
4 代码里优化子线程耗时部分(cpu占用高的话,尤其明显)
5 优化内存(内存大了,影响cpu调度)
到此就结束了。
代码里优化具体比如:
有些能用文件操作的,尽量采用文件操作,文件操作的速度比数据库的操作要快10倍左右
循环体里面尽量不要用临时局部变量,能用局部变量的不用成员变量
尽量减少一次性初始化N多大数据量,容易造成GC,并且卡顿
采用SurfaceView在子线程刷新UI, 避免手势的处理和绘制在同一UI线程
使用增强for循环
如:Set<Object> set = new HashSet<Object>();
移位操作替代乘法
具体android profile 都有替代了,可以完全用一个工具来搞一切
我就不一一总结了,详细记录见:https://blog.csdn.net/qq_20451879/article/details/121426183
但使用方式,我会稍后写出来,暂时觉得,systemtrace, prof文件对单纯app不实用,直接抓取 java 的method trace 或java的新增对象内存更好一些。
如下图:
卡顿我是没有经验的,平时用不着啊,卡的狠了,就anr了,不狠就不用管 。这里只能浅显的记录下,不过我开始技术储备一下了
3 systrace使用技巧:
1 通过在时间间隔周围绘制一个矩形来选择所需的时间间隔。
2 使用标尺工具标记或突出显示问题区域。
3 依次点击 View Options > Highlight VSync,以显示每项显示屏刷新操作。
4 如果觉得页面中的信息太多了,想要筛选,可以点击Processes菜单,在弹出列表中进行筛选
Systrace 报告列出了渲染界面帧的每个进程,并指明了沿时间轴渲染的每个帧
点击某个帧圆圈可将其突出显示,并提供有关系统为渲染该帧所做工作的其他信息,包括提醒。
此报告还会显示系统在渲染该帧时执行的方法。您可以调查这些方法以确定界面卡顿的可能原因