美团iOS启动分析与对比

背景

冷启动时长是App性能的重要指标,作为用户体验的第一道“门”,直接决定着用户对App的第一印象。 招聘客户端App都对启动时长或多或少都进行过一些优化,但相对于主流App启动时长差了不少,仍然有较大的优化空间。

方向

本次启动专项分析从两个方向重点进行分析:
一、美团启动分析(美团App启动为什么快?)
二、招才猫启动分析(我们App启动为什么比美团慢?)
三、后续规划

定义

冷启动定义

虽然冷iOS启动有:开机启动App(完全冷启动)和短时间内再次启动App(温启动)两种,但对于启动流程和将要做的启动优化来说并无区别。一般而言,可以把iOS冷启动的过程定义为:从用户点击App图标开始到第一个页面展示为止。

启动过程阶段定义

启动过程可以分为三个阶段进行分析:
T1:main函数之前,系统会进行加载动态库、注册Objc类等系统操作
T2:main函数到didFinishLaunching方法执行完成期间会进行SDK初始化等操作
T3:didFinishLaunching执行完成到首页面展示期间会进行页面的创建和渲染工作


美团App启动分析

一、如何统计第三方App

关于如何统计竞品或者主流App的启动耗时情况,市面上包含知乎团队采用的方案是进行屏幕录制+脚本,分析视频图像相似度的关键时间节点。此方案弊端较多,这里以逆向分析的方向提供两种统计方案:

  • Theos+Tweak 越狱开发工具包,可注入代码到正版App中
  • Frida+Monkey 砸壳重装,注入代码重新安装App且可进行- Debug调试

此次分析采用的是Frida+Monkey的方式,最终都会将注入代码以.dylib的方式注入到App中, 新注入的dylib库会增加一定的耗时,需要忽略掉。

  libmeituanDylib.p :  34.00 milliseconds (1.6%)  // 忽略
  imeituan : 107.84 milliseconds (5.0%)



二、准备注入的代码

将App启动过程中T2、T3阶段关键时间节点方法进行hook:

  • 1、利用sysctl函数获取进程创建时间
  • 2、利用切面Hook,对系统方法 didFinishLaunchingWithOptions 的开始和结束调用进行打点
  • 3、利用MoneyDev中的Logos语法,找到首页的Controller,对viewDidAppear方法进行hook打点。 (ps:如果直接对UIViewController的viewDidAppear进行hook,拿到的时长一般都是TabBarVC、NavigationVC显示的时长)

美团首页页面结构:
图片2.png

打点:

%hook MBCContainerViewController
- (void)viewDidAppear:(BOOL)animated {
   %orig;
   // 打点
}
%end





三、美团App启动阶段时长分析
T1阶段耗时分析

添加Xcode配置 DYLD_PRINT_STATISTICS_DETAILS 得出 pre-main 阶段耗时
image.png

以美团为标准,招才猫的pre-main耗时比美团多350ms:

  • dylib loading time: 动态库加载时长,经过分析美团的动态库数量为148个,招才猫为73个,耗时相差85ms,转换成真实启动耗时影响较小,且系统已经对动态库的加载做过优化,这部分耗时属于正常。
  • rebase/binding、Objc setup time:这部分耗时与项目中包含的类、方法数量形成正比,从美团250M,招才猫120M的包大小估算,这阶段耗时属于正常。
  • initializer time: 此阶段会调用每个Objc和分类的+load方法,调用C/C++的构造函数等操作,从分析结果来看,招才猫在此阶段耗时明显过多,需重点排查,着重排查+load方法。



T2阶段耗时分析

T2阶段为 -application:didFinishLaunchingWithOptions: 中SDK初始化、任务创建等App部分功能初始化相关工作,对美团的MTAppdelegate类中的didFinishLaunching进行逆向分析。

汇编代码:
图片5.png

还原OC代码:
图片4.png

中间省去N多静态分析和动态调试。。。

最终得到美团App的启动任务管理列表:
图片3.png

didFinishLaunchingWithOptions 阶段

  • 可以看出,美团App在didFinishLaunchingWithOptions中执行的主线程Task是相当少的,而且很大一部分是属于基础类、基础数据配置的构造,这部分耗时是非常少的,必要的几个任务也放在了子线程处理,以最优的方式使-didFinishLaunchingWithOptions快速的执行完成,直接去展示页面,可以说美团在这方面是做得很好。
  • 可以发现这阶段中首先有个任务叫 RunAllLoadFunctions,可以大胆猜测一下,美团是否把本应该在main()函数之前在+load方法中需要做的事情,放在了这个Task中,以减少+load的数量。

LaunchForeground 阶段
大部分App应该都没有这个阶段的一些操作处理,美团也只是在这里进行了一些状态操作,耗时可以忽略的。

viewDidAppear 阶段
美团将大量(42个)的任务放在了TabBarController显示完成之后执行,其中包含了Pay、IM、Spotlight、Location、Push、CrashReporter等核心且耗时较大的任务。但即使放在了TabBar显示之后,也对耗时大的任务放在了子线程中,以保证首页在刚展示后可以流畅的滑动、点击,不受这些任务的影响。

notifyT3Completed 阶段
根据这个阶段获取到的堆栈信息,可以猜测分析出应该是美团App在页面渲染完成之后做的一些任务操作,这些任务不会影响到App的启动,所以可以根据项目需要决定有可借鉴的东西。

图片10.png

美团任务管理方案:
美团除了将任务划分做很好之外,任务的管理中心也做得很好,美团的任务管理核心可以分为三大部分:
RegisterCenter:对Task进行注册、划分、创建、获取等等。
TaskRunner:运行启动阶段流程中的任务。
StartTask:任务者,存储任务的信息,监控任务的执行状态和耗时等。

美团将每个业务线的任务通过attribute 方式 Chain 到了mach-o中(未验证,也可能是其他方式),将任务与模块、业务线之间直接进行了解耦,在启动过程中获取每个阶段中任务的函数指针进行执行。

美团对每个Task做了很多处理,可以对每个业务线的任务耗时进行监控。对于在didFinishLaunching内任务比较重或需要进行任务解耦的App,美团的方案是一个不错的参考。

简约模仿的任务管理流程图:


图片1.png

RegisterCenter 核心代码:
图片6.png

Task 核心属性:
图片9.png
T3阶段耗时分析

T3阶段涉及东西较多,简单对这阶段进行一个分析。
1、从上面内容知道美团的T3阶段是到 MTGroupTabbarController的viewDidAppear方法执行为止,对此方法添加断点可以看见美团的启动首屏。 通过控制台log输出及其他信息,基本上可以确定首屏上半部分的元素内容是暂时静态的,在未拉取最新内容之前有可展示的区域,不会发生内容白屏的假启动现象。

2、再查看TabbarController的代码,可以发现有一个Tab根控制器是否创建的属性,我们对这个属性在启动完成后进行打印,可以看见美团App启动完成后Tab只有一个已经创建完成, 避免了创建其他Tab所造成的开销。
image.png

整体耗时对比分析:
以美团为标准,我们对比一下招才猫和美团的温启动耗时:

image.png

T1阶段:上面已经对T1阶段进行了分析,着重排查+load方法造成的影响,从真实的统计时长看,在T1阶段招才猫比美团App多耗时了257ms,从两个App的体量分析,招才猫App的T1阶段耗时在180ms以内才属于正常范围。

T2阶段:虽然招才猫之前已经将非必要的SDK初始化或其他任务进行了管理,减少或延后到了启动完成后去执行,但以美团标准看来,需要再次对必须在启动时完成初始化的SDK、任务进行梳理,是否仍有延后的可能或在线程中进行处理。

T3阶段:美团和招才猫在此阶段耗时相差并不大,但从观感上来看,体验却相差明显。主要原因是美团首屏页可以直接看见一些静态展示区域,而招才猫无论是消息页面还是附近求职者,目前都无法在第一时间提供页面元素, 导致从观感上认为仍然处于启动阶段。

启动通用优化方案

图片8.png

iOS 启动优化市面上有大量的文章、优化方案, 但大家都会发现为什么自己App在优化后,仍然与美团等主流App存在较大的差距。
分析完美团的启动过程,我们基本上能了解到美团大部分所做的启动优化工作也是大家所熟知的一些方案,但也能得到一些更为重要的信息:
标准:针对于每个App的启动优化,我们需要优化到什么程度,在每个阶段的耗时应该处于什么样的一个水平,我们有了一个比较清晰的标准去做对比衡量。

监控:美团对自己的每一个启动任务都做了一系列的粒度拆分和监控,在对持续的版本迭代所造成的增量影响和保持良好的启动时长能有一个更好的管控机制。

感悟:如果要做到极致的启动速度,就需要对Icon点击到页面展示的整个通道,就如同在一个新的App上去重新铺好这条路,去过滤不必要或可以优化的点。
技术:美团可能将+load方法所做的事情放在了main()函数之后,是否可提高启动速度?(待确认)

招才猫App启动分析

以美团为标准,以招才猫为例,对App的温启动时长进行分析。

image.png

一、招才猫分析汇总
主要分析方式:工具分析、阶段/任务打点、通道重铺、代码查看、三方库逆向分析

招才猫启动过程分析发现的部分问题:



省略

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,219评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,363评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,933评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,020评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,400评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,640评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,896评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,597评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,327评论 1 244
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,581评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,072评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,399评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,054评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,849评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,672评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,585评论 2 270

推荐阅读更多精彩内容