Contents
  1. 1. zlib 的介绍
  2. 2. zlib 的苹果实现
  3. 3. macOS 链接的版本
  4. 4. iOS 链接的版本

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。

Contents
  1. 1. zlib 的介绍
  2. 2. zlib 的苹果实现
  3. 3. macOS 链接的版本
  4. 4. iOS 链接的版本