先说一下静态库的相关基础知识。库是程序代码的集合,是共享代码的一种方式。静态库可能对于一般开发人员来说,使用的并不是很多,但是日常开发用到静态库的知识还是比较多的,所以学习静态库的相关知识后,有利于解决日后使用静态库出错的问题。当然,如果你的技术水平非常高是一个公司编写核心代码的技术员,了解一些静态库相关知识还是非常有必要的。
库的分类:
分为开源库和闭源库,其中闭源库分为静态库和动态库。
静态库和动态库存在形式的区别:
静态库:.a(如友盟) 和 .framework(如百度地图)
动态库:.dylib(如sqlite) 和.framework 以及.tzd .tzd和.dylib是差不多的
静态库和动态库存使用的区别:
静态库:链接时,静态库会被完整地复制到可执行文件中,被多次使用就又多分冗余拷贝。如一个手机中两个app都用到百度地图的静态库,这时每个app都会复制百度地图的静态库。
动态库:链接是不复制,程序运行时由系统动态加载到内存中,供程序调用,系统之家在一次,多个程序共用一份,节省内存。
重点注意:
项目中如果使用了自制的动态库,不能上架。所以实际开发中用的都是静态库!
静态库的使用场景:
场景一:如百度地图想让开发者尽可能的使用百度地图,但是不想公布自己的技术实现。这是就会将核心代码变编译成静态库,对外暴露统一的接口,开发者集成静态库,并且调用静态库即可集成。
场景二:如爱奇艺视频播放app,但是不想让别人看到自己的核心编码和解码技术,一般会抽取核心人员编写这些核心代码,核心代码编写好后,打包成为静态库,直接给开发人员集成使用。如果不这样做,可能开发人员会拿走核心代码,不利于公司的利益。
.a静态库的制作和使用
1、打开xcode,按照下图建立工程。其中选中的建立.a静态库,左边的是建立.framework库。
2.编写核心代码。
3.在copy Files中添加对外可见的.h问件。
4.更该编译环境,Debug设置为NO,操作图如下方。然后分别选中真机和模拟器, 分别cmd+b编译,此时之前编译的静态库会被覆盖掉。 但是这个编译出来的只能在真机上或者模拟器上使用,并不能同时在真机和模拟器上使用。请继续看第5步。为何要这样做,下面会有详细的说明。
5.合并静态库。先cd Products文件下,然后找到模拟器和真机分别对应的.a文件,输入相关命令。具体命令看下图。然后回车,便生成新的静态库,在Products文件夹下的libstatic.a文件,之后便可拿着该文件直接使用。使用的时候直接将模拟器或真机生成的头文件一块拿来使用。
说明:合并之后的静态库资源大小 >= 真机静态库资源大小 + 模拟器静态库资源大小。所以上架的时候,要重新更换静态库,只要支持真机就可以了。
关于第4步的一些背景知识说明:第4步之所以这样做是因为,涉及静态库的架构问题。设备的CPU架构:不同的设备使用的CPU不同,CPU的不同造成使用的CPU指令集不同。静态库有其支持的CPU,如果静态库在不支持的CPU架构上运行就会报错。如编译出来的模拟器和真机静态库不能混合使用,要一一对应。注意:CPU架构不支持,即使是模拟器编译出来的静态库也不能在模拟器上使用。如6s静态库编译出来的在4s上不能使用。通过命令可以查询静态库支持的架构:1. Cd + 静态库.a的上级文件夹 2.lip -info stasicLib.a 3、回车 (stasicLib.a 是静态库)
模拟器使用的CPU架构:
iPhone4s - 5:使用i386CPU架构
iPhone5s - 6sp:使用x86_64CPU架构
真机CPU架构:
iPhone3gs - 4:使用armv7CPU架构
iPhone5s - 5C:使用armv7SCPU架构
iPhone5s - 6sp:使用armv64CPU架构
其他说明:友盟只提供了一个静态库,通过命令查询友盟提供的静态库支持多种CPU类型静态库。实际上是没有必要这样做的,应该分别提供真机静态库和真机模拟器静态库,这样上架的时候可以减少app中不必要的资源。但是可能因为大多数人不懂静态库相关知识,可能在使用静态库的时候出错,进而会认为是友盟比较垃圾,做得东西不好。可能是出于这种原因的考虑,友盟并没有提供多种静态库。
.framework静态库制作
.framework的静态库制作和.a静态库的制作有三个不同的地方,其他基本一致。
第一个不同点:创建工程不同,创建工程时应该选择Cocoa Touch Framework
第二点不同:暴露头文件的方式设置不同。首先在libFramework.h代码文件中,导入MathTool.h的头文件。然后进行如下设置,具体设置如下图。其中libFramework.h是系统自动生成的.h文件,也是自动对外暴露的,MathTool.h是自己写的核心代码。
第三点不同:在编译之前要更改编译环境为静态库。否则编译出来的是动态库,使用动态库苹果是不允许上架的。除此之外合并静态库,设置支持不同CPU类型等操作都一致。操作如下图:
自制.framework使用是注意事项:首先是和.a静态库一样直接拉入工程文件中,但使用时要导入.framework是使用<>,如#import