酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

Bitriseで iOSアプリのビルド速度を cocoapods-binary を使って高速化する

普段デバッグ時などは気にならないのですが、ipaファイルを生成する(アーカイブする)と、とても時間がかかって困ります。「bitrise.ioでiOSアプリのビルド速度を高速化したい!」という気持ちで、昨晩から cocoapods-binary の評価をしています。

github.com

Carthageへ切り替え可能なライブラリに関しては、基本的にCarthageを使うことで劇的にビルド速度を高速化することができました。bitriseに限ったことではありませんが、CIサービス上でiOSアプリのビルド速度を高速化したいのであれば、現時点では Carthage を使うのが簡単で効果的です。

キャッシュが効いた状態でもApp Store Connectへのipaファイルのアップロードを含めてビルドに18分かかっているので、もう少し早めたいという気持ちが出てきました。

現在はビルドに18分かかっている

現状は下記の通りで、App Store Connectへのアップロードも含めて約18分かかっています。xcode-archiveに12分かかっているので、1回のビルドに占める時間の大半はここが原因なので、少しでも削りたいと考えています。

f:id:ch3cooh393:20200429114951p:plain

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分短縮することができました!💪

f:id:ch3cooh393:20200429115036p:plain

cocoapods-binaryの気になる点

Podsディレクトリのキャッシュが怪しい感じです。

たとえば Podfileから pod 'FOO'を削除してから pod installした場合、Podsディレクトリを一旦削除しないとなぜかビルドに通らなくなってしまいます。開発中の頻繁にライブラリを追加削除している段階であればトラブルになりそうです。

bitriseであれば、各アプリの設定ページの「Manage Build Caches (BETA)」でキャッシュを削除することができます。

f:id:ch3cooh393:20200429113038p:plain

さらに 一番バイナリ化したいFirebase関連のライブラリが cocoapods-binary の対象とできませんでした。