Library
概要
拡張子は .dylib であり、他のプラットフォームでは DSO, DLL などとして知られる。
Text-based .dylib stub
UIKit や Foundation 等のシステムライブラリをアプリケーションに含めてしまうと、サイズが大きくなりすぎてしまうのでできるだけ避けたい。リンカーも同様で、共有の .dylib ライブラリをリンクするのではなく、.tbd という拡張子のファイルのみをリンクするようになっている。 テキストベースの .dylib スタブ、あるいは .tbd とは、Dynamic Library のメソッド名を含んだテキストファイルである。利用する Dynamic Library のメソッド名に加え、アーキテクチャやプラットフォーム等のメタデータのみを含んでおり、.dylib ファイルそれ自体よりもかなり小さい容量ですむ。 各々のメリット, デメリットは以下のようになる。
table:vs
アプリサイズ 起動時間 Library関数のロード ライブラリの更新
Static Library 大きい ❌ 遅い ❌ 早い ⭕ 再コンパイルが必要 ❌, アプリ側で追従が不要 ⭕
Dynamic Library 小さい ⭕ 早い ⭕ 遅い ❌ 再コンパイルが必要ない ⭕, アプリ側で追従が必要 ❌
ライブラリの更新については、Static Library は固定バージョンで利用し続けることになるので、ライブラリの更新を行うためには再コンパイルが必要だが、ライブラリの更新によってアプリが壊れることがなく、利用しているライブラリのバージョンも固定できるというメリットがある。Dynamic Library はライブラリの更新にアプリを再コンパイルしなくても追従できるが、ライブラリ側の問題でアプリに問題が生じる可能性もある。 Tips: Support Tools
例えば、適当な iOS プロジェクトから生成されたオブジェクトファイルに対して利用してみる。例えば、Xcode のシミュレータ用のビルド成果物は Users/<ユーザ名>/Library/Developer/Xcode/DerivedData/<プロジェクト名>-<識別子>/Build/Products/Debug-iphonesimulator 以下に存在する。そこに各 Framework やアプリ自身のビルド結果がある。アプリ自身のビルド結果に対し、otool を下記のように利用すると、動的リンクされる Dynamic Library の一覧を表示できる。Foundation や UIKit が Dynamic Library としてリンクされることがわかる。 code:shell
$ otool -L MyApp.app/MyApp
MyApp.app/MyApp:
/System/Library/Frameworks/Foundation.framework/Foundation (compatibility version 300.0.0, current version 1665.15.0)
/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1281.0.0)
/System/Library/Frameworks/UIKit.framework/UIKit (compatibility version 1.0.0, current version 61000.0.0)
/usr/lib/swift/libswiftCore.dylib (compatibility version 1.0.0, current version 1100.2.255)
/usr/lib/swift/libswiftFoundation.dylib (compatibility version 1.0.0, current version 0.0.0)
/usr/lib/swift/libswiftObjectiveC.dylib (compatibility version 1.0.0, current version 0.0.0)
file コマンドを利用すると、そのファイル自体が Dynamic Library であるか、実行可能なオブジェクトファイルであるかなどがわかる。例えば、アプリ自体に以下のように使用すると、アプリが Mach-O フォーマットの実行可能形式のファイルにコンパイルされていることがわかる。 code:shell
$ file MyApp.app/MyApp
MyApp.app/MyApp: Mach-O 64-bit executable x86_64
code:sh
# Static Library としてリンクする場合
$ file RxCocoa/RxCocoa.framework/RxCocoa
RxCocoa/RxCocoa.framework/RxCocoa: current ar archive
# Dynamic Library としてリンクする場合
$ file RxCocoa/RxCocoa.framework/RxCocoa
RxCocoa/RxCocoa.framework/RxCocoa: Mach-O 64-bit dynamically linked shared library x86_64
参考