今回は、Swift で使用されるライブラリの形式について調べたことをまとめていきたいと思います。
ライブラリの種類
今回は、ライブラリという言葉で Framework
と Library
をまとめていますが、両者には違いがあるのでご注意ください。それでは、それぞれの形式について簡単に見ていきましょう。
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
参考
- https://dev.classmethod.jp/articles/iosdc2019-report-library-link-import/
- https://www.youtube.com/watch?v=FZoYyAEPJ8w
- https://medium.com/eureka-engineering/create-merged-framework-to-cut-appstartuptime-72ee67b2bbab
- https://qiita.com/tasuwo/items/be8188c3645801a00252
- https://qiita.com/rockname/items/bdf932bc6758d8820141