全面了解 iOS 靜態庫開發

jopen 9年前發布 | 9K 次閱讀 IOS iOS開發 移動開發
 

全面了解 iOS 靜態庫開發

作者: 漢斯哈哈哈 授權本站轉載。

簡介

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

靜態庫和動態庫的存在形式

  • 靜態庫:.a 和 .framework

  • 動態庫:.dylib 和 .framework

靜態庫和動態庫的區別

  • 靜態庫:鏈接時,靜態庫會被完整地復制到可執行文件中,被多次使用就有多份冗余拷貝

  • 動態庫:鏈接時不復制,程序運行時由系統動態加載到內存,供程序調用,系統只加載一次,多個程序共用,節省內存

注意:項目中如果使用了動態庫,會蘋果拒接

靜態庫文件的版本(4種)

  • 真機-Debug版本

  • 真機-Release版本

  • 模擬器-Debug版本

  • 模擬器-Release版本

Debug(調試)版本

  1. 含完整的符號信息,以方便調試

  2. 不會對代碼進行優化

Release(發布)版本

  1. 不會包含完整的符號信息

  2. 的執行代碼是進行過優化的

  3. 的大小會比Debug版本的略小

  4. 在執行速度方面,Release版本會更快些(但不意味著會有顯著的提升)

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

設備的CPU架構簡介(補充知識)

模擬器:

  • 4s~5 : i386

  • 5s~6plus : x86_64

真機:

  • 3gs~4s : armv7

  • 5~5c : armv7s (靜態庫只要支持了armv7,就可以跑在armv7s的架構上)

  • 5s~6plus : arm64

制作靜態庫 - Debug版

1.新建項目

2.添加靜態庫并命名

全面了解 iOS 靜態庫開發

全面了解 iOS 靜態庫開發

3.需要打包到進靜態庫的代碼,放在這個文件夾內

全面了解 iOS 靜態庫開發

4.重新創建測試類(HSCalculate),提供外界計算兩個數和的方法

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.需要暴露給外界的文件(接口)

全面了解 iOS 靜態庫開發

6.打包支持模擬器和真機的靜態庫(分別選擇真機和模擬器運行,就會生成對應的靜態庫)

全面了解 iOS 靜態庫開發

7.查看打包好的靜態庫

全面了解 iOS 靜態庫開發

兩個文件夾,里面的.a文件就是打包好的靜態庫

  • Debug-iphoneos : 真機

  • Debug-iphonesimulator:模擬器

可用下面命令查看靜態庫支持的cpu架構(可查看上面描述的cpu架構類型)

lipo -info xxx.a

分別查看打包好的模擬器與真機的靜態庫所支持的cpu架構

全面了解 iOS 靜態庫開發

你會發現模擬器的靜態庫少了4s~5 : i386架構

原因:

下面Debug:Yes表示只編譯選中模擬器對應的架構,No則為編譯所有模擬器支持的cup架構(Debug的Yes狀態改為No即可)

全面了解 iOS 靜態庫開發

修改完后,重新編譯:

8.在本項目對該靜態庫進行調試,ViewController.m導入HSCalculate.h,測試運行,你會發現報錯了

#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

報錯:

全面了解 iOS 靜態庫開發

原因:

需要導入靜態庫(編譯即可運行成功)

全面了解 iOS 靜態庫開發

9.同時支持真機與模擬器的靜態庫(需要合并)

真機和模擬器的靜態庫,是不一樣的,不能同時適用在真機和模擬器上,但要滿足這要求的話,要對編譯好的兩個靜態庫進行合并

合并好壞:

  • 好:開發過程中既可以在真機上調試,也可以在模擬器上調試

  • 壞:如果靜態庫太大,合并打包后,會非常大,因此很多第三方的靜態庫的.a是區分版本的

合并產生新的靜態庫:

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

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

全面了解 iOS 靜態庫開發

新建工程測試:

全面了解 iOS 靜態庫開發

制作靜態庫 - Release版

跟Debug版步驟一樣,只不過在編譯時,改下面的選項即可

全面了解 iOS 靜態庫開發

全面了解 iOS 靜態庫開發

制作靜態庫 - .framework版

步驟跟制作.a靜態庫,基本一致,但要注意的下面幾點:

1.選擇framework

全面了解 iOS 靜態庫開發

2.編譯時,默認制作成動態庫,要在下面選擇

全面了解 iOS 靜態庫開發

3.合并靜態庫時,是選.framework文件里的libstaticlib文件

全面了解 iOS 靜態庫開發

合并:

全面了解 iOS 靜態庫開發

刪除libstaticlib,libCalculateTool拉入libstaticlib.framework項目中,libstaticlib.framework靜態庫制作完成

全面了解 iOS 靜態庫開發

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!