iOS 库 打包篇.a .bundle .framework

简介: 库是程序代码的集合,是共享程序代码的一种方式

一.库的简介


1.什么是库?


库是程序代码的集合,是共享程序代码的一种方式


2.库的类型?


根据源代码的公开情况,库可以分为2种类型


开源库


公开源代码,能看到具体实现

如SDWebImage, AFNetworking


闭源库


不公开源代码,是经过编译后的二进制文件,看不到具体实现

主要分为: 静态库,动态库


模拟器CPU架构:4s-5: i386 5s-6s Plus: x86_64

真机的CPU架构


armv6: iPhone、iPhone 2、iPhone 3G、iPod Touch(第一代)、iPod Touch(第二代)

armv7: iPhone 3Gs、iPhone 4、iPhone 4s、iPad、iPad 2

armv7s: iPhone 5、iPhone 5c (静态库只要支持了armv7,就可以在armv7s的架构上运行)

arm64(注:无armv64): iPhone 5s、iPhone 6、iPhone 6 Plus、iPhone 7、iPhone 7PlusPlus、iPad Air、iPad Air2、iPad mini2、iPad mini3


3.静态库与动态库的区别?


1.静态库和动态库的存在形式上的区别


静态库

.a

动态库

.framework

.dylib

在Xcode 8里面,看到后缀为.tbd的库,它的本质都是.dylib文件

.framework


2.静态库和动态库在使用上的区别


静态库


链接时,静态库会被完整的复制到可执行文件中,被多次使用就有多份冗余拷贝


动态库


链接时不复制,程序运行时由系统动态的加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存


二.静态库.a的应用场景


制作SDK - 软件开发工具包(Software Development Kit)


如"百度地图",它想让开发者在应用程序中集成百度地图,但是百度又不想公布自己的技术实现,那怎么办?


百度将自己的核心代码编译成静态库,对外暴露统一的接口,开发者集成静态库,并且调用静态库即可集成

公司在开发项目时的核心代码


公司一般在开发一个项目时,肯定有一部分代码是核心代码


如果任何人都可以拿到这个核心代码,那么一旦有人离职,公司的核心代码就会被泄漏,那么该如何防止这种情况的发生?


公司一般都会抽出一部分核心团队成员,专门开发这部分核心代码,开发完成后,将核心代码编译成静态库给其他的程序员调用,核心成员一般很少会离职的,从而非核心成员即使离职也无法带走公司的核心代码


1.如何创建.a静态库?


1.创建工程,选择Cocoa Touch Static Library创建.a静态库


微信图片_20221017173459.png


注意


它只支持OC,不支持swift


2.创建项目,例如创建一个数学工具类CreatA


CreatA.h文件


微信图片_20221017173506.png

CreatA.m文件


微信图片_20221017173511.png


3.把CreatA编译成.a静态库


实际上就是把.m文件编译成.a静态库


头文件(.h)我们要暴露出去


cmd + B编译一下,得到.a文件如下图所示-编译之后


微信图片_20221017173514.png


右键Show in Finder,这时我们会在文件夹内发现一个.a文件,但是光有.a文件还不行,还需要把头文件暴露出去,否则别人拿到是无法使用的:


微信图片_20221017173517.png


如果已经有了就无需再添加了。


4.设置适配静态库CPU架构


show in findow到指定文件目录


微信图片_20221017173522.png


模拟器编译:小于或等于iphone5是 i386 iphone5s-iphonex是arm64。编译一下cmd+b,会重新打包.a文件.编译成功会生成如上图Debug-iphonesimulator


真机编译:我是用iphone6编译 是x86_64 cmd+b,编译成功会生成如上图Debug-iphoneos

检查静态库的CPU架构支持命令:lipo -info xxxxx.a


找出不支持arm64的静态库 :


find . -name *.a -exec lipo -info "{}" \;


微信图片_20221017173526.png


Debug设为No,重新编译


合并模拟器.a和真机.a


lipo -create 目标地址/模拟器.a  目标地址/真机.a -output 目标地址/最终.a


微信图片_20221017173530.png


5.文件整理


创建一个文件夹将所有.h文件和.a包copy进去。直接将文件夹导入项目工程中就可以使用了


三.资源库.Bundle的应用场景


什么是Bundle文件?


简单理解,就是资源文件包。我们将许多图片、XIB、文本文件组织在一起,打包成一个Bundle文件。方便在其他项目中引用包内的资源。


Bundle文件的特点?


Bundle是静态的,也就是说,我们包含到包中的资源文件作为一个资源包是不参加项目编译的。也就意味着,bundle包中不能包含可执行的文件。它仅仅是作为资源,被解析成为特定的2进制数据。


1.先删除info.plist文件和上层文件夹


微信图片_20221017173534.png


2.设置项目版本类型


微信图片_20221017173537.png


3.移除plist路径


微信图片_20221017173541.png


4.导入图片或文件

导入方式1


微信图片_20221017173545.png


导入方式2 直接拖拽文件到项目


5..bundle的使用


直接导入项目工程中


使用方法1

 

UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];
imageView.image = [UIImage imageNamed:@"CreatBundle.bundle/pet_08.BIG_01.png"];
[self.viewaddSubview:imageView];

使用方法2


NSString* bundlePath = [[NSBundlemainBundle]pathForResource: @"MyBundle"ofType:@"bundle"];
NSBundle*resourceBundle = [NSBundle bundleWithPath:bundlePath];
UIViewController*vc = [[UIViewController alloc]initWithNibName:@"vc_name"bundle:resourceBundle];//xib文件
或者
UIImageView*imgView=[[UIImageView alloc]initWithFrame:CGRectMake(50,50,50,50)];
NSString*imgPath= [bundlePath stringByAppendingPathComponent:@"img_collect_success.png"];
UIImage*image_1=[UIImage imageWithContentsOfFile:imgPath];
[imgView setImage:image_1];

或者预编译


#define MYBUNDLE_NAME @"MyBundle.bundle"
#define MYBUNDLE_PATH [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent: MYBUNDLE_NAME]
#define MYBUNDLE [NSBundle bundleWithPath: MYBUNDLE_PATH]

四.动态库.frameworks的应用场景


1.先创建一个项目,选择Cocoa touch Framework,点击下一步


微信图片_20221017173548.png


2.设置下build setting


微信图片_20221017173551.png


3.在项目文件夹中导入工程文件


微信图片_20221017173556.png


4.在build phase-headers中设置权限


微信图片_20221017173559.png


5.接下来的编译模拟器真机和.a文件是一样的


微信图片_20221017173603.png


合并模拟器CreatFramework和真机CreatFramework


lipo -create 目标地址/CreatFramework  目标地址/CreatFramework -output 目标地址/CreatFramework

合并之后就替换掉真机的CreatFramework


微信图片_20221017173607.png


最后将真机中的framework导入对应的工程中

微信图片_20221017173611.png


设置路径


微信图片_20221017173615.png


解压静态库.a文件


file xxx.a

这个指令可以看到xxx.a库包含哪几种arch


例如


$file libtesta.a libtesta.a: Mach-O universal binary with 2 architectureslibtesta.a (forarchitecture armv7): current ar archive random librarylibtesta.a (forarchitecture arm64): current ar archive random library


可以看到静态库覆盖了两个target,分别是armv7和arm64。


使用lipo指令可以对静态库进行拆分


$lipo libtesta.a -thin arm64 -output 64.a


意思是将静态库中arm64分离输出为64.a(64.a可以是随意的名字)

$ar -x 64.a


使用ar -x指令输出静态库中包含的.o文件

nm testa.o > testa.m


再使用nm指令将.o输出为.m文件

现在就可以去查看.m文件啦。

相关文章
|
1月前
|
iOS开发 开发者 MacOS
在线创建ios打包证书无需mac
这个文件并不一定需要使用mac OS去创建,在苹果开发者中心,生成了cer格式的证书后,导出p12证书这个过程,其实也并不一定需要mac电脑来完成。
23 0
|
3月前
|
图形学 数据安全/隐私保护 iOS开发
Unity与IOS⭐Xcode打包,上架TestFlight的完整教程
Unity与IOS⭐Xcode打包,上架TestFlight的完整教程
|
4月前
|
Android开发 iOS开发 开发者
ios应用打包、安装和上架攻略
假如是普通的证书或普通company证书只能上架才能安装(测试的话有其他安装方法,那是另外的话题),假如是企业类型的in house证书,则可以通过在线安装的方式,比如通过上传到一些分发平台,比如香蕉云编或蒲公英生成安装码扫码安装。
73 2
|
3月前
|
开发框架 监控 iOS开发
Flutter IOS 打包上架踩坑
Flutter IOS 打包上架踩坑
109 0
|
6月前
|
iOS开发
iOS使用.framework类型的静态库
iOS使用.framework类型的静态库
44 1
|
6月前
|
开发工具 iOS开发
iOS制作.framework静态库
iOS制作.framework静态库
60 1
|
6月前
|
前端开发 JavaScript 程序员
HBuilderX使用mac打包ios应用提示苹果根证书没有安装
HBuilderX使用mac打包ios应用提示苹果根证书没有安装
137 0
|
6月前
|
开发工具 iOS开发 Perl
iOS使用SDK静态库
iOS使用SDK静态库
54 0
|
7天前
|
安全 数据处理 Swift
深入探索iOS开发中的Swift语言特性
本文旨在为开发者提供对Swift语言在iOS平台开发的深度理解,涵盖从基础语法到高级特性的全面分析。通过具体案例和代码示例,揭示Swift如何简化编程过程、提高代码效率,并促进iOS应用的创新。文章不仅适合初学者作为入门指南,也适合有经验的开发者深化对Swift语言的认识。
25 9