Xcodeのビルド時間を改善するために足掻いてみた話(PodBuilder)

# はじめに

「build待ちです」

エンジニアとしてキャリアをスタートさせてから2ヶ月。一番発している言葉かもしれません。
一日の中でビルドを待つ時間が長すぎるのをなんとかしたいので、足掻いてみようと思いました。

## やりたいこと

クリーンビルドの時間を１秒でも早くしたい

## 環境

M1 MacbookAir 8GB
macOS Big Sur(11.6.2)
Xcode 13.1
Swift 5.5.1
自社サービス「 [sportsbull](URL "https://apps.apple.com/jp/app/%E3%82%B9%E3%83%9D%E3%83%BC%E3%83%84%E3%83%96%E3%83%AB-%E3%82%B9%E3%83%9D%E3%83%96%E3%83%AB/id1086719653") 」

## 現状を調べる

以下のサイトに処理が遅くなる関数を計測する方法が載っていました。

https://developers.wonderpla.net/entry/2021/10/27/110034

以下のコマンド打つだけで合計時間は出るようです。

```
defaults write com.apple.dt.Xcode ShowBuildOperationDuration YES
```


とりあえず計測！ 結果は...

![スクリーンショット 2022-06-03 4.03.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1441550/07abcd13-e3e5-c9af-71cb-89d5bb21801a.png)

なんと8分近くもかかってました。毎回これはやばい。

かかっている時間がまずいことはわかったものの、何をしていいのかわからないので、
とりあえず調べて当たりをつけてみることにしました。
その中で、効果がありそうなPodBuilderを試してみました。

## PodBuilderとは

CocoaPods経由で導入したライブラリを事前にFrameworkに事前構築して、
クリーンビルドするたびに発生するライブラリのビルド時間を短縮することができるようです。

https://github.com/Subito-it/PodBuilder

## 導入

#### 必要ver
Ruby2.6.3以降
Cocoapods1.9.0以降

#### インストール

```
$ sudo gem install pod-builder
```

#### プロジェクトの初期化

```
$ cd (リポジトリ);
$ pod_builder init
```

これでPodBuilderファイルができました。

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f313434313535302f62613761336231362d653331382d643634342d386334362d3263643664333538323065302e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1441550/7e40544d-fd29-ad4b-8ff8-cbd679472b98.png)


## 実際に使ってみた

すべてのライブラリを指定するわけにもいかないので、ビルドログ上で結構目立っていた
"YouTubePlayer"と"youtube-ios-player-helper-swift"を対象にしてみます。
(ログ上はこの2つだけで20sec近くかかっていた)


```
$ pod_builder build YouTubePlayer youtube-ios-player-helper-swift
```

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f313434313535302f62613761336231362d653331382d643634342d386334362d3263643664333538323065302e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1441550/d40b7904-f23c-f631-fb4e-3427be383097.png)


実行すると、PodBuilderのPrebuiltフォルダに2つのライブラリをインストールしてくれました。

```Podfile.
pod 'youtube-ios-player-helper-swift', :path => 'PodBuilder/Prebuilt/youtube-ios-player-helper-swift' # pb<youtube-ios-player-helper-swift>
pod 'YouTubePlayer', :path => 'PodBuilder/Prebuilt/YouTubePlayer' # pb<YouTubePlayer>
```

Podfileもpathが自動で追記されています。
これでビルドしてみると...

![スクリーンショット 2022-06-03 3.47.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1441550/be998c1e-97d6-232d-7fb7-df63869b3cb9.png)


80秒くらい早くなりました！
20秒早くなる想定だったのですが、思った以上に効果ありました。

## 所感

めちゃくちゃ簡単にできて効果もあるので、いわゆるオープンソースのSDKに対しては
どんどん使用してもいいのかなと感じました。
懸念点としては、制限等がドキュメントにも記載がなかったため不明な点です。
また、どういうロジックで80secも早くなったのかがわかってないので、
この辺りも今後調べていきたいなと思っています。
（このSDKを参照している部分のコンパイルも早くなる？...etc）

## おまけ

PodBuilderを使ってみた感想記事になってますが、
あくまで今回のタイトルは"ビルド時間の改善"です。
他にやったことですが、ビルドした時に時間がかかった関数を
出力できるツールがありました。

https://github.com/giginet/xcprofiler

ビルドに50msec以上時間がかかっている関数を洗い出したところ、

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f313434313535302f39653265656635392d303038612d626132662d373566382d3633396263613730653430322e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1441550/ce190d7c-95b9-a320-5e98-218db81e0986.png)


大量にありました。
ここもリファクタしていけば早くなりそうな気がしますが、
今の所効果を得る方法がわかっていないので
追々触っていけたらなと思っています。