当前位置:网站首页>iOS开发:对于动态库共享缓存(dyld)的了解
iOS开发:对于动态库共享缓存(dyld)的了解
2022-06-27 03:39:00 【瓜子三百克】
在了解动态库共享缓存之前,我们先了解一下APP从开发到安装到手机的基本过程
1、从开发到打包

MJRefreshExample.app中的 MJRefreshExample文件是 iOS中的可执行文件,文件格式是 Mach-O。 这里有一个很重要的过程需要说明,从下面代码编译的流程图可以知道,不同的OC代码,编译出来的汇编代码可能是一样的。

在了解了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_armX的X代表ARM处理器指令集架构:
v6
iPhone、iPhone3G
iPod Touch、iPod Touch2v7
iPhone3GS、iPhone4、iPhone4S
iPad、iPad2、iPad3(The New iPad)
iPad mini
iPod Touch3G、iPod Touch4、iPod Touch5v7s
iPhone5、iPhone5C
iPad4arm64
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 动态库共享缓存文件的路径 用于存放抽取结果的文件夹
执行过程如下:
边栏推荐
猜你喜欢
![455. distribute biscuits [distribution questions]](/img/51/c7544d0eaa121cd461ffa678079473.jpg)
455. distribute biscuits [distribution questions]

MySQL development environment

Uni-app 之uParse 富文本解析 完美解析富文本!

Super détaillé, 20 000 caractères détaillés, mangez à travers es!

Yiwen teaches you Kali information collection

Ledrui ldr6035 usb-c interface device supports rechargeable OTG data transmission scheme.
![[promise I] introduction of promise and key issues of hand rolling](/img/14/94bd986d3ac8a0db35c83b4234fa8a.png)
[promise I] introduction of promise and key issues of hand rolling

2019LXMERT:Learning Cross-Modality Encoder Representations from Transformers

promise源码-class版本【三、Promise源码】【代码详细注释/测试案例完整】

PAT甲级 1020 Tree Traversals
随机推荐
乐得瑞LDR6035 USB-C接口设备支持可充电可OTG传输数据方案。
Lodash get JS code implementation
Stack overflow vulnerability
电商产品如何在知乎上进行推广和打广告?
[Shangshui Shuo series] day 6
How do I simplify the development of interfaces in open source systems?
2020:MUTANT: A Training Paradigm for Out-of-Distribution Generalizationin Visual Question Answering
Pat class a 1024 palindromic number
Promise [II. Promise source code] [detailed code comments / complete test cases]
人群模拟
Pat grade a 1019 general palindromic number
QIngScan使用
流沙画模拟器源码
2021:Greedy Gradient Ensemble for Robust Visual Question Answering
Resnet152 pepper pest image recognition 1.0
TP5 spreadsheet excel table export
resnet152 辣椒病虫害图像识别1.0
2021:AdaVQA: Overcoming Language Priors with Adapted Margin Cosine Loss∗自适应的边缘余弦损失解决语言先验
fplan-电源规划
Nacos调用微服务两个问题:1.Load balancer does not contain an instance for the service 2.Connection refused