iOS开发高手课
戴铭
前滴滴出行技术专家
立即订阅
11464 人已学习
课程目录
已完结 46 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 锚定一个点,然后在这个点上深耕
免费
基础篇 (20讲)
01 | 建立你自己的iOS开发知识体系
02 | App 启动速度怎么做优化与监控?
03 | Auto Layout 是怎么进行自动布局的,性能如何?
04 | 项目大了人员多了,架构怎么设计更合理?
05 | 链接器:符号是怎么绑定到地址上的?
06 | App 如何通过注入动态库的方式实现极速编译调试?
07 | Clang、Infer 和 OCLint ,我们应该使用谁来做静态分析?
08 | 如何利用 Clang 为 App 提质?
09 | 无侵入的埋点方案如何实现?
10 | 包大小:如何从资源和代码层面实现全方位瘦身?
11 | 热点问题答疑(一):基础模块问题答疑
12 | iOS 崩溃千奇百怪,如何全面监控?
13 | 如何利用 RunLoop 原理去监控卡顿?
14 | 临近 OOM,如何获取详细内存分配信息,分析内存问题?
15 | 日志监控:怎样获取 App 中的全量日志?
16 | 性能监控:衡量 App 质量的那把尺
17 | 远超你想象的多线程的那些坑
18 | 怎么减少 App 电量消耗?
19 | 热点问题答疑(二):基础模块问题答疑
20 | iOS开发的最佳学习路径是什么?
应用开发篇 (12讲)
21 | 除了 Cocoa,iOS还可以用哪些 GUI 框架开发?
22 | 细说 iOS 响应式框架变迁,哪些思想可以为我所用?
23 | 如何构造酷炫的物理效果和过场动画效果?
24 | A/B 测试:验证决策效果的利器
25 | 怎样构建底层的发布和订阅事件总线?
26 | 如何提高 JSON 解析的性能?
27 | 如何用 Flexbox 思路开发?跟自动布局比,Flexbox 好在哪?
28 | 怎么应对各种富文本表现需求?
29 | 如何在 iOS 中进行面向测试驱动开发和面向行为驱动开发?
30 | 如何制定一套适合自己团队的 iOS 编码规范?
31 | iOS 开发学习资料和书单推荐
32 | 热点问题答疑(三)
原理篇 (6讲)
33 | iOS 系统内核 XNU:App 如何加载?
34 | iOS 黑魔法 Runtime Method Swizzling 背后的原理
35 | libffi:动态调用和定义 C 函数
36 | iOS 是怎么管理内存的?
37 | 如何编写 Clang 插件?
38 | 热点问题答疑(四)
原生与前端共舞 (5讲)
39 | 打通前端与原生的桥梁:JavaScriptCore 能干哪些事情?
40 | React Native、Flutter 等,这些跨端方案怎么选?
41 | 原生布局转到前端布局,开发思路有哪些转变?
42 | iOS原生、大前端和Flutter分别是怎么渲染的?
43 | 剖析使 App 具有动态化和热更新能力的方案
用户故事 (1讲)
用户故事 | 我是如何学习这个专栏的?
结束语 (1讲)
结束语 | 慢几步,深几度
iOS开发高手课
登录|注册

02 | App 启动速度怎么做优化与监控?

戴铭 2019-03-14
你好,我是戴铭。
我已经在专栏的第一篇文章中,和你梳理了一份 iOS 开发的知识体系框架图。今天,我们就正式从基础出发,开始自己的 iOS 开发知识体系构建之路吧。接下来,我就先和你聊聊与 App 启动速度密切相关的那些事儿。希望你听我说完启动速度的事儿之后,在专栏里的学习状态也能够快速地启动起来。
在文章开始前,我们先设想这么一个场景:假设你在排队结账时,掏出手机打开 App 甲准备扫码支付,结果半天进不去,后面排队的人给你压力够大吧。然后,你又打开 App 乙,秒进,支付完成。试想一下,以后再支付时你会选择哪个 App 呢。
不难想象,在提供的功能和服务相似的情况下,一款 App 的启动速度,不单单是用户体验的事情,往往还决定了它能否获取更多的用户。这就好像陌生人第一次碰面,第一感觉往往决定了他们接下来是否会继续交往。
由此可见,启动速度的优化必然就是 App 开发过程中,不可或缺的一个环节。接下来,我就先和你一起分析下 App 在启动时都做了哪些事儿。

App 启动时都干了些什么事儿?

一般情况下,App 的启动分为冷启动和热启动。
冷启动是指, App 点击启动前,它的进程不在系统里,需要系统新创建一个进程分配给它启动的情况。这是一次完整的启动过程。
热启动是指 ,App 在冷启动后用户将 App 退后台,在 App 的进程还在系统里的情况下,用户重新启动进入 App 的过程,这个过程做的事情非常少。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《iOS开发高手课》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(227)

  • 好多余先生丶 置顶
    完了,上来就懵逼

    作者回复: 可以从作业入手,学习不能着急,需要慢慢来,多重复就会有更多体会

    2019-03-14
    1
    96
  • Neo 置顶
    不错 提纲挈领 希望汇编那块能稍微细讲一下 没有太多写汇编的经验

    作者回复: 汇编语言入门可以看阮一峰老师的《汇编语言入门教程》啊。链接是 http://www.ruanyifeng.com/blog/2018/01/assembly-language-primer.html 。以后可以考虑写个 iOS 视角的

    2019-03-14
    18
  • Glenn•D 置顶
    模拟器上试了一下耗时检查没有效果

    作者回复: 需要真机,arm64芯片,模拟器是 x86

    2019-03-15
    1
  • 大冯宇宙
    学到了,启动时间搞的太短,领导说加个sleep,别人都看不到我们的欢迎页了
    2019-03-14
    6
    108
  • 彭序猿
    一来就王炸😳
    2019-03-14
    86
  • 城北姜公
    我的手是咋回事,看到汇编就直接滑下来看评论了
    2019-03-14
    1
    31
  • 西京富贵兔
    看完这篇我膨胀了,我都敢去点 objc_msgSend 源码文件了,嗯,不出意料,一句没看懂。。。

    作者回复: 哈哈

    2019-03-14
    22
  • 星空
    友情提示:想要尝试SMCallTrace的朋友,需要在SMCallTrace.m中打开第54行的注释。

    作者回复: 赞

    2019-03-14
    21
  • Calabash_Boy
    才疏学浅,一上来就要重新再看Hook,dylb,寄存器与汇编的相关知识,戴铭老师的起点很高,有些跟不上,只能自己慢慢补了.
    如果有的小伙伴跟我一样感觉有难度,可以先看这篇文章http://www.zoomfeng.com/blog/launch-time.html了解下基础概念.
    2019-03-16
    18
  • Master
    看完文章,再看作业,感觉就是老师告诉我们 1 + 1 = 2,然后让我们求太阳的质量。
    2019-03-15
    16
  • 说swift没有main函数那位,其实swift是有main函数的,只不过苹果把它精简成了一个@NSApplicationMain了而已,不信去你的AppDelegate.swift最上面看!

    作者回复: 赞

    2019-03-14
    15
  • 冰风落叶
    大佬们 这是我的写的总结和课后作业 不知道写的对不对 恳请各位大佬指正
    总结:https://www.jianshu.com/p/f26c4f16692a
    课后作业:https://github.com/308823810/BSMonitorTimeTool

    作者回复: 赞

    2019-04-04
    12
  • Justin
    戴老师:多个动态库进行合并,具体怎么合并了,没弄过动态库合并该功能

    作者回复: https://blog.automatic.com/how-we-cut-our-ios-apps-launch-time-in-half-with-this-one-cool-trick-7aca2011e2ea 了解下

    2019-03-15
    12
  • 欧锦滔
    这个方法耗时计算的工具很赞,白天要花点时间实践一下才行。

    有个让我疑惑的地方是关于“热启动”的概念,我再去看了下 WWDC 上的说法,里面提到热启动应该也包括“启动后退出 App 再启动”这种情况,不知道我下面这段话的理解是否正确:

    “And a warm launch is an app where the application is already in memory, either because it's been launched and quit previously, and it's still sitting in the discache in the kernel, or because you just copied it over.”
    - https://developer.apple.com/videos/play/wwdc2016-406/?time=1484

    作者回复: 官方的解释很全面,情况都说清楚了

    2019-03-14
    1
    12
  • 一代真龙
    你在往上看几层,所有的oc方法都是通过msg_send作为统一入口,你所谓的函数指针在调用IMP在msg_send后面步骤。作为程序员没看懂内容就出来唧唧歪歪,这样路走不长。
    2019-03-14
    1
    10
  • 唯她命
    hook 了 objc_msgSend 方法,就可以 hook oc全部方法,这句话我不赞成,看objc源码,你会发现有的oc方法直接通过函数指针调用的,这时候hook 了 objc_msgSend 方法,是没有用的

    作者回复: 函数指针调用可以用 ffi_call

    2019-03-14
    8
  • 只有C和OC基础,学起来很吃力

    作者回复: 想要一个东西就去买,喜欢一个人就去追,哪怕最后那个东西没有用,那个人没有跟你在一起,都没有关系,人生苦短,要知道遗憾要比失败可怕的多。

    2019-03-14
    1
    8
  • 长方体混凝土移动工程师
    这是我学习专栏总结的资料,对objc_msgSend hook的学习过程有一个记录
    提供了一个可运行调度的Demo,并有详细的注释
    https://github.com/czqasngit/objc_msgSend_hook
    2019-05-09
    1
    7
  • Ke哀
    今天看到大佬的课程,发现说的hook objc_msgSend的汇编部分,但是发现在教程中的部分和之前大神17年博客部分是一样的,都是InspectiveC/InspectiveCarm64.mm的汇编代码。然后跑去大神的github找到开源项目已阅,拿出里边hook objc_msgSend的汇编实现,然后有些部分不太理解。希望大神可以解答一下(这些是已阅里边拿出来的汇编)
    1.为什么这里要把lr移到x2,x4移到x3呢?
    __asm volatile ("mov x2, lr\n");
    __asm volatile ("mov x3, x4\n");
    2.为什么要在调用before_objc_msgSend,orig_objc_msgSend,after_objc_msgSend方法前后把x8,x9的值存入栈中呢?
    __asm volatile ("stp x8, x9, [sp, #-16]!\n");
    __asm volatile ("mov x12, %0\n" :: "r"(&before_objc_msgSend));
    __asm volatile ("ldp x8, x9, [sp], #16\n");
    3.为什么在三个方法执行完之后呢,最后x0会存储最后的函数返回地址呢?我打断点看到每次都是这样的,不太理解,然后把x0,移到lr确实是为了执行之前objc_msgSend执行后下一条执行的代码段段地址。
    __asm volatile ("mov lr, x0\n");

    作者回复: 汇编建议先看下 arm64 相关资料
    https://blog.nelhage.com/2010/10/amd64-and-va_arg/
    http://infocenter.arm.com/help/topic/com.arm.doc.ihi0055b/IHI0055B_aapcs64.pdf
    https://developer.apple.com/library/ios/documentation/Xcode/Conceptual/iPhoneOSABIReference/Articles/ARM64FunctionCallingConventions.html

    然后啃啃 objc_msgSend 源码

    2019-03-14
    2
    7
  • Sean Ma
    上来就汇编,营养跟不上。想问个问题,文中提到首屏渲染渲染后指的是“这个阶段就是从渲染完成时开始,到didFinishLaunchingWithOptions方法域结束而结束”,我自己跑demo的时候,看到首页viewcontroller完成加载渲染出来能看到都要等到didFinishLaunchingWithOptions return true,所以我这里对首屏渲染后的界定有疑惑

    作者回复: 你说的和原文是一个意思

    2019-03-14
    7
收起评论
99+
返回
顶部