静态库.png
动态库和静态库的区别
库:一段二进制文件+加头文件,使用场景一个是供别人使用,一个是在代码改动较小,减少编译时间,因为只是一段二进制文件,Link一下,即可使用.
Framework: 一种打包方式,简单将二进制文件、头文件和其他一些信息聚合在一起。
iOS中的Framework分类:
系统级别: Dynamic Framework, 系统提供的framework都是动态库,比如UIKit.framework,系统的framwork不需要拷贝目标程序。
用户级别:Static Framwork(静态库)和Dynamic Framework(动态库)(Embeded Framework)
Static Framwork: 二进制文件+头文件+资源文件
Embeded Framework: 用户可以制作的动态库,受到iOS平台的沙盒机制和签名机制限制,具有部分动态特性,可以在Extension可执行文件和APP可执行文件中执行,不能在不同app进程中共享,而且需要拷贝到目标程序。
库
定义
优点
缺点
静态库
一般以.a或者.framework结尾,在编译时候,只拷贝一份之后就不会再改变了
目标程序没有外部依赖,可以直接运行
目标程序体积大
动态库
一般以.dylib或者.framework结尾, 并且不会别拷贝到目标程序, 目标程序只会存储指向动态库的指引,等到程序运行,才会被加载
同一个份库可供多个程序使用, 运行载入特性使得目标程序体积小
1.动态载入会带来一部分的性能损失
2.依赖外部环境,如果动态库缺失或者版本错误,就会导致程序无法运行
iOS设备CPU架构
模拟器:i386, x86_64
真机: arm7, arm7s, arm64,最新的设备基本都是arm64
静态库制作
新建Static Framework
Xcode -> File -> new -> Project-> 选中 iOS ->Static Framework
Framework.png
这里创建LLStaticSDK的工程
新建swift文件
注意这里的关键词public,也可以用open。
LLPrintTool.swift
工程配置
1. Mach-O Type设置(Static Library)
Mach-O.png
2.version设置
version.png
3.Build Active Architecture Only(NO,适配所有设备)
Build Active Architecture Only.png
4. Dead Code Stripping(NO, 可选)
主要是目的是瘦包
Dead Code Stripping.png
调试
方式一: 终端操作
分别选择在真机和模拟器command+b编译文件,然后选择Product->这里创建LLStaticSDK的工程.framework showInFinder显示如图俩个文件夹,分别是真机和模拟器, 分别执行
$ lipo -info /Users/wujian/Library/Developer/Xcode/DerivedData/LLStaticSDK-bnsiapbkckebfyefumdziltevphd/Build/Products/Debug-iphoneos/LLStaticSDK.framework/LLStaticSDK
Non-fat file: /Users/wujian/Library/Developer/Xcode/DerivedData/LLStaticSDK-bnsiapbkckebfyefumdziltevphd/Build/Products/Debug-iphoneos/LLStaticSDK.framework/LLStaticSDK is architecture: arm64
lipo -info /Users/wujian/Library/Developer/Xcode/DerivedData/LLStaticSDK-bnsiapbkckebfyefumdziltevphd/Build/Products/Debug-iphonesimulator/LLStaticSDK.framework/LLStaticSDK
Non-fat file: /Users/wujian/Library/Developer/Xcode/DerivedData/LLStaticSDK-bnsiapbkckebfyefumdziltevphd/Build/Products/Debug-iphonesimulator/LLStaticSDK.framework/LLStaticSDK is architecture: x86_64
可以看出LLStaticSDK文件分别描述设备的CPU架构分别是arm64, x86_64
接下来就要对这俩部分进行合并处理, $ lipo -create [目标文件1] [目标文件2] -output [输出文件]
lipo -create /Users/wujian/Library/Developer/Xcode/DerivedData/LLStaticSDK-bnsiapbkckebfyefumdziltevphd/Build/Products/Debug-iphoneos/LLStaticSDK.framework/LLStaticSDK
/Users/wujian/Library/Developer/Xcode/DerivedData/LLStaticSDK-bnsiapbkckebfyefumdziltevphd/Build/Products/Debug-iphonesimulator/LLStaticSDK.framework/LLStaticSDK -output ~/Desktop/LLStaticSDK.lipo
这里将LLStaticSDK替换真机的LLStaticSDK的文件
接着把模拟器文件夹中的LLStaticSDK swiftmodule的文件和真机的文件合并
合并后
最后将真机的这里将LLStaticSDK.framework托人Demo中,进行测试
调试.png
方式二:工程依赖
方式一调试起来很麻烦,每次都要进行重新操作才能重新调试。方式二比较推荐
1.首先将SDK工程放入Demo如图目录
将SDK工程放入Demo.png
2.创建依赖
Target -> Framwork, Library and embeded content -> + -> addOther -> LLStaticSDK.xcodeproj, 添加流程和显示结果如下
创建依赖.png
添加LLStaticSDK.xcodeproj
显示.png
3.在SDK工程下新建target
新建target.png
Aggregate.png
4.添加脚本
将脚本内容copy到如下图位置
添加脚本.png
将脚本中的${PROJECT_NAME}替换成自身的framework名
编译一下,lipo -info 会发现支持的CPU架构为i386 armv7 x86_64 arm64。
然后项目就在集成在一起,修改起来就很方便了