静态库制作流程与上传cocoaPods总结

2018-03-26  本文已影响0人  云舒卷_js

IOS 静态库分成.a和.framework两种. .a库是项目里文件.m的集合,最终会编译成.o文件。通过命令行解压提取.o文件:


静态库的架构ARM:

每种型号的手机都会对应一种cpu,而每个cpu都对应几种架构。

有i386/x86_64/armv7/armv7s/armv64这样几种。当然armv6/armv7/armv7s的机型现今市面上已经不常见了,armv64是最主流的机型了。模拟器32位处理器测试需要i386架构,模拟器64位处理器测试需要x86_64架构。

arm64:(iphone5s以上使用的架构,64位操作系统),而iphone5c和iphone5都是使用32位的系统。当然,我们可以在iphone5s上使用32架构,但是会降低性能。

SDK开发可以把Debug模式改成NO,打出来的包包含了所有的架构。

1.Architectures

指定工程被编译成可支持哪些指令集类型,而支持的指令集越多,就会编译出包含多个指令集代码的数据包,对应生成二进制包就越大,也就是ipa包会变大。

2.Valid Architectures

限制指令集的范围,编译出哪种指令集的包,将由Architectures与Valid Architectures(因此这个不能为空)的交集来确定

3.Build Active Architecture Only

定是否只对当前连接设备所支持的指令集编译

当其值设置为YES,是为了debug的时候编译速度更快,它只编译当前的architecture版本,而设置为no时,会编译所有的版本。 所以,一般debug的时候可以选择设置为yes,release的时候要改为no,以适应不同设备。

总结:

Valid Architectures设置的支持arm指令集版本有:armv7/armv7s/arm64,对应的Architectures设置的支持arm指令集版本有:armv7s,这时Xcode只会生成一个armv7s指令集的二进制包。

将Architectures支持arm指令集设置为:armv7,armv7s,对应的Valid Architectures的支持的指令集设置为:armv7s,arm64,那么此时,XCode生成二进制包所支持的指令集只有armv7s


减少静态库的体积

将Generate Debug Symbols 选项改为NO,可以明显降低包的体积

导包中过程中注意点:

因为静态库中是没有办法包含静态库了,就算将第三方静态库打包进自己的静态库中,然后编译的时候它是不会将第三方静态库一起编译的。所以三方静态库也要和自己的库一起暴露出来。

Destination: 决定是引用的方式还是拷贝的方式导入项目。

added folders: 目录结构方式,groups无目录结构,直接引用不需要通过文件名逐层寻找,事实上打包是把所有的文件都放在.app根目录下面了。folders需要按照文件路径来寻找和我们访问磁盘路径类似。

需要勾选add to targets,不然不会产生包和项目之间的链接关系,使用会报错:

other linker flags:如果我们库使用了分类,请加-ObjC,否则编译不通过

-ObjC:加了这个参数后,链接器就会把静态库中所有的Objective-C类和分类都加载到最后的可执行文件中

-all_load:会让链接器把所有找到的目标文件都加载到可执行文件中,但是千万不要随便使用这个参数!假如你使用了不止一个静态库文件,然后又使用了这个参数,那么你很有可能会遇到ld: duplicate symbol错误,因为不同的库文件里面可能会有相同的目标文件,所以建议在遇到-ObjC失效的情况下使用-force_load参数。

-force_load:所做的事情跟-all_load其实是一样的,但是-force_load需要指定要进行全部加载的库文件的路径,这样的话,你就只是完全加载了一个库文件,不影响其余库文件的按需加载

Copy Bundle Resources:这里面放了资源文件,应用程序在运行时需要使用,如plist文件,XIB 文件和图像文件、声音文件等等。如果在集成后出现not found file问题的话,首先来找下这里。

Link Binary With Libraries:连接二进制文件和库

在完成源文件的编译之后,连接框架(或库),这样代码就可以使用这些框架类了。它和下图同理:

关于CocoaPods上传

编译和预处理过程:

Compile Sources 构建阶段分为两步:预处理(Preprocessing)和编译(Compiling)。预处理阶段的目标是为每一个实现文件(.m)创建中间文件(intermediate file)。中间文件仍然类似实现文件的Objective-C代码,但是中间文件会变得非常大。

在创建中间文件时,预处理器负责处理实现文件(.m)中所有的预处理指令(preprocessor directives)。预处理指令是所有以 # 开头的语句,如 #import。#import 语句将替换为实际引用文件的内容。这就是说文件越多可能编译出来的中间文件越大,这样ipa包或者库的体积也会越大,我们可以合并一些功能类似的文件做精简,但是无脑合并会对代码阅读上造成不好的影响。

例如,一个实现文件 ***.m 引用了 ***.h 头文件;为 .m 创建的中间文件将包含 ***.h和 ***.m文件。还不止这些,并且 ***.h 头文件引用了其他 2 个文件 UIKit.h和CoreLocation.h,还有可能这 2 个文件引用了其他的头文件 .h,这些头文件将全部包含在该实现文件***.m 创建的中间文件中(intermediate file)。

上一篇下一篇

猜你喜欢

热点阅读