启动优化(一)

app的启动时间是衡量一个app性能的重要指标,是用户对这个app的的第一映象,启动时间的快慢会直接影响用户对这个app的使用体验,那怎样能使程序更快的启动呢?

app的启动分为冷启动和热启动

热启动:App在冷启动后用户将App退回后台,此时App的进程还在系统里。用户重新返回App的过程。(热启动做的事较少)

冷启动:App点击图标启动前,此时App的进程还不在系统里。需要系统新创建一个进程分配给App。(这是一次完整的App启动过程)

主要优化是针对冷启动,最佳启动时间应小于400ms,并且程序被限制启动时间不能大于20s,否则会因为看门狗机制而被杀掉。对于恢复悬挂不能大于10s,APP在后台已经运行的 不能超过十分

冷启动流程:

预编译-> 编译->汇编->链接(静态链接和动态链接)

一.dyld阶段:动态链接器 .h .m .cpp .swift,在我们点击run的时候就会生成mach-o的可执行文件

lg:在我们run程序之后,可以从product-> Show Build Folder in Finder ->Products->Debug->xxxx->显示包内容->xxxx的可执行文件是mach-o()格式的

主要处理在源代码中以#号开头的预编译的命令lg:#include,#import,将包含的的文件插入到编译的指定位置,删除一些注释,替换宏之类的。

系统调用exec文件就会创建进程,接下来:

  1把可执行文件加载到内存

  2.dyld加载到内存

  3.dyld进行动态链接 -> rebase bingding(虚拟内存概念)重定向修正指针

二.runtime阶段,ObjC的runtime初始化,包括:ObjC相关Class的注册、category注册、selector唯一性检查等。

以上是main函数指向之前,优化思路(减少类和方法的数量,合并动态库(自己写的不多于6个动态库),延时加载,二进制重排等),由于load方法会在main函数之前执行调用,load函数里面不要有耗时的操作,尽可能将里面的内容放到渲染完成后做。可以使用initialize代替load。优化类、方法、全局变量 减少加载启动后不会去使用的类或方法;少用C++全局变量;


三.main函数的初始化,main函数执行UIApplicationMain函数,就会进入应用的生命周期,调用didfinishlaunch这个方法(主要在这个方法里面做优化)我们一般会在这里面定位、统计、分享之类sdk的初始化,而这个过程是首屏渲染相关方法执行完成,从main函数执行到设置self.window.rootViewController执行完成的阶段。主要是首屏渲染相关的所有方法执行,见图


针对此过程的优化:不是一启动就必须要使用的东西不要启动项目时初始化善用异步,优化主线程,先处理会卡住主线程的方法,不能影响到用户的后续操作。



检测启动速度:edit scheme 设置key为:DYLD_PRINT_STATISTICS ,value为:1   就可以在控制台打印出启动app所花费的时间



补充:

一. 

  load:在main函数之前调用(exchange_method),系统直接寻址调用,一般不会自己调用,由系统调用,调用子类的load之前会先检查是否调用过父类,没有调用过父类会先调用父类再调用子类

  initialize:在第一次向类发送消息时调用(初始化),msgSend调用,调用子类之前会先调用父类,子类没有实现该方法会调用父类,所以父类的该方法可能会被调用多次,调用子类的initialize之前会先检查是否调用过父类,没有调用过父类会先调用父类再调用子类

二.

  静态库:一堆的.o文件的集合 ,编译打包之后不复存在

    优:静态库访问速度快,被链接到app之后的体积比较小

    缺:产物的体积比较大

  动态库:一个已经链接完全的镜像,动态库影响启动速度

    优:动态库能共享,节省空间,产物体积比较小

    缺:链接到app之后体积比较大

自己做的动态库,能共享吗?

  不能,只能跟扩展共享,扩展与app共用一个进程,公司内部组件,一般都是静态库,接入的第三方一般是动态库,因为保密性比较好。

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

推荐阅读更多精彩内容