文章目录

  • 1、dyld由来
  • 2、dyld指令集
  • 3、如何加载动态库
  • 4、如何抽取动态库

在了解动态库共享缓存之前,我们先了解一下APP从开发到安装到手机的基本过程
1、从开发到打包
MJRefreshExample.app中的 MJRefreshExample文件是 iOS中的可执行文件,文件格式是 Mach-O

这里有一个很重要的过程需要说明,从下面代码编译的流程图可以知道,不同的OC代码,编译出来的汇编代码可能是一样的。
![在这里插入图片描述](https://img-blog.csdnimg.cn/e5ee8ebdedb34adea681ca94a3554bcb.png

2、上传和安装
在了解了APP从开发到安装到手机的基本过程,我们对了解dyld就会有更深的理解。

1、dyld由来

如果在没有使用dyld之前,那么几个APP的通用动态库,需要各自编译一遍,这样就特别消耗内存。形象图如下:

但是,假如我们做了优化,把通用动态库放在一个所有APP都可以访问的位置,那么就可以把重复需要编译的库,只要实现一遍就可以。形象图如下:

通过以上我们就可以看出来,APP越多,每个APP引用的动态库越多,那么共享缓存的优势就越明显。

而苹果官方从iOS3.1开始,为了提高手机性能,就将绝大部分的系统动态库文件都打包存放到了一个缓存文件中(dyld shared cache
其缓存文件路径为:/System/Library/Caches/com.apple.dyld/dyld_shared_cache_armX

dyld全称为:dyld shared cache,直接翻译为动态库共享缓存。

那么接下来我们主要来了解一下dyld指令集、如何加载以及如何抽取动态库。

2、dyld指令集

1、指令集架构
dyld_shared_cache_armXX代表ARM处理器指令集架构:

v6
iPhone、iPhone3G
iPod Touch、iPod Touch2

v7
iPhone3GS、iPhone4、iPhone4S
iPad、iPad2、iPad3(The New iPad)
iPad mini
iPod Touch3G、iPod Touch4、iPod Touch5

v7s
iPhone5、iPhone5C
iPad4

arm64
iPhone5S、iPhone6、iPhone6 Plus、iPhone6S、iPhone6S Plus
iPhoneSE、iPhone7、iPhone7 Plus、iPhone8、iPhone8 Plus、iPhoneX
iPad5、iPad Air、iPad Air2、iPad Pro、iPad Pro2
iPad mini with Retina display、iPad mini3、iPad mini4
iPod Touch6

2、所有指令集原则上都是向下兼容的。
3、动态库共享缓存一个非常明显的好处是节省内存。
4、现在的ida、Hopper反编译工具都可以识别动态库共享缓存。

3、如何加载动态库

在Mac\iOS中,是使用了/usr/lib/dyld程序来加载动态库。
dyld 有两种解释,大众比较偏向第一种说法:

dynamic link editor:动态链接编辑器
dynamic loader:动态加载器

dyld的源码地址:https://opensource.apple.com/tarballs/dyld/,有兴趣的可以多了解一下。

4、如何抽取动态库

可以使用dyld源码中的launch-cache/dsc_extractor.cpp
1、将#if 0前面的代码删除(包括#if 0),把最后面的#endif也删掉。
2、编译dsc_extractor.cpp

clang++ -o dsc_extractor dsc_extractor.cpp

3、使用dsc_extractor

./dsc_extractor  动态库共享缓存文件的路径   用于存放抽取结果的文件夹

执行过程如下:

iOS开发:对于动态库共享缓存(dyld)的了解相关推荐

  1. ios 开发中 动态库 与静态库的区别

    使用静态库的好处 1,模块化,分工合作 2,避免少量改动经常导致大量的重复编译连接 3,也可以重用,注意不是共享使用 动态库使用有如下好处: 1使用动态库,可以将最终可执行文件体积缩小 2使用动态库, ...

  2. iOS开发中与库相关的术语

    动态库 VS 静态库 Static frameworks are linked at compile time. Dynamic frameworks are linked at runtime .f ...

  3. 2018年最全iOS开发之第三方库

    最全iOS开发之第三方库 最新增加 EAIntroView 一个灵活的介绍界面,可以用作引导页 UI 下拉刷新 EGOTableViewPullRefresh– 最早的下拉刷新控件. SVPullTo ...

  4. iOS开发常用三方库、插件、知名博客

    TimLiu-iOS iOS开发常用三方库.插件.知名博客等等,期待大家和我们一起共同维护,同时也期望大家随时能提出宝贵的意见(直接提交Issues即可). 持续更新... 版本:Objective- ...

  5. iOS开发中静态库制作 之.a静态库制作及使用篇

    iOS开发中静态库之".a静态库"的制作及使用篇 一.库的简介 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.库的类型? 根据源代码的公开情况,库可以分为2种类 ...

  6. Android开发之动态库调用

    发信人: yangAlbert (蓝), 信区: Android 标  题: Android开发之动态库调用 发信站: 武汉白云黄鹤站 (2011年02月20日23:20:51 星期天) 1.编写并生 ...

  7. IOS FRAMEWORK,动态库 等几个问题

    1,关于性能剖析工具的overhead问题,影响不影响数据统计出的函数时间的准确性??? 比如unity的deepprofiling在移动平台上开销很大,那么这时候剖析出的数据还准不准确呢? 答案:总 ...

  8. Linux中静态库和动态库(共享库)的区别

    1. 静态库和动态库的制作过程区别 1.1 静态库的制作过程 详见博客:Linux中静态库的制作与使用 1.2 动态库的制作过程 详见博客:Linux中动态库(共享库)的制作与使用 2. 静态库和动态 ...

  9. Linux中动态库(共享库)的制作与使用

    0. 库的基本概念 见博客:Linux中静态库的制作与使用 0.1 动态库的工作原理 首先回忆一下静态库,使用静态库,在GCC进行链接时,会把静态库中代码打包到可执行程序中. 但是使用动态库,在GCC ...

  10. 史上最全iOS开发之第三方库整理汇总

    UI 下拉刷新 EGOTableViewPullRefresh – 最早的下拉刷新控件. SVPullToRefresh – 下拉刷新控件. MJRefresh – 仅需一行代码就可以为UITable ...

最新文章

  1. 苹果挖走Google人工智能一把手,他之前有多厉害?
  2. javascript创建对象的三种方式
  3. 部门工作中的“求同存异”法则
  4. 微服务实战(四):服务发现的可行方案以及实践案例
  5. Oracle 表的创建 及相关參数
  6. cookie的设置与取值
  7. Hadoop实战(3)_虚拟机搭建CDH的全分布模式
  8. Kafka笔记整理(一)
  9. 用python做个网络爬虫
  10. NodeMCU(ESP8266) 接入阿里云物联网平台 踩坑之旅
  11. web前端性能优化总结 1
  12. 亚马逊云科技成为Meta关键长期战略云服务提供商;触宝科技延伸业务布局聚焦元宇宙 | 全球TMT...
  13. PHP7函数大全(4553个函数)
  14. nginx tcp端口转发_使用Nginx进行TCP/UDP端口转发
  15. Android 7.1 PackageInstaller(应用安装器)增加自动点击安装
  16. 我当程序员一天,就多陪你一天吧
  17. ClipCap: CLIP Prefix for Image Captioning
  18. mac安装python虚拟环境_mac 下 python 虚拟环境的安装和配置
  19. 如何用建木CI一键部署Java构件到Nexus
  20. 谁知道下面这个视频中的特效是用什么软件做的?

热门文章

  1. 内存单元地址求字节大小的计算方法
  2. 爬虫实战—豆瓣250榜单的爬取
  3. 从零开始学习SLAM
  4. 跟着团子学SAP CS:SAP CS(客户服务)模块概览
  5. win10系统无工具一键升级与重装
  6. Linux命令之ss命令
  7. 【延展Extension的基本使用 Objective-C语言】
  8. 【延展Extension的使用场景 Objective-C语言】
  9. 国内最新语音服务器,语音聊天社交很热门,带你搭建自己的语音聊天服务器
  10. react-custom-scrollbars 滚动条组件的简单实现