美文网首页
iOS高手开发课读书笔记:APP启动速度的优化与监听

iOS高手开发课读书笔记:APP启动速度的优化与监听

作者: MichealXXX | 来源:发表于2019-05-27 15:15 被阅读0次
    最近在看戴铭老师的《iOS高手开发课》,顺便记一下笔记,加深一下印象,这一篇是讲关于APP启动的优化与监听相关的问题,现在很多公司都对自己的APP启动速度有极高的要求,特别是支付相关的APP,戴老师举了一个特别现实的例子,假如你在排队买东西时,掏出手机打开软件A支付,半天打不开,而打开软件B支付,秒开,想必你以后再也不会用软件A了吧,那么接下来就看一下启动的那些事。
    先来看一下APP启动都干了哪些事情,APP的启动分为冷启动热启动
    冷启动:APP点击启动之前,它的进程不在系统里面,需要系统新给它分配一个进程,这是一次完整的启动。
    热启动:就是我们已经启动了APP,但是我们将它放在后台,它的进程已经在系统中了,用户再次点击APP重新进入的过程。
    我们所说的APP启动优化主要就是优化冷启动部分,如果想优化那么我们就要知道APP启动时到底干了什么,其实从用户点击APP到软件启动,主要分为三个部分:main()函数执行前main()函数执行后首屏渲染完毕
    main()函数执行前:

    1.加载可执行文件(App 的.o 文件的集合)。

    2.加载动态链接库进行 rebase 指针调整和 bind 符号绑定。

    3.Objc运行时的初始处理,包括Objc相关类的注册,category的相关注册,selector的唯一性检查等。

    4.初始化,包括了执行 +load()方法、attribute((constructor))修饰的函数的调用、创建 C++静态全局变量

    这里可以做的优化:

    1.减少动态库的加载,苹果建议使用更少的动态库,当动态库数量多时,可以在数量上进行合并,最多支持6个动态库进行合并。

    2.减少加载启动后不会去使用的类或者方法。

    3.+load方法尽量放在首屏渲染之后执行,或者使用+initialize方法替换掉。

    4.控制C++全局变量的数量。

    main()函数执行后:

    指的是从main函数执行开始到appdelegate中的didFinishLaunchingWithOptions方法中的首屏渲染相关方法执行完毕。

    1.首屏初始化所需配置文件的读写操作

    2.首屏列表所需数据的获取

    3.首屏渲染的计算

    开发中大家都喜欢把各种SDK的初始化放在didFinishLaunchingWithOptions里面,可以根据功能,业务需求分类,按需进行初始化,将这些SDK放在不同的阶段进行初始化。

    首屏渲染完成之后

    这时用户已经可以看到我们的软件界面了,在这里主要做的就是其他非首屏业务模块的初始化,监听的注册,配置文件的读取等。从函数上看就是从首屏渲染结束,到didFinishLaunchingWithOptions这个函数的作用域结束。这时虽然用户已经可以看到我们的界面了,但是如果在主线程中有阻塞线程的操作,还是需要优化,不然还是会使用户体验不好。

    以上我们说到的其实都是功能级别的启动优化,仅仅优化这些其实对于一般的APP来说是足够的,但是更加精益求精的就是方法级别的优化,那么如何做到方法级别的优化的呢?如果我们想优化,首先要知道从用户点击APP开始,到首屏显示完成耗时多久,先监听耗时我们才能进行针对性的优化,比如监听这个时间区间里面主线程中各种耗时的方法,那么要怎么做呢,这里有两种方法。
    本人才疏学浅,实力不济,只能实现其中一种,就是定时抓取主线程上的方法调用堆栈,计算一段时间中的各个方法的耗时,那么就会有一个问题,要多长时间抓取一次呢,如果时间间隔设置的长了,可能就会漏掉一些方法,如果时间短了呢,当然可以抓取到每一个方法,但是这个抓取工具本身就会耗费时间,测量也会不准确,因此设置为0.01秒抓取一次就刚刚好。
    记得一段时间之前iOS开发很出名的bestwisher写了一个工具类能够用来打印堆栈信息,我们可以顺着这个入手,写一个定时器,每隔0.01秒就打印一次当前主线程上的堆栈信息,直到首屏渲染完成,然后把这区间出现的方法次数统计出来,比如某个方法出现了5次,那么它就耗时0.05秒,我通过这个原理写了一个方法,但是自己不是很满意,但是在戴老师的这篇博客下看到一个大神和我是一个思路,这位大神写的比较好,我就把他的Demo和博客放在这里,大家可以去看一下,写的很好。
    第二种方式比较难,我们都知道,iOS中调用所有的方法几乎都是通过objc_msgSend来实现的,我们就可以通过Hook这个函数来进行监听,很可惜,如果想hook这个函数需要编写汇编代码,这个确实超出了我的能力范围,但是戴老师的博客写的十分清楚,也有实现Demo,欢迎大家前去拜读。
    以上就是关于APP启动速度优化的笔记,后续会陆续更新笔记,不过还是推荐大家直接去极客时间去看戴老师的博客,评论区也有很多大神会提出自己的见解,以及不同的方法,大家一起共同进步!

    相关文章

      网友评论

          本文标题:iOS高手开发课读书笔记:APP启动速度的优化与监听

          本文链接:https://www.haomeiwen.com/subject/egbmzqtx.html