25
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

iOSアプリ開発用パッケージマネージャーごとのStatic/Dynamicリンク設定とカスタマイズおよび各種調査方法

Last updated at Posted at 2021-10-10

はじめに

iOSアプリ開発のためのパッケージマネージャー別のリンク指定を整理しておきます。

勘違いしやすいポイントとしては、Carthageを使ってもデフォルトでdynamicリンクなのでstaticリンクするよりもアプリ起動は遅くなります。つまりCarthageを使って事前にビルドしておくことで都度のビルド時間を短縮しても、何もしないとアプリ起動が遅くなるわけです。その他、ちょっとややこしい話ですが、CocoaPodsではuse_frameworks!にするとdynamicリンクなフレームワークになりますが、これはstaticリンクにすることもできます。

この記事では、自分のアプリでどのように設定するかのプラクティスではなく、それぞれのパッケージマネージャーのデフォルトがどうなっていて、設定でそれを変える方法とビルドされたライブラリ/フレームワークが本当に意図通りになってるか確認する方法について書いておきます。

StaticやDynamicとはなにかということについてはiOSアプリ開発のための外部ライブラリのリンクの種類や配布/利用方法として別にまとめています。

私自身が勘違いしている可能性も高いし、もっといいまとめ方もあるかもしれないのでそれはそれでコメントか別にアウトプットしてもらえれば助かります。

パッケージマネージャー別のリンク

概要

CocoaPodsでのstatic/dynamicリンクを混在させる

Pods v1.9.0からターゲットごとにフレームワークをstaticにできるようになりました。

以下は実例。

source 'https://cdn.cocoapods.org/'

target :DynamicTarget do
    use_frameworks! :linkage => :dynamic
    
    pod 'DynamicPod' # This will be linked dynamically
end

target :StaticTarget do
    use_frameworks! :linkage => :static

    pod 'StaticPod' # This will be linked statically
end

参考

ライブラリが指定のリンク形式かを調べる

  • otoolでアプリのバイナリから調べる
    • otool
  • ビルドされたライブラリから調べる
    • file

otoolでビルドされたアプリのバイナリからDynamic Linkしているファイルを調べる

$ otool -L DerivedData/実行アプリバイナリ

fileコマンドで確認する

$ file ./Carthage/Build/iOS/ReactiveCocoa.framework/ReactiveCocoa
  • staticリンクになってれば
    • current ar archive
  • dynamicリンク
    • Mach-O dynamically linked shared library

アプリの起動時間を計測する

  • DYLD_PRINT_STATISTICS
    • (Xcode 13からは使えなくなった)
  • Instruments

DYLD_PRINT_STATISTICSで起動時の時間表示

(DYLD_PRINT_STATISTICSはXcode 13から使えなくなりました)

ライブラリ/フレームワークによってはめちゃくちゃ遅いのがstaticリンクにすることでかなり起動速度が改善したりもしますが、どのDynamicリンクが遅いのがわかる方法もあります。

Xcodeのスキーマ設定のあたりから、Environment VariablesにてDYLD_PRINT_STATISTICSに1かYESを設定してビルド後にアプリ起動すると、Xcodeのコンソールにdynamicリンク時間を計測して下記のような表示がされます。

Total pre-main time: <ここがトータル> milliseconds (100.0%)
         dylib loading time: 188.92 milliseconds (38.6%)
        rebase/binding time: 141.32 milliseconds (28.9%)
            ObjC setup time:   9.88 milliseconds (2.0%)
           initializer time: 148.68 milliseconds (30.4%)
           slowest intializers :
             libSystem.B.dylib :   3.18 milliseconds (0.6%)
    libMainThreadChecker.dylib :  42.47 milliseconds (8.6%)
                HogeHogeSample :  69.27 milliseconds (14.1%)
                          ... :  23.87 milliseconds (4.8%)
...

例えば上記だとHogeHogeSampleというのがが遅いことがわかります。

XcodeのInstrumentsを使う

  • 注意点
    • 実機でないとWWDC19のApp Lifecycleは測定されません
    • dynamicリンクを調べようとしてもUnknownになって項目名が見えないプロジェクトもある

スクリーンショット 2021-10-10 18.12.04.png

ついでにInstrumentsのみかた

スクリーンショット 2022-04-11 13.08.22.png

スクリーンショット 2022-04-11 13.08.28.png

スクリーンショット 2022-04-11 13.08.31.png

スクリーンショット 2022-04-11 13.08.34.png

スクリーンショット 2022-04-11 13.08.39.png

スクリーンショット 2022-04-11 13.08.52.png

スクリーンショット 2022-04-11 13.08.46.png

25
23
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
25
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?