• 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
    
    • 1

    3、使用dsc_extractor

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

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

  • 相关阅读:
    单片机语音芯片在工业控制中的应用优势
    Oracle/PLSQL: NULLIF Function
    企业计算机服务器中了mallox勒索病毒怎么解决,勒索病毒解密文件恢复
    Win11怎么在右键菜单添加一键关机选项
    二叉树是否对称
    GO语言网络编程(并发编程)Goroutine池
    Linux中如何执行命令
    07 MySQL 从入门到精通——运算符、流程控制语句
    MYSQL中ORDER BY(排序查询)
    【数据分析入门】【淘宝电商API接入与电商数据分析】初识Web API(一)
  • 原文地址:https://blog.csdn.net/weixin_38633659/article/details/125431244