深入解析iOS应用启动性能优化策略与实践

4 阅读5分钟

如何实现iOS性能优化的APP启动优化!

近些年来,ios系统在众多系统当中遥遥领先,但是,这并不意味着ios系统是完美的,仍然有需要进步的地方;因此,ios的性能优化对于程序员来说,是需要不断努以及持续进的事情;性能优化不是只有一项,细分来说的话有许多种优化向。需要我们根据实际场景以及业务需求进合理优化。下面进正题,本将会以iOS App的启动优化为展开点进探讨!

一、启动 阶段优化项

1、pre-main阶段

针对pre-main阶段做优化时,我们需要先详细了解其加载过程,这个可以在2016年WWDC的OptimizingAppStartupTime中详细了解到,相关材料

Loaddylibs

这阶段dyld会分析应依赖的dylib(xcode7以后.dylib已改为名.tbd),找到其mach-o件,打开和读取这些件并验证其有效性,接着会找到代码签名注册到内核,最后对dylib的每个segment调mmap()。不过这的dylib部分都是系统库,不需要我们去做额外的优化。

2、优化结论:

①尽量不使内嵌的dylib,从避免增加`Loaddylibs`开销

②合并已有的dylib和使静态库(staticarchives),减少dylib的使个数

③懒加载dylib,但是要注意dlopen()可能造成些问题,且实际上懒加载做的作会更多。

3、Rebase/Bind

在dylib的加载过程中,系统为了安全考虑,引了ASLR(AddressSpaceLayoutRandomization)技术和代码签名。由于ASLR的存在,镜像(Image,包括可执件、dylib和bundle)会在随机的地址上加载,和之前指针指向的地址(preferred_address)会有个偏差(slide),dyld需要修正这个偏差,来指向正确的地址。Rebase在前,Bind在后,Rebase做的是将镜像读内存,修正镜像内部的指针,性能消耗主要在IO。Bind做的是查询符号表,设置指向镜像外部的指针,性能消耗主要在CPU计算。

优化结论:

在此过程中,我们需要注意的是尽量减少指针数量,如:

①减少ObjC类(class)、法(selector)、分类(category)的数量

②减少C++虚函数的的数量(创建虚函数表有开销)

③使Swiftstruct(内部做了优化,符号数量更少)

4、Objc setup 部分ObjC初始化作已经在Rebase/Bind阶段做完了,这步dyld会注册所有声明过的ObjC类,将分类插到类的法列表,再检查每个selector的唯性。在这步倒没什么优化可做的,Rebase/Bind阶段优化好了,这步的耗时也会减少。

Initializers

在这阶段,dyld开始运程序的初始化函数,调每个Objc类和分类的+load法,调C/C++中的构造器函数(attribute((constructor))修饰的函数),和创建基本类型的C++静态全局变量。Initializers阶段执完后,dyld开始调main()函数。

优化结论:

①少在类的+load法做事情,尽量把这些事情推迟到+initiailize

②减少构造器函数个数,在构造器函数少做些事情

③减少构造器函数个数,在构造器函数少做些事情

6、main()阶段

在这阶段,主要优化重点放在SDK初始化、业务具注册、整体

didFinishLaunchingWithOptions法中,因为我们的些第三app格配置、启动引导显示状态逻辑、版本更新逻辑等等基本都会在这进,如果这部分逻辑没有做好优化梳理,随着业务不断拓展,臃肿的业务逻辑会直接导致启动时间加。

优化结论:

在满业务需求的前提下,尽量减少didFinishLaunchingWithOptions法在主线程中的事件处理逻辑,如:

①根据实际业务状况,梳理各个/三库,找到可以延迟加载的库,做延迟加载处理,如放到控制器的viewDidAppear法。

②梳理业务逻辑,把可以延迟执的逻辑,做延迟执处理。如检查新版本、注册推送通知等逻辑

③避免进些复杂/多余的计算逻辑,这类逻辑尽量进异步延迟处理

④避免在控制器的viewDidLoad和viewWillAppear做太多容易阻塞主线程的事情,这2个法执完,控制器才能显示。

当然这种也并不是唯的应对式,且也并对所有场景都适,只是提供种思路已,还是需要根据项的实际场景选择适合的优化案。

另外,我们还可以通过服务器埋点上报的式统计分析,不过这样来会发现我们的统计成本就会增加,且结果分析也会变得不那么灵活。所以这推荐种简单的监控式,那就是友盟的U-APM应能性能监控SDK,只需要我们进简单的pod集成之后,便可根据我们的实际需要进动或者动监控启动数据,详情可以参考U-APM,并且为了便我们对数据进分析,友盟后台已经根据这些数据帮我们绘制出了对应的分布图,我们可以了然的得出启动耗时分布、启动类型占等等

除此之外,我们还可以通过SDK进崩溃分析、ANR分析、监控告警、卡顿分析、内存分析等等诸多功能,有了U-APM这个监控平台,其实在实际开发过程中,很程度的提升了我们对线上app的分析效率!

除了友盟U-APM,开发者还可以利用KeyMob(克魔助手)进行iOS性能监控。KeyMob专为iOS开发设计,提供实时监控CPU、GPU、内存、FPS、网络、能耗等性能指标的功能,支持分应用和小程序监控,并通过图表展示数据,帮助开发者全面优化应用启动性能和整体效率。

其实,友盟主要是通过轻量级的集成接入即可拥有实时、可靠、全面的应用崩溃、ANR、自定义异常等捕获能力,及卡顿、启动分析等性能能力,支持多场景、多通道智能告警监控,帮助开发者高效还原异常、卡顿用户的访问路径和业务现场,缩短故障排查时间。还未使用过的朋友们,不妨尝试一下,相信大家用过之后就会爱上!