iOSエンジニアのつぶやき

毎朝8:30に iOS 関連の技術について1つぶやいています。まれに釣りについてつぶやく可能性があります。

Static Library vs Dynamic Library

今回は、Swift で使用されるライブラリの形式について調べたことをまとめていきたいと思います。

ライブラリの種類

今回は、ライブラリという言葉で FrameworkLibrary をまとめていますが、両者には違いがあるのでご注意ください。それでは、それぞれの形式について簡単に見ていきましょう。

Static Library(*.a)

コンパイル時にライブラリがリンクされ、実行可能ファイル自体にライブラリがコピーされます(ビルド時にはシンボルの解決がされる)。アプリケーションのサイズは増えますが、アプリの起動時間などを短縮することができます。

Dynamic Library(*.dylib)

ランタイム時に動的にライブラリがリンクされ(ビルド時にはシンボルの解決がされない)、実行可能ファイルにはライブラリがコピーされません。メリットとしては、アプリサイズが小さくなることや、アプリの更新をせずとも Dynamic Library の更新が可能なことです。

Framework(*.frmework)

iOS における Framework とライブラリとの大きな違いは、バンドルを保持していることです。

Bundle とは、ディスク上の Bundle ディレクトリにあるコードとリソースの保存領域のことで、Apple はこれを使用して、App、Framework、Plugin など多くのコンテンツを表現します。また、Bundle は含まれているリソースを明確に定義されたサブディレクトへと編成します。(例えば、Xcodeproject のファイルなどは一見するとファイルですが、実際はディレクトリ構造を持つ Bundle です。)

また、Framework は StaticLibrary を保持する StaticFramework と、DynamicLibrary を保持する DynamicLibrary に分けることができます。

Static or Dynamic?

file コマンドでライブラリの実行ファイルを指定してあげることで、framework が static・dynamic にリンクされるのを判断することができます。

下記の例だと、Framework は Dynamic にリンクされます。

$ file Instabug.framework/Instabug
Instabug.framework/Instabug: Mach-O universal binary with 4 architectures: [i386:Mach-O dynamically linked shared library i386] [x86_64] [arm_v7] [arm64]
Instabug.framework/Instabug (for architecture i386):    Mach-O dynamically linked shared library i386
Instabug.framework/Instabug (for architecture x86_64):  Mach-O 64-bit dynamically linked shared library x86_64
Instabug.framework/Instabug (for architecture armv7):   Mach-O dynamically linked shared library arm_v7
Instabug.framework/Instabug (for architecture arm64):   Mach-O 64-bit dynamically linked shared library arm64

参考

その他の記事

yamato8010.hatenablog.com

yamato8010.hatenablog.com

yamato8010.hatenablog.com