iOS
Xcode9

ipaファイルのサイズが大きい…色々試してみた!

はじめに

初めてアプリを作りました!が、テーマの件で戸惑ったので備忘録として挙げておきます。
以下の環境で開発を行い、いざtestFlightにあげるぞ!というとこでした。
環境:Xcode9.3
言語:Swift4.1

ipaファイルを作ったらファイルサイズが100MB超え。。。

とっても簡素なアプリなのですが、何故かファイルサイズが巨大なことに。。
スクリーンショット 2018-04-19 19.40.51.png

調べてみた

まずはどのファイルが原因なのか調査してみました!

  1. Archiveしたファイルを開く
    Window -> Organizer で該当ファイルのあるフォルダを開く
    スクリーンショット 2018-04-20 10.57.51.png

  2. ファイルの中を見る
    スクリーンショット 2018-04-20 11.02.00.png

  3. .xarchiveの中はこんな感じ。
    明らかにApplicationsの中身が大きい。。これもパッケージの内容を見てみる!スクリーンショット 2018-04-20 11.05.21.png

  4. なんかframeworkがとても大きいぞ。。
    実行ファイルが6MB程度なのにframeworkだけで113MB。。
    しかも囲っているlibswiftCore.dyliblibswiftFoundation.dylibがとても大きい!これらは一体何なのか??
    スクリーンショット 2018-04-23 19.35.37.png

何でframeworkがここまで大きい?

なかなか調べても答えが見つからないため、質問してみました!

答え

Swiftを使っているから。
そもそもこれらはSwiftを動かすための必須ライブラリであり、Objective-Cで書かない限りは必ず内包されるものなのだそうです。(→参考: Swift と Objective-C どっち選ぶ?)
年々そのサイズが膨れ上がっているのはXcodeのバージョンが上がって機能が追加されているからなのでした。。
またiTunesConnectにアップロードされる際には各デバイスが必要なライブラリのみを取得するので、100MB等巨大なサイズになることはまず無いそうです。ひと安心です。。

色々試してみた!(もがいてみた)

ほぼ上記の答えが真でこれ以上何もできないような気がしたのですが、勉強も兼ねてサイズダウンする方法を調査してまとめてみました。

General周り

  1. 対応デバイスの確認
    今回はiPhoneのみの対応なので、以下のように設定しました!

    • Deployment Info → iPhone
      →元々設定していたので上記のサイズからは変わらず。。
  2. Embededded Binaries

    • ここに不要なバイナリが入るとipaのサイズに影響が出るらしいので確認!
      →何も入ってませんでした\(^o^)/よって変わらず。。

Build Setting 周り

Optimization Level

色んな部分で最適化できるみたいなので、こちらも導入してみました!

  • Apple LLVM 9.0 - Code Generation
    コードを生成する時の、最適化レベルを設定できます。

    • Optimization Level → Fastest, Smallest [-Os]
      →目に見えた効果は得られず。。
  • Swift Compiler - Code Generation
    Swiftのコンパイル方法を制御する部分みたいです。Sizeを減らすことを優先にした最適化にします。

    • Optimization Level → Optimize for Size [-Osize]
      → 約2.6MBダイエット! この時点では有効にしてたのですが、後々ちょっと厄介なことが起きました。(後述)
  • Asset Catalog Compiler - Options
    アセットのコンパイルを制御できるみたいです。

    • Optimization → space
      → 0.2MBダイエット成功! 画像がかなり入っていたので効果が得られたのかもしれません。

Deployment Postprocessing

デバッグ情報をビルド内に含めるか否かの設定です。(Noにすると情報を含んでくれるそうです。)

  • Deployment Postprocessing→ Yes
    →元々設定されていたので変化なし。

Symbols Hidden by Default

出力するシンボル情報を制限する機能です。(Yesにするとメソッドのシンボル名を隠すことができます。)

  • Symbols Hidden by Default→ Yes
    →目に見えた効果は得られず。。

Valid Architectures

ここではどのアーキテクチャを対象にビルドするかが書いてあります。(こちらの記事が参考になりました!)
本アプリの対応OSは9からのため、デフォルトはarmv7, armv7s, armv64でした。
この設定を試しに以下のようにしてみました!

  • armv7, armv7s, armv64 → armv64(iPhone5s以降の対応となる)
    → 1.4MBダイエット!

試しに設定を変えてアーカイブはしましたが、対応OSを変更する訳にはいかないため、この設定は却下しました。
(対応OSによっては有効策だと思います!)

Enable Bitcode

これはBitcodeを有効にするか否かの設定です。

Bitcodeとは?

公式ではこのように説明されています。→App Thinning(iOS、tvOS、watchOS)
書いてある通りですが、コンパイル済みプログラムの中間表現のことであり、この設定を有効にするとストア側で再コンパイルをするなどよしなに最適化をしてくれるというものです!
普通はONにするみたいですが、試しに変えてみました。

  • Enable Bitcode → No
    → 38.5MBダイエット!

かなり削減できました!それはそうでしょ…という感じですが、Apple側の最適化の恩恵が無くなるのは痛いのであまり有効策ではないように感じます。
ただ、プロジェクトに積んでいるライブラリによってはBitcodeに対応していない場合もあるので、その時は無効にしても良いのかもしれません。

Build Phases 周り

ここに不要なファイルが入っていると、容量を食い潰してしまうので、確認しました!

  • Link Binary With Libraries
    → 不要なライブラリは無いことを確認。
  • Copy Bundle Resources → 不要なリソースがあったため削除。(ここに何か入っていると、そもそもipaファイルが作成できませんでした。→参考

そもそもコード自身のダイエットが必要?

とは言うものの、元々が簡素なだけあって、あまり削る部分もなかったので、以下のことのみ対応しました。

不要なライブラリが無いか確認

意味もなくimportしているライブラリは無いか、確認しました!

  • 不要なライブラリを削除
    →目に見えた効果は得られず。。(コードの整理はできたので良しとします!)

log出力周りをコメントアウト

  • logをprint文で出力していたので、1つ1つコメントアウト。。
    →0.1MBダイエットできました!が、微々たるものと、あまり有効策では無いので却下することに。。

やったこと・確認したことまとめ

一覧にしてみるとこんな感じです。
(結果のところはあくまで私のコードの結果なので、参考程度にしてください。。)

種類 どの設定 やったこと 結果 適用したか?
General Embedded Binaries 不要なバイナリが無いか確認 なかった
General Deployment Info iPhone 元々設定されていた。。
Build Setting AppleLLVM9.0 Fastest, Smallest 元から設定されていた。。
Build Setting Asset Catalog Compiler Optimization Space 0.2MBダイエット!
Build Setting Swift Compiler - CodeGeneration Optimize Level Optimize for Size 2.6MBダイエット! ×(後述)
Build Setting Deployment Postprocessing Yes 元から設定されていた。。
Build Setting Symbols Hidden by Default Yes 元から設定されていた。。
Build Setting Build Options Enable BitCode No 38.5MBダイエット!
Build Setting Architectures Valid Architectures arm64 のみにする 3MBダイエット ×
Build Phases Link Binary With Libraries 不要なライブラリが無いか確認 特になし
Build Phases Copy Bundle Resources 不要なリソースが無いか確認 一部削除
コード修正 log関連 print文をコメントアウト 0.1MBダイエット! ×
コード修正 ライブラリ 不要なライブラリを削除 あまり変化なし

アップロードした→iTunesConnectでエラー。。

スクリーンショット 2018-05-07 17.52.38.png
こんな感じですorz

で、エラーコードは以下のように書いてありました。

Invalid Bundle - The app cannot be processed becauseoptions not allowed to be embedded in bitcode are detected in the submission. 
It is likely that you are not building the app with the toolchain provided in Xcode. 
Rebuild your entire app with the latest GM Xcode and submit the app again. 

…検討がつかないため、ググってみたところ、以下のような記事が!
Invalid bundle "Rebuild your entire app with the latest GM Xcode and submit the app again" with Xcode 9.3

この記事によると、Optimization LevelOptimize for SizeにするとiTunesConnectでリジェクトされるとのことでした。
ということで早速以下の設定に変更して再アップロードをしました。

種類 どの設定 やったこと 結果 適用したか?
Build Setting Swift Compiler - CodeGeneration Optimize Level No Optimization 2.6MBリバウンド

結果は…
スクリーンショット 2018-05-07 18.20.07.png
通った!:tada:

そもそもこの機能はSwift4.1で追加された機能らしく(参考)、まだ挙動が不安定だったのかもしれませんね。。うーん。。

ファイルサイズの確認!

本題に戻りまして、ファイルサイズを確認しました!
確認方法はアクティビティ→すべてのビルド→圧縮ファイルのサイズ→App Storeファイルのサイズ です。

スクリーンショット 2018-05-07 18.19.01.png

確かに圧縮されてる…!これで一安心です😌
しかし約100MBからここまで下がるものなんですねー。もう少しライブラリが小さくなるか、ipa内に持つ必要が無くなれば良いのですが。。

最後に

初めてiOSアプリを作るにあたって、Swiftが主流だからSwiftで書いてきましたが、根底にはObjective-Cの存在はずっとあり、多少なりともその知識はあった方が良いのかな〜と思いました。
すごい悩んでしまいましたが、色々勉強できる良い機会でした!

まだ素人に毛の生えた程度の人が書いているため、間違いが記載されているかもしれません。
もし見つけた方は是非とも指摘していただけますとありがたいですm(_ _)m

お世話になったページ

色々調査するにあたって、参考にしたページです。とても勉強になりました!ありがとうございますm(_ _)m