主要是冷启动优化。
借助systrace 以及 traceview工具共同判断。Android10以上可用perfetto代替systrace。忘记哪个版本开始SDK中的platform-tools中移除了systrace。
可以用systrace看下准确耗时的流程,通过在代码中加入Trace.beginSection/endSection标识起始点。
再通过traceview的Debug.startMethodTracing来看下具体的方法执行的时间比例,这个工具无法查看精准时间有误差。但是可以通过比例排查是哪个方法耗时。
应用启动的开始时间点标记在attachBaseContext处,结束时间点标志性在Activity/WindowFocusChanged处。根据activity启动流程得出结论。
绿色联盟应用的标准: 冷启动 < 1000ms 热启动 < 500ms。
应用原始启动时间是 1147ms。
首轮优化: 将极光/友盟SDK初始化放到子线程,网络接口相关初始化也放到子线程。启动时间是: 758ms。还是挺显著,当然本来表现也还可以。
systrace是个python脚本,仅支持python2.7。具体使用可用help 或 --list-categories查看。
常用参数: python systrace.py -o {文件路径} -t 8 -b 16384 -a {包名} gfx view am sm wm res sched freq idle
traceview生成的文件默认在存储上的应用沙盒目录下。
第二轮优化:将View通过LayoutInflater解析xml方式改为new方式创建。效果同样十分明显。能在原基础上根据xml复杂程度减少很大一部分时间。注意在子线程上构建View、绑定View属性,在主线程添加View。
其实在自线程也可以更新View,只要不涉及Layout变化即可。例如TextView,只要控件尺寸固定,在子线程更新view也没问题。例如ImageView,只要填充图片的Drawable尺寸没变化即可。关键就是不要触发requestLayout方法。
另外使用AsyncLayoutInflator也是个选择,可以异步预加载复杂的页面。