iOS App 启动性能优化

本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/Kf3EbDIUuf0aWVT-UCEmbA

作者:samsonxu

导语

本文介绍了如何优化iOS App的启动性能。

本文分为四个部分:
- 第一部分科普了一些和App启动性能相关的前置知识
- 第二部分主要讲如何定制启动性能的优化目标
- 第三部分通过在WiFi管家这个具体项目的优化过程,分享一些有用的经验
- 第四部分是关键点的总结。

【第一部分】一些小科普

因为篇幅的限制,没有办法很详尽的说明一些原理性的东西,只是方便大家了解哪些事情可能跟启动性能有关。同时,内容相对也比较入门,大神们请跳过这一部分。

1. App启动过程
  • 解析Info.plist
    • 加载相关信息,例如如闪屏
    • 沙箱建立、权限检查
  • Mach-O加载
    • 如果是胖二进制文件,寻找合适当前CPU类别的部分
    • 加载所有依赖的Mach-O文件(递归调用Mach-O加载的方法)
    • 定位内部、外部指针引用,例如字符串、函数等
    • 执行声明为__attribute__((constructor))的C函数
    • 加载类扩展(Category)中的方法
    • C++静态对象加载、调用ObjC的 +load 函数
  • 程序执行
    • 调用main()
    • 调用UIApplicationMain()
    • 调用applicationWillFinishLaunching
2. 如何测量启动过程耗时
冷启动比热启动重要

当用户按下home键的时候,iOS的App并不会马上被kill掉,还会继续存活若干时间。理想情况下,用户点击App的图标再次回来的时候,App几乎不需要做什么,就可以还原到退出前的状态,继续为用户服务。这种持续存活的情况下启动App,我们称为热启动,相对而言冷启动就是App被kill掉以后一切从头开始启动的过程。我们这里只讨论App冷启动的情况。

main()函数之前

在不越狱的情况下,以往很难精确的测量在main()函数之前的启动耗时,因而我们也往往容易忽略掉这部分数据。小型App确实不需要太过关注这部分。但如果是大型App(自定义的动态库超过50个、或编译结果二进制文件超过30MB),这部分耗时将会变得突出。所幸,苹果已经在Xcode中加入这部分的支持。

苹果提供的方法
  • 在Xcode的菜单中选择ProjectSchemeEdit Scheme...,然后找到 RunEnvironment Variables+,添加name为DYLD_PRINT_STATISTICSvalue1的环境变量。

  • 在Xcode运行App时,会在console中得到一个报告。例如,我在WiFi管家中加入以上设置之后,会得到这样一个报告:

  Total pre-main time:  94.33 milliseconds (100.0%)
           dylib loading time:  61.87 milliseconds (65.5%)
          rebase/binding time:   3.09 milliseconds (3.2%)
              ObjC setup time:  10.78 milliseconds (11.4%)
             initializer time:  18.50 milliseconds (19.6%)
             slowest intializers :
               libSystem.B.dylib :   3.59 milliseconds (3.8%)
     lib

你可能感兴趣的:(性能优化,ios)