WWDC2019应用启动优化

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的运行性能,它可以指定功耗和性能指标进行上传

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,928评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,192评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,468评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,186评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,295评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,374评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,403评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,186评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,610评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,906评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,075评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,755评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,393评论 3 320
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,079评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,313评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,934评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,963评论 2 351