联系我们: 有道技术团队助手:ydtech01 / 邮箱:[email protected]
本文的重点在于如何定量的排查冷启动过程中的耗时操作,并提供对应的优化思路和实践方法总结。同时文本涉及到的冷启动优化主要涵盖两个方面:Application 的性能优化和 Launcher Activity 的性能优化。
一、背景
中国大学 MOOC 是网易与高教社携手推出的在线教育平台,目前,经过长期的产品打磨和钻研,在课程数量、质量以及影响力,中国大学 MOOC 已成为全球领先的中文慕课平台。同时经过此次优化,冷启动速度整体提升27%。
在我们日常开发中,随着 app 整体迭代次数增多,由于长久以来的迭代需求,android app 本身也集成了较多的第三方组件和 SDK,同时在日常迭代中,也是以业务迭代需求实现为主要目的,导致现在 app 本身,或多或少存在一些性能可优化空间。所以有必要进行性能优化,提升用户体验。
此次优化,主要侧重于两个方面:
- Application 的性能优化
- app 启动页性能优化
该文档重点不在于代码规范和业务代码逻辑导致的性能问题,而是在假设代码无明显、严重性能漏洞,并且不改变原有业务逻辑,量化性能监测数据和问题,并针对其进行优化修改。
二、冷启动速度优化
2.1 相关知识点
2.1.1 冷启动耗时统计
adb shell am start -S -W [packageName]/[activiytName]
上述 adb 命令中,几个关键参数说明:
- -S:表示启动该 app 前先彻底关闭当前 app 进程
- -W:启动并输出相关耗时数据
- packageName:app 的 applicationID
- activityName:app 启动需要拉起的 Activity,如果用于统计冷启动耗时,那么该参数即为应用的第一个启动的 Activity( intent-filter 为 LAUNCHER 的 Activity )
再执行上诉 adb 后,会成功唤起 APP,并在控制台输出三个比较关键的参数:
- LaunchState:启动模式,上诉启动模式为冷启动
- WaitTime:系统启动应用耗时= TotalTime +系统资源启动时间(单位 ms )
- TotalTime:应用自身启动耗时=该 Activity 启动时间+应用 application 等资源启动时间(单位 ms )
对于应用层面得冷启动性能优化,我们关注的时间 TotalTime,该时间大致可以概括为:Application 构造方法→该 Activity 的 onWindowFocusChange 方法时间总和。而这个过程也可以粗略认知为,用户点击桌面图标到 app 第一个 Activity 获取焦点,业务代码执行的总时间(针对业务代码的优化,我们暂时不关心 Zygote 进程、Launcher 进程、AMS 进程的交互)。
2.1.2 冷启动耗时堆栈观察方法:
在 Android API>=26 的系统版本中,建议使用 CPU Profile 或者 Debug.startMethodTracing 进行监控并导出 trace 文件进行分析。不管哪种方式,采集堆栈信息都有两种模式:采样模式和追踪模式。追踪模式会一直抓取数据,对设备性能要求较高。
(1)CPU Profile
(2)Debug.startMethodTracing
由于冷启动涉及到业务应用层面的时间是:该 Activity 启动时间+应用 application 等资源启动时间,所以我们在 Application 构造方法中开始采集,在第一个 Activity 的 onWindowFocusChange 中停止采集,并输出 trace文件。
/**
* 在Application构造方法中开始采集
*/
public UcmoocApplication() {
//保存Trace文件的目录
File file = new File(Environment.getExternalStorageDirectory(), "ucmooc.trace");
//采集方式有以下两种,根据需求选择其一
//第一种:通过采样的方式,追踪堆栈信息
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
//通过采样方式追踪堆栈信息,需要指定文件保存目录、文件最大大小(单位M)、采样间隔(单位us)
Debug.startMethodTracingSampling(file.getAbsolutePath(), 8, 1000);
}
//第二种:通过追踪的方式,全量采集堆栈信息
Debug.startMethodTracing(file