iOS 优化App启动时间-启动详解(上篇)(3),头脑导图+源代码+笔记+项目 ...

锦通  金牌会员 | 2024-6-21 13:44:39 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 808|帖子 808|积分 2424


  • Text.__text: 主程序代码
  • Text.__cstring:c 字符串
  • Text.__stubs:桩代码(桩代码就是用来代替某些代码的代码)
  • Text.__stub_helper
  • Data.__data :初始化可变的数据
  • Data.__objc_imageinfo: 镜像信息 ,在运行时初始化时 objc_init,调用 load_images 加载新的镜像到 infolist 中
  • Data.__la_symbol_ptr
  • Data.__nl_symbol_ptr
  • Data.__objc_classlist :类列表
  • Data.__objc_classrefs :引用的类
3、Mach-O的通用文件

在差异的架构内存的分配是差异的,那么怎么做一个兼容架构的Mach-O文件?

Fat Header来办理这个问题,在运行时根据架构来判断选择Mach-O文件。
虚拟内存

   虚拟内存是在物理内存上建立的一个逻辑地址空间,它向上(应用)提供了一个连续的逻辑地址空间,向下隐蔽了物理内存的细节。虚拟内存使得逻辑地址可以没有现实的物理地址,也可以让多个逻辑地址对应到一个物理地址。虚拟内存被划分为一个个大小雷同的Page(64位系统上是16KB),进步管理和读写的效率。 Page又分为只读和读写的Page。
  虚拟内存是建立在物理内存和历程之间的中心层。在iOS上,当内存不足的时候,会尝试释放那些只读的Page,由于只读的Page在下次被访问的时候,可以再从磁盘读取。假如没有可用内存,会关照在后台的App(也就是在这个时候收到了memory warning),假如在这之后仍然没有可用内存,则会杀死在后台的App。
APP启动


app启动的时候,内核会把app映射到一个新的内存空间,开始地址是随机的。

然后内核通过Dyld来加载动态库。
   dyld(the dynamic link editor)是苹果的动态链接器,是苹果操纵系统一个紧张构成部分,在系统内核做好程序准备工作之后,交由dyld负责余下的工作。而且它是开源的,任何人可以通过苹果官网下载它的源码来阅读明白它的运作方式,相识系统加载动态库的细节。
  详解传送门
Dyld 链接过程


  • 递归映射所有的动态库
  • Rebase所有的镜像
  • Bind镜像
  • objc runtime 准备
  • 初始化

1、加载动态库步调



  • 剖析依赖所有的动态库
  • 找到哀求的mach-o 文件
  • 打开读取文件
  • 验证mach-o 文件
  • 署名
  • 调用每个segmentmmap()函数
等到所有直接依赖的动态库加载完成,加载动态库依赖的其他动态库,如许重复举行。
一个app通常会加载400多个动态库,大多数是系统库,系统库大多数都被优化加载过程 ,以是优化的关注点在于内嵌动态库。
为了保证加载完之后,保证Rebase、Bind、Objc过程动态库相关稳定,以是要加署名。
2、Rebase

ASLR:全称是Address space layout randomization,翻译过来就是“地址空间布局随机化”。App被启动的时候,程序会被影射到逻辑的地址空间,这个逻辑的地址空间有一个起始地址,而ASLR技能使得这个起始地址是随机的。假如是固定的,那么黑客很轻易就可以由起始地址+偏移量找到函数的地址。
为什么需要Rebase?
是由于刚刚提到的ASLR使得地址随机化,导致起始地址不固定,另外由于Code Sign,导致不能直接修改Image。Rebase的时候只需要增长对应的偏移量即可。待Rebase的数据都存放在__LINKEDIT中。
Rebasing:调整镜像内部指针

我们可以使用命令行查看Rebase和Bind信息:

2、Binding

Binding:调整指向镜像外部的指针
问:为什么需要Binding?
答:引用动态库其他的函数大概变量,当前mach-o文件会指向其他dylib。这时候就需要Binding操纵完成这些活,Dyld会根据符号表去找到相应函数和变量地址。

Bind相对于Rebase有更复杂的计算,更少的page fault
3、Notify ObjC Runtime

完成Rebase和Bind之后,关照Runtime去做一些代码运行时需要做的事情。
需要做哪些事情:


  • 大多数的Objc初始化在rebasing和binding之后完成
  • 所有的objc 类的界说在这时候被注册
  • non-fragile 属性偏移量调整更新(non-fragile ivar 是在modern runtime新增特性,为了不需要重新编译调整变量内存分布)
  • 种别被插入方法列表
  • 方法器的独特性
4、Initializers

完成objc的相关工作之后,需要完成动态库一些初始化工作:


  • c++为静态分配的对象生成初始化器
  • ObjC +load 方法
  • 运行“自下而上”,如许每个初始化器都可以调用它下面的dylibs
  • 最后,Dyld在可执行文件中调用main()
Pre-main() 总结

pre-mian 阶段主要是Dyld做的工作:


  • 深度加载依赖的动态库
  • 修正DATA pages的指针
  • 运行初始化工作
自我先容一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到如今。
深知大多数前端工程师,想要提升技能,每每是自己探索成长大概是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学结果低效又漫长,而且极易碰到天花板技能故步自封!
因此网络整理了一份《2024年Web前端开发全套学习资料》,初衷也很简朴,就是希望可以大概帮助到想自学提升又不知道该从何学起的朋友,同时减轻各人的负担。


既有适合小白学习的零底子资料,也有适合3年以上履历的小伙伴深入学习提升的进阶课程,根本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目次截图出来,每个节点里面都包罗大厂面经、学习笔记、源码课本、实战项目、解说视频,而且会连续更新!
假如你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)
最后

由于篇幅限制,pdf文档的详解资料太全面,细节内容着实太多啦,以是只把部分知识点截图出来粗略的先容,每个小节点里面都有更细化的内容!有需要的程序猿(媛)可以帮助点赞+点击【学习资料】即可免费领取!


3/13/H4lCoPEF.jpg" />
最后

由于篇幅限制,pdf文档的详解资料太全面,细节内容着实太多啦,以是只把部分知识点截图出来粗略的先容,每个小节点里面都有更细化的内容!有需要的程序猿(媛)可以帮助点赞+点击【学习资料】即可免费领取!
[外链图片转存中…(img-MiOXTKrq-1712113250198)]
[外链图片转存中…(img-63TMlulu-1712113250198)]

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

锦通

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表