普段デバッグ時などは気にならないのですが、ipaファイルを生成する(アーカイブする)と、とても時間がかかって困ります。「bitrise.ioでiOSアプリのビルド速度を高速化したい!」という気持ちで、昨晩から cocoapods-binary の評価をしています。
Carthageへ切り替え可能なライブラリに関しては、基本的にCarthageを使うことで劇的にビルド速度を高速化することができました。bitriseに限ったことではありませんが、CIサービス上でiOSアプリのビルド速度を高速化したいのであれば、現時点では Carthage を使うのが簡単で効果的です。
キャッシュが効いた状態でもApp Store Connectへのipaファイルのアップロードを含めてビルドに18分かかっているので、もう少し早めたいという気持ちが出てきました。
現在はビルドに18分かかっている
現状は下記の通りで、App Store Connectへのアップロードも含めて約18分かかっています。xcode-archive
に12分かかっているので、1回のビルドに占める時間の大半はここが原因なので、少しでも削りたいと考えています。
cocoapods-binaryの導入
pod install
を実行する前に、gem install cocoapods-binary
でインストールを済ませておきます。 bitriseにインストールしたい時には CocoaPodsの処理前にスクリプトを実行します。だいたい10秒くらいでインストールができます。
- script@1.1.6: title: Install cocoapods-binary inputs: - content: |- #!/usr/bin/env bash gem install cocoapods-binary
Podfileの書き方
cocoapods-binary導入後の Podfileの書き方は、「GitHub - leavez/cocoapods-binary: integrate pods in form of prebuilt frameworks conveniently, reducing compile time」 の通りで、 plugin 'cocoapods-binary'
と宣言しておいて、バイナリ化したいライブラリに :binary => true
の記述を足すだけです。
僕のアプリですと下記のようなPodfileになります。
plugin 'cocoapods-binary' # Uncomment the next line to define a global platform for your project source 'https://cdn.cocoapods.org/' platform :ios, '12.0' enable_bitcode_for_prebuilt_frameworks! keep_source_code_for_prebuilt_frameworks! target 'ptcgnote' do # Comment the next line if you're not using Swift and don't want to use dynamic frameworks use_frameworks! # Pods for ptcgnote pod 'Dollar', :binary => true pod 'CropViewController', :binary => true pod 'UIDeviceIdentifier', :binary => true pod 'NYTPhotoViewer', :binary => true pod 'R.swift' pod 'LicensePlist' pod 'Kanna', :binary => true pod 'DragDropiOS', :binary => true pod 'FloatingPanel', :binary => true # Firebase pod 'Firebase/Core' pod 'Firebase/Auth' pod 'Firebase/Performance' pod 'Fabric', '~> 1.10.1' pod 'Crashlytics', '~> 3.13.1' pod 'Google-Mobile-Ads-SDK' end
Firebase関係のライブラリを :binary => true
設定にしたところ pod install
でのプリビルドには成功しますが、Xcodeでのアーカイブ時にリンカエラーが発生してしまいアーカイブに失敗になりました。上記のPodfileで Firebase関係のライブラリがバイナリ化から除外されているのはそのような理由からです。
導入後のビルド時間が16分になった!
残念ながらFirebase関係のライブラリを cocoapods-binary を使ってバイナリ化することはできませんでしたが、Podfile経由でインストールしているライブラリを半分くらいバイナリ化することで約2分短縮することができました!💪
cocoapods-binaryの気になる点
Podsディレクトリのキャッシュが怪しい感じです。
たとえば Podfileから pod 'FOO'
を削除してから pod install
した場合、Podsディレクトリを一旦削除しないとなぜかビルドに通らなくなってしまいます。開発中の頻繁にライブラリを追加削除している段階であればトラブルになりそうです。
bitriseであれば、各アプリの設定ページの「Manage Build Caches (BETA)」でキャッシュを削除することができます。
さらに 一番バイナリ化したいFirebase関連のライブラリが cocoapods-binary の対象とできませんでした。