文是从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的运行性能,它可以指定功耗和性能指标进行上传
网友评论