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


在了解动态库共享缓存之前,我们先了解一下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  动态库共享缓存文件的路径   用于存放抽取结果的文件夹

执行过程如下:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_38633659/article/details/125431244