乐趣区

关于ios:iOS启动优化

启动速度优化背景:

咱们的我的项目在我的项目为一个开发迭代多年的老我的项目,之前对我的项目的启动性能没有太多的关注,导致 APP 的启动速度比较慢,启动有时要耗时 3、4s 钟,整体启动性能堪忧。咱们主管安顿我负责优化,全力优化 APP 启动速度。

遇到挑战:

最大挑战有 2 个,一是代码历史代码性能耗费没有把控,很多中央存在不合理的代码;二是做为入职不久的新人须要在 1 个月实现左右优化,工夫紧工作重;

优化步骤:

首先咱们梳理好指标,iOS 启动能够分为冷启动和热启动。冷启动是指 APP 自身不在后盾零碎,从用户点击利用 icon 到 appDelegate didFinishLaunching 办法执行实现用户看到 APP 首页为止;热启动是 APP 自身在零碎后盾运行,从后到点击到进入 APP 场景。咱们重点是优化冷启动的速度,启动速度工夫指标由 3s 降到 1.2s;
有了明确指标后接下来是对指标进行拆解,要进行冷启动优化咱们须要晓得冷启动过程具体做了什么,具体哪局部执行节点耗时较多。APP 冷启动能够大略分为三个阶段,第一阶段是 main 函数之前,零碎执行一系列加载和链接工作;第二阶段是 main 函数之后,从 main 函数开始到 AppDelegate 的 didFinishLaunchingWithOptions 执行结束;第三阶段是从 didFinishLaunchingWithOptions 执行到 APP 渲染出 APP 的首页;咱们须要从这三个阶段来进行优化,首先咱们须要剖析这三个阶段的耗时状况。
测算 main 函数之前的耗时,咱们能够通过配置 xcode 来进行,在 xcode 的 editScheme 中 Run→ Environment Variables 增加 name 为 DYLD_PRINT_STATISTICS 为 1,这样就能够在 xcode 控制台中一份输入报告示例如下:

从上图中咱们能够清晰理解 main 函数前的耗时,以及过程中加载动静库耗时、oc 类初始化耗时、指针重定义耗时。对于 main 函数后咱们能够通过退出计时代码来统计,这块统计比较简单;

main 函数前外围优化:次要包含优化动静加载库、Rebase/Binding 优化和优化初始化阶段

动静库加载优化:
咱们次要进行 2 方面的优化,
1. 毁灭内嵌的动静库,因为零碎加载内嵌动静库会耗费比拟大的性能;
2. 缩小动静库的数量,能够通过合并已有的动静库来达到目标,动静库越多性能开销越多;

Rebase/Binding 优化:
次要进行了 2 类优化,
1. 缩小 oc 类、缩小办法、缩小分类数量;
2. 应用 Swift structs 能够大幅缩小符号数量;

Initializers 阶段优化:最外围是缩小 load 办法应用,load 执行代码越多启动会越慢,咱们能够把 load 的实现代码提早放到 initiailize 办法中,在 initiailize 办法不会影响 APP 的启动速度;

main 函数后阶段优化:这个阶段外围优化思路是缩小主线程的性能耗费,对于根底组件的初始化做到能延后的延后,能放到子线程初始化的放到子线程初始化。
通过以上优化后咱们 APP 的启动速度有了很大的晋升,由原来的 3s 出头优化到了 1.2s 左右。

接入总结和倡议:整体接入还是比较简单,官网在整体的阐明文档方面比拟清晰。整个 apm 在解体做的比拟好,比照之前用的听云和 bugly 还是不错的,在信息收集的全面性方面特地好,另外对于解体日志解析和准确性方面比拟好,解体的堆栈绝对其余产品更易懂。

对产品的倡议:在应用过程中发现以下问题倡议参考优化
(1)从 u -apm 注册后,在之后的主页就找不到对于 u -apm 的内容了,注册完后注册了一个 APP 发现是接入友盟根底 SDK,不是我想要的,只能通过返回到流动也才找到 u -apm。
(2)想接入一个没有 idfa 的版本,没找到,看接入留神是强制收集了 idfa,定位和 idfa 国家对咱们这个行业有限度,特地是地位权限不容许用;
(3)官网上播放视频和上面的介绍叠在一起,无奈全屏看(Safari 浏览器)
(4)概览中,解体率、ANR 形容应用专门名词,当初都应用“谬误“统称,并不合乎开发的认知,比方解体就是解体率,anr 就说是 anr,而不是统称为解体;
(5)实时概览更心愿看的是一些总的数据表,比方解体 Android 解体心愿看 java 和原生底层加起来的总解体,另外倡议实时概览减少卡顿率、网络错误率、启动速度等一些要害指标的总览图;二级页面再减少卡顿、解体等详情;

作者:隆冬
从事 iOS 开发 5 年,做过社交和教育 APP 研发

退出移动版