启动速度优化背景:
咱们的我的项目在我的项目为一个开发迭代多年的老我的项目,之前对我的项目的启动性能没有太多的关注,导致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研发
发表回复