美文网首页
WWDC2019应用启动优化

WWDC2019应用启动优化

作者: 把大象放进冰箱 | 来源:发表于2020-07-13 11:19 被阅读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的运行性能,它可以指定功耗和性能指标进行上传

    相关文章

      网友评论

          本文标题:WWDC2019应用启动优化

          本文链接:https://www.haomeiwen.com/subject/gzcacktx.html