iOS 靜態(tài)庫(kù)開發(fā)

簡(jiǎn)介

在企業(yè)開發(fā)中,一些核心技術(shù)或者常用框架,出于安全性和穩(wěn)定性的考慮,不想被外界知道,所以會(huì)把核心代碼打包成靜態(tài)庫(kù),只暴露頭文件給程序員使用(比如:友盟、百度地圖等第三方的sdk)

靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)的存在形式

靜態(tài)庫(kù):.a 和 .framework
動(dòng)態(tài)庫(kù):.dylib 和 .framework

靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)的區(qū)別

靜態(tài)庫(kù):鏈接時(shí),靜態(tài)庫(kù)會(huì)被完整地復(fù)制到可執(zhí)行文件中,被多次使用就有多份冗余拷貝
動(dòng)態(tài)庫(kù):鏈接時(shí)不復(fù)制,程序運(yùn)行時(shí)由系統(tǒng)動(dòng)態(tài)加載到內(nèi)存,供程序調(diào)用,系統(tǒng)只加載一次,多個(gè)程序共用,節(jié)省內(nèi)存

注意:項(xiàng)目中如果使用了動(dòng)態(tài)庫(kù),會(huì)蘋果拒接

靜態(tài)庫(kù)文件的版本(4種)

  • 真機(jī)-Debug版本
  • 真機(jī)-Release版本
  • 模擬器-Debug版本
  • 模擬器-Release版本

Debug(調(diào)試)版本

1.含完整的符號(hào)信息,以方便調(diào)試
2.不會(huì)對(duì)代碼進(jìn)行優(yōu)化

Release(發(fā)布)版本

1.不會(huì)包含完整的符號(hào)信息
2.的執(zhí)行代碼是進(jìn)行過優(yōu)化的
3.的大小會(huì)比Debug版本的略小
4.在執(zhí)行速度方面,Release版本會(huì)更快些(但不意味著會(huì)有顯著的提升)

所以我們一般開發(fā)中都打包Release(發(fā)布)版本,提供外界

設(shè)備的CPU架構(gòu)簡(jiǎn)介(補(bǔ)充知識(shí))

模擬器:

4s~5 : i386
5s~6plus : x86_64

真機(jī):

3gs~4s : armv7
5~5c : armv7s (靜態(tài)庫(kù)只要支持了armv7,就可以跑在armv7s的架構(gòu)上)
5s~6plus : arm64

制作靜態(tài)庫(kù) - Debug版

1.新建項(xiàng)目
2.添加靜態(tài)庫(kù)并命名

3.需要打包到進(jìn)靜態(tài)庫(kù)的代碼,放在這個(gè)文件夾內(nèi)

4.重新創(chuàng)建測(cè)試類(HSCalculate),提供外界計(jì)算兩個(gè)數(shù)和的方法

HSCalculate.h

@interface HSCalculate : NSObject
+ (NSInteger)sumNum1:(NSInteger)num1 num2:(NSInteger)num2;
@end

HSCalculate.m

#import "HSCalculate.h"

@implementation HSCalculate

+ (NSInteger)sumWithNum1:(NSInteger)num1 num2:(NSInteger)num2
{
    return num1 + num2;
}

@end

5.需要暴露給外界的文件(接口)

6.打包支持模擬器和真機(jī)的靜態(tài)庫(kù)(分別選擇真機(jī)和模擬器運(yùn)行,就會(huì)生成對(duì)應(yīng)的靜態(tài)庫(kù))

7.查看打包好的靜態(tài)庫(kù)

兩個(gè)文件夾,里面的.a文件就是打包好的靜態(tài)庫(kù)

Debug-iphoneos : 真機(jī)
Debug-iphonesimulator:模擬器

可用下面命令查看靜態(tài)庫(kù)支持的cpu架構(gòu)(可查看上面描述的cpu架構(gòu)類型)

lipo -info xxx.a

分別查看打包好的模擬器與真機(jī)的靜態(tài)庫(kù)所支持的cpu架構(gòu)

你會(huì)發(fā)現(xiàn)模擬器的靜態(tài)庫(kù)少了4s~5 : i386架構(gòu)

原因:

下面Debug:Yes表示只編譯選中模擬器對(duì)應(yīng)的架構(gòu),No則為編譯所有模擬器支持的cup架構(gòu)(Debug的Yes狀態(tài)改為No即可)

修改完后,重新編譯:

8.在本項(xiàng)目對(duì)該靜態(tài)庫(kù)進(jìn)行調(diào)試,ViewController.m導(dǎo)入HSCalculate.h,測(cè)試運(yùn)行,你會(huì)發(fā)現(xiàn)報(bào)錯(cuò)了

#import "ViewController.h"
#import "HSCalculate.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    NSInteger result = [HSCalculate sumWithNum1:23 num2:25];
    NSLog(@"result: %d", result);
}

@end

報(bào)錯(cuò):

原因:

需要導(dǎo)入靜態(tài)庫(kù)(編譯即可運(yùn)行成功)

9.同時(shí)支持真機(jī)與模擬器的靜態(tài)庫(kù)(需要合并)

真機(jī)和模擬器的靜態(tài)庫(kù),是不一樣的,不能同時(shí)適用在真機(jī)和模擬器上,但要滿足這要求的話,要對(duì)編譯好的兩個(gè)靜態(tài)庫(kù)進(jìn)行合并

合并好壞:

好:開發(fā)過程中既可以在真機(jī)上調(diào)試,也可以在模擬器上調(diào)試
壞:如果靜態(tài)庫(kù)太大,合并打包后,會(huì)非常大,因此很多第三方的靜態(tài)庫(kù)的.a是區(qū)分版本的

合并產(chǎn)生新的靜態(tài)庫(kù):

lipo -create Debug-iphoneos/xxx.a Debug-iphonesimulator/xxx.a -output xxx.a

10.把合并好的靜態(tài)庫(kù)和外界訪問的文件拉入到新工程,即可使用(inc文件自己建立的)

Snip20150830_26.png

新建工程測(cè)試:

Snip20150830_28.png

制作靜態(tài)庫(kù) - Release版

跟Debug版步驟一樣,只不過在編譯時(shí),改下面的選項(xiàng)即可


制作靜態(tài)庫(kù) - .framework版

步驟跟制作.a靜態(tài)庫(kù),基本一致,但要注意的下面幾點(diǎn):

1.選擇framework

Snip20150830_32.png

2.編譯時(shí),默認(rèn)制作成動(dòng)態(tài)庫(kù),要在下面選擇

Snip20150830_33.png

3.合并靜態(tài)庫(kù)時(shí),是選.framework文件里的libstaticlib文件


合并:


刪除libstaticliblibCalculateTool拉入libstaticlib.framework項(xiàng)目中,libstaticlib.framework靜態(tài)庫(kù)制作完成

文章同步到微信公眾號(hào):hans_iOS 有疑問可以在公眾號(hào)里直接發(fā)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容