静态库和动态库对ipa包影响

一. 静态库和动态库

库是一种可执行的二进制文件,是编译好的代码。

静态库:

在程序编译过程中会被链接到目标代码里面.

  • 优点:

直接链接到目标程序中,不需要动态链接,提高加载效率。

  • 缺点:

会使目标程序的体积增大

动态库:

程序运行时由系统动态加载到内存中,供程序调用。

  • 优点

不需要拷贝到目标程序中,不会影响目标程序的体积。

同一份苦可以被多个程序使用

编译时才载入的特性,也可以让我们随时对库进行替换,而不需要重新编译代码,实现动态更新。

  • 缺点:

动态载入会带来一部分性能损失:比如调用时间延长,地址重定位等。

二. 静态库和动态库体积对比

  1. 单独打包出来的静态库和动态库体积对比:

我们以swift版本的Lottie动画库做对比:

静态库:
image.png

单独打包出来的静态库是8.3M

动态库:
image.png

单独打包出来的动态库是:3.7M

  1. 合并到项目里面打包出来的静态库和动态库的ipa包对比:

静态库:
image.png
image.png
动态库:
image.png
image.png

从上面对比图,我们可以看出,如果是单独打包静态库和动态库,明显来说是静态库比动态库大,如果是合并到项目中,看起来静态库打包出来的ipa包比动态库打包出来的ipa包要小。

三. 原因分析

单独打包出来的swift版本的Lottie静态库之所以比动态库大,主要原因在于:

  • 单独打包出来的静态库,带有符号信息(就是内存地址和函数名,文件名,行号等的映射信息)

合并到项目里面打包出来的静态库的ipa包比动态库的ipa包小,主要原因在于:

  • 当静态库合并到可执行文件中,在链接过程中去掉了静态库的符号信息,只留下真正可执行的二进制文件。

  • 静态库只是中间文件,在链接的过程中会优化静态库里面的.o文件。

也就是说静态库的ipa包比动态库的ipa包小的主要部分是: 静态库合并到可执行文件的链接期间,链接器对静态库等做的优化,比如无用代码裁剪,函数内联,跨过程优化等操作而减少的部分。

你可能感兴趣的:(静态库和动态库对ipa包影响)