今天来讲APP性能优化的第一步,也是用户接触最直接的一步: 冷启动优化; 主要从以下几个问题来入手
什么是冷启动?什么是热启动?
冷启动的过程中,系统都做了什么
pre-main过程该如何优化?
T3过程该如何优化?
冷启动: 在APP点击启动前,他的进程不在系统中,需要系统新创建一个进程分配给它,并进行启动的情况; 冷启动是一次完整的启动过程
相对的 热启动: 按下home键的时候,app还存在一段时间,这时点击app马上就能恢复到原状态; 这种启动我们称为热启动
APP的启动时间,是指从用户点击APP开始,到用户看到第一个界面之间的时间;总的来说,APP启动主要包括三个阶段:
1.T1: main()函数执行前:pre-main
2.T2: main()函数执行后至didFinishLaunch:behind-main
3.T3: didFinishLaunch至首屏渲染完成
dyld是App的启动器,启动的大部分事情都由dyld完成,iOS的启动大致分为几个部分:
内核将App的执行文件加载到随机地址空间(加载到随机地址主要是因为ASLR技术)
内核将dyld的执行文件加载到随机地址空间
内核执行dyld文件
dyld启动App
手机内核只负责将App的执行文件和dyld加载到内存中,然后所有的启动工作都交给了dyld
冷启动的优化工作主要都是在上面的第四步里做文章,第四步的具体工作可以看下面这张图
总结起来,pre-main()执行了如下操作
加载可执行文件(App的.o文件集合)
加载动态链接库,进行rebase指针调整和bind符号绑定
Objc运行时的初始处理,包括Objc相关类注册、category注册、selector唯一性检查等
初始化调用,包括了执行+load()方法、attribute((constructor))修饰的函数的调用、创建C++静态全局变量。
一个应用的性能如何,冷启动是个重要的衡量指标; 毕竟用户第一次使用应用时,多久能进入页面(包括首页、启动页、广告页等),是用户的第一感官
对于一般应用,有启动页和广告页,对启动速度的要求相对于来说降低了一些,毕竟,进来就是启动页,只是时间停留时间长短问题(当然,不是说对时间不敏感,你要是在启动页停留个3,5s,谁也受不了;不过,话说,谷歌统计的所有应用的平均时间竟然是4000多ms,这还是挺吃惊的)
我所做的是个系统工具类,没有启动页,直接就是干到首页。又因为是系统应用,要有和桌面有一体化的感觉,所以,对启动速度要求极高;同时,又由于要适配全机型(Android5.0 -Android 12.0),前期没有做版本区分,所以,挑战来说更大。无论怎么说吧,经过一轮又一轮的优化,低端机达到了550ms以内,高端机更是在300ms以内;整体启动速度提供65%左右
其实,现在写冷启动的并不多,为啥呢? 有一些是公司并不在意,个人也就不在意,还有就是业务有启动页,可能并不明显。最后也有一部分原因来讲就是应用层去优化有限,更多的是业务逻辑的优化,感觉写不出创意来,我这篇文章也是先简单讲下冷启动的流程,看下那些我们可以去做,以及一些通用通吃的方案,一些结合业务做的优化(图片的加载优化、耗时业务的巧妙处理),期望大家看到后引起更多的思考和更多的交流学习
在这个进程启动图中,只是节选了我们正常冷启动的四个进程间的唤起与创建,详细的描述了App进程的调用图,是为了让大家对流程优化有更清晰的认知。 有图可以知道,View的绘制是在生命周期的onResume之后
有时候ViewDidLoad里面会进行很多耗时操作,用户还是会感觉到卡顿; 关于这点,目前的比较好的方案是首先给用户提供一个空壳,或者一个页面大概内容的图片,然后在ViewDidLoad方法里面进行数据加载和解析渲染等一系列操作
这样一来,用户已经看到界面了,就不会觉得启动慢了,相当于把启动时间转嫁给数据请求时间去背锅了。如果再配合上之前数据的缓存,那么这个启动的效果就会比较可观了
启动优化需要针对不同的业务做出不同的优化方式
总的来说,**优化方向可以分为布局优化,减少解析xml和绘制的时间;逻辑优化,将必要且耗时的操作异步加载,将非必要的采用延时加载,另外,将操作优先级高的可以优先加载;**由于篇幅的原因,这些内容我们下节在讲
启动速度优化是一个大工程,后续还需要针对具体场景继续深度挖掘
以上就是今天的所有内容,相信大家看完之后都会有着自己的收获,但是盲目的学习并不能让你的技术稳定的增长
我自荐一套 [《完整的Android学习资料,以及一些视频课讲解》
现在私信发送 “笔记” 或 “进阶” 即可 免费获取
最后我想说:
对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们
技术是无止境的,你需要对自己提交的每一行代码、使用的每一个工具负责,不断挖掘其底层原理,才能使自己的技术升华到更高的层面
Android 架构师之路还很漫长,与君共勉