在了解动态库共享缓存之前,我们先了解一下APP从开发到安装到手机的基本过程
1、从开发到打包

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

其缓存文件路径为:/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 动态库共享缓存文件的路径 用于存放抽取结果的文件夹
执行过程如下: