美文网首页
动态库概述

动态库概述

作者: sayyou2012 | 来源:发表于2018-03-31 17:54 被阅读0次

    决定app性能的两个重要因素是启动时间和内存占用。减少app可执行文件的大小,以及尽量减少APP启动后内存的占用使得app可以以更快的速度启动以及启动后占用更少的内存空间。使用动态库而不是静态库可以减小app的可执行文件的大小,还允许app推迟加载具有特殊功能的库到需要时,而不是在启动时就进行加载,这个特性进一步降低了启动时间,并且使内存的使用更加高效。

    本文介绍了动态库,并展示了如何使用动态库而不是静态库来降低可执行文件的大小和初始内存占用。

    首先,先了解下什么是静态库。

    应用程序的大部分功能都是在可执行代码库中实现的。当应用程序使用静态链接器与库链接时,静态库中被app使用到的那部分代码被拷贝到生成的可执行文件中。静态连接器将编译后的源代码(即目标代码)以及app使用到的那部分静态库代码收集到一个可执行文件中,该文件在运行时会被全部加载到内存中。成为app可执行文件的一部分的库称之为静态库。静态库是目标文件的集合或归档。

    注意:静态库也称为静态归档库、静态链接共享库。

    当一个app启动时,应用程序的代码——包括与app链接的静态库的代码,都被加载到应用程序地址空间中。将许多静态库链接到app会导致app的可执行文件非常大。图一展示了使用静态库中实现的功能的app的内存使用情况。如果app的可执行文件很大,那么,会导致app启动变慢,以及更大的内存占用。此外,当某个静态库更新后,使用它的app将不会因为该静态库的更新而受益。为了获得静态库改进后的功能,app开发人员必须将app的目标文件与新版本的静态库重新链接在一起。而且,使用该app的用户也需要安装新版本的app。

    那么,什么是动态库呢?

    更好的方式是:app在真正需要的时候才将代码加载到它的地址空间,可以是在启动时,亦或是运行时。具备这种灵活性的库就是动态库。动态库不会被静态链接到使用它的app中,也不会成为可执行文件的一部分。相反,动态库是在app启动或运行时才被加载或链接。

    注意:动态库也称为动态共享库,共享对象或动态链接库。

    图2展示了如何使用动态库而不是静态库来实现某些功能,从而降低app启动后所使用的内存。

    如果使用动态库,那么,程序可以自动地受益于它所使用的某个动态库的更新,因为库是被动态链接的,而不是静态链接。也就是说,app的功能可以在不需要app开发者重新编译app的前提下,进行改进和扩展。

    动态库还有另外一个好处,就是当他们在在加载时,可以被初始化;当app正常终止时,可以执行清理任务。而静态库就没有这个特性。

    开发动态库时,有一个问题开发人员必须牢记于心,就是动态库在更新时,要保持兼容性。因为动态库的更新并不需要了解app开发者是如何使用该动态库的,app必须能够使用库的最新版本,而不必更改任何代码。所以,动态库的API不应该被修改。然而,有时候改进必须要修改库的API,在这种情况下,动态库的前一个版本必须保留在用户计算机中,以便app可以正常运行。

    动态库是如何被使用的呢?

    当app启动时,OS内核将app的代码和数据加载到一个新的进程的地址空间中。内核同时也加载动态加载器(usr/lib/dyld)到进程中。然后动态加载器加载app的依赖库,也就是app链接的那些动态库。静态链接器记录下app所链接的每一个依赖库的文件名。此文件名被认为是动态库的安装名。动态加载器利用app的依赖库的安装名,在文件系统中将它们进行定位。如果动态加载器在app启动时没有找到所有的依赖库,或者任何一个库与app不兼容,那么,启动进程将终止。

    动态加载器只是决定了app启动过程中实际使用到的未定义的外部符号。其它符号并没有决定,直到app使用它们的时候才进行决定。

    动态加载器除了在启动时自动加载动态库以外,还会根据app的请求在运行时加载动态库。也就是说,如果app不需要在启动时加载动态库,那么开发者可以选择不将app的目标文件和动态库进行链接,而是只在app需要它的时候才加载动态库。


    翻译自苹果官方文档:https://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/DynamicLibraries/100-Articles/OverviewOfDynamicLibraries.html


    相关文章

      网友评论

          本文标题:动态库概述

          本文链接:https://www.haomeiwen.com/subject/qvzgcftx.html