iOS App 启动优化

1. APP启动流程

graph TD
APP启动 --> 
冷启动 --> 解析Info.plist --> 加载信息如启动页等 --> 沙箱建立,权限检查
冷启动 --> dyld加载mach-o文件 --> 预编译 --> 编译 --> 汇编 --> 链接 -->静态链接
链接 -->动态链接
动态链接 -->递归加载所有的动态库
静态链接 -->递归加载所有的动态库
递归加载所有的动态库 --> rebase和binding
冷启动 --> runtime
runtime --> OC类的注册 --> selecter的唯一性检测 --> C++静态对象,OC的+load函数
冷启动 --> main函数初始化
冷启动 --> exec函数开始 -->创建进程 --> 分配内存空间
冷启动 --> pre-main
冷启动 --> main --> UIApplicationMain --> applicationWillFinishLaunching
APP启动 --> 热启动

2. 如何测量启动过程耗时

苹果提供的方法

在Xcode的菜单中选择Project→Scheme→Edit Scheme...,然后找到 Run → Environment Variables →+,添加name为DYLD_PRINT_STATISTICS的value值为1的环境变量。 image.png

image.png

解读

  1. main()函数之前总共使用了990.87ms
  2. 在990.87ms中,
    • 加载动态库用了487.47ms,
    • 内外部指针定位使用了50.86ms,
    • ObjC类初始化使用了85.73ms,
    • 各种初始化使用了366.80ms。
  3. 在初始化中,用时最多的三个初始化是libSystem.B.dylibAFNetworking以及yujiancaijing

main()函数之后

从main()函数开始至applicationWillFinishLaunching方法结束

main()之前影响启动性能的主要因素

  • 动态库加载越多,启动越慢。
  • ObjC类越多,启动越慢
  • ObjC的+load越多,启动越慢

main()函数之后耗时的影响因素

  • 执行main()函数的耗时
  • 执行applicationWillFinishLaunching的耗时
  • rootViewController及其childViewController的加载、view及其subviews的加载

iOSAPP的启动时间

  • 应该在400ms内完成main()函数之前的加载
  • 整体过程耗时不能超过20秒,否则系统会kill掉进程,App启动失败

启动过程分为四个部分:

  1. main()函数之前
    • 移除不必要的动态的,一个项目动态库最好不要超过6个
    • 移除无用的类,无用的方法
    • 合并功能类似的类和扩展(Category)
    • 清空项目中不必要的图片资源,适当压缩图片资源
  2. main()函数之后至application:didFinishLaunching完成
    • didFinishLaunching中不必要的三方库延迟注册
    • 减少或者延迟加载rootViewController中不必要的childViewController和减少视图绘制
  3. App完成所有本地数据的加载并将相应的信息展示给用户
    • 缓存数据到本地
  4. App完成所有联网数据的加载并将相应的信息展示给用户
    • 对传输的数据进行压缩,减少传输的数据
    • 使用缓存手段减少请求的发起次数
    • 使用策略来减少请求的发起次数,比如在上一个请求未着地之前,不进行新的请求,VC销毁是停止不必要的请求
    • 避免网络抖动,提供重发机制

APP性能优化可以从一下几个方面入手

0.启动优化
1.网路优化
2.UI优化
  卡顿优化
  离屏渲染的优化
3.存储优化
4.包体积优化
5.崩溃优化
6.内存优化
复制代码

检测内存泄漏的一些方法

1.静态检测(手动,自动)
2.动态检测
3.析构函数打印
4.instruments
5.三方检测工具
6.打开僵尸对象检测    
复制代码

猜你喜欢

转载自juejin.im/post/7030743217171595301