苹果的 zlib 库
zlib 的介绍
zlib 是个标准化通用压缩库,各个语言平台都有对应的实现。标准文档为
zlib 使用 deflate 压缩算法进行压缩,deflate 也是标准化的算法
deflate 是无损压缩算法,简单说就是先用 LZ77 压缩,再用霍夫曼编码压缩
zlib 的苹果实现
苹果的 zlib 是开源的,地址是 https://opensource.apple.com/source/zlib
最早从 macOS 10.0 开始,开源出来的 zlib 版本是 1.1.3。最新版本是 1.2.11。
zlib/zlib.h 头文件里声明了一个 ZLIB_VERSION 宏,这个宏注明版本,举个栗子 https://opensource.apple.com/source/zlib/zlib-4/zlib/zlib.h.auto.html
macOS 链接的版本
在 10.14.5 的 macOS 中,打开动态库的目录 /usr/lib
12B Apr 2 17:43 libz.1.1.3.dylib -> libz.1.dylib
12B Apr 2 17:43 libz.1.2.11.dylib -> libz.1.dylib
12B Apr 2 17:43 libz.1.2.5.dylib -> libz.1.dylib
12B Apr 2 17:43 libz.1.2.8.dylib -> libz.1.dylib
182K May 4 15:04 libz.1.dylib
12B Apr 2 17:43 libz.dylib -> libz.1.dylib
从这里可以看到,虽然提供了各个版本的 dylib,但都是 libz.1.dylib 的替身,不管用的哪个最终都链接到 libz.1.dylib 上。
用 hopper 打开 libz.1.dylib,可以看到版本号是 1.2.11 是最新的版本。
iOS 链接的版本
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/lib
这个目录放的是链接的 tbd 格式的库,关于 tbd 的一些信息可以看:https://satanwoo.github.io/2018/12/22/LD-1/
最后模拟器用的还是 dylib,只不过地址在
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib
和 macOS 一样
12B Jan 11 18:38 libz.1.1.3.dylib -> libz.1.dylib
12B Jan 11 18:38 libz.1.2.11.dylib -> libz.1.dylib
12B Jan 11 18:38 libz.1.2.5.dylib -> libz.1.dylib
12B Jan 11 18:38 libz.1.2.8.dylib -> libz.1.dylib
95K Mar 18 10:40 libz.1.dylib
12B Jan 11 18:38 libz.dylib -> libz.1.dylib
大家都是 libz.1.dylib 的替身。iOS 版的 libz 比 macOS 版的体积小一半是因为 macOS 版的为 FAT binary 包含 64 位和 32 位。
用 hopper 打开发现版本同样是 1.2.11
所以,不管 Xcode 中链接的是哪个版本的 tbd,最后都会使用到 1.2.11 这个版本。在报上来的 crash 日志中显示的是 libz.1.dylib。