WWDC2019应用启动优化

2020-07-13  本文已影响0人  把大象放进冰箱

Apple开发者WWDC2019视频链接 

文是从Apple备忘录移来的,所以比较尴尬的是简书不支持表格

启动类型

冷启动

After phone reboot

App not in memory

No process exists

热启动

Recently terminated

App is partially in memory

No process exists

中断后重启

App is suspended

App is fully in memory

Process exists

App启动阶段

System interface -> Runtime init -> UIKit init -> Application init -> Initial Frame Render -> Extended 

System interface 优化

DYLD3 : 库加载

避免链接未使用的Frameworks

避免动态库加载,例如dlopen() 或 NSBundle中的 load()

硬链接所有的依赖项

libSystem Init : 初始化底层系统组件

Runtime Init优化

Static Runtime Initialization : 初始化语言环境,Objective-C 和 Swift

不建议静态初始化

如使用静态库初始化时应暴露Init API尽早初始化栈

必须使用静态初始化时将代码移出静态 +[Class load] 方法,因为该方法在App启动中总会被调用,好的方法是在类中第一次使用该方法的时候使用 +[Class initialize] 进行lazy初始化

UIKit Initialization优化

系统实例化UIApplication 和 UIApplicationDelegate

减少在UIApplication或UIApplicationDelegate中的代码和工作

Application Initialization优化

Lifecycle Callbacks

未使用UIScene

iOS 12 或更早

UIApplicationDelegate

application:willFinishLaunchingWithOptions:

application:didFinishLaunchingWithOptions:

UIApplicationDelegate

applicaitonWillEnterforegroud:

applicaitonDidBecomeActive:

使用UIScene

iOS 12 以后

UIApplicationDelegate

application:willFinishLaunchingWithOptions:

application:didFinishLaunchingWithOptions:

UISceneDelegate

scene:willConnectToSession:options:

sceneWillEnterforegroud:

sceneDidBecomeActive:

无论是否使用UIScene API,都应在didFinishLaunch和didBecomeActive中推迟非相关的功能代码加载

使用UIScene API,应在Scenes之间共享资源

First Frame Render优化

减少视图中的层次,使用lazy加载views

减少自动布局中的约束数量

Extended优化

使用异步数据加载并显示数据

界面在数据加载的同时应具有互动性和响应性

利用os_signpost API衡量和标记耗时

如何进行启动优化的评估

消除其他干扰,确保一致性评估,例如网络干扰、后台进程干扰等

重启设备,并将设备静置2-3分钟,这将清除任何不必要的状态干扰

打开飞行模式或在代码中标记网络依赖性来减少对网络的依赖

使用iCloud将使后台出现干扰,在测试评估过程中可以完全注销iCloud

使用Release Build版本的App进行测试评估,减少Debug对评估的影响并可以利用到编译时优化等技术

使用热启动进行评估和测试,这将更符合用户在平常使用时的情况

使用旧的设备和新的设备同时测试保证应用在新旧设备上都具有优异的性能

使用XCTest进行测试,xcode将自动执行重复的启动过程并收集信息

如何优化启动

最小化工作

推迟与第一帧无关的工作,例如预加载项等

避免主线程冲突,将耗时的网络操作或文件操作移出主线程

减少内存的分配和使用

优先工作

确保合适的服务质量QoS安排Task工作

正确的调度优先执行的程序

优化工作

限制启动时需要获取的数据量或Lazy加载所需的变量和结果

缓存资源或复杂功能

如何使用XCode Instruments帮助优化启动结果

使用Profile代替Run执行代码,Profile位置在Run的下拉菜单中,Profile将在发布模式下重新编译App

使用App launch来监控应用启动时的情况,在iOS 13和xCode 11中Instruments自带App launch应用

使用XCTest测试,XCTest相比Instruments不占用性能,测试的结果更加准确

技巧

os.log适用于apple全系列开发中的日志记录

XCTest是Apple自带的自动化测试框架

MetricKit可以用于收集和上传App的运行性能,它可以指定功耗和性能指标进行上传

上一篇 下一篇

猜你喜欢

热点阅读