3G回線/LTE回線でアプリをDLする際のサイズ制限は以前よりだいぶ緩くなっていますが、LTE回線は7GBの制限があるので、ファイルサイズの大きいアプリはダウンロードしたくないというユーザーは少なくないと思います。また、ダウンロード時間が長くなり途中でダウンロードに失敗したり、ダウンロード時間が長いためダウンロードした事をユーザーに忘れられたりするアプリもあると思います。

このようにユーザーがファイルサイズに対する不満を持たないよう、申請前にIPAファイルのサイズ最適化を行うのは一般的な作業です。

素材などのリソースファイルを最適化する方法や、ゲーム系のアプリでよく見られる起動時に必要なデータをダウンロードする方法は定番として多くの記事で紹介されていますので割愛します。

今回は実行ファイルからIPAファイルのサイズを削減する方法について、話したいと思います。

1. 対応するアーキテクチャを減らす

CPUのアーキテクチャと機種の関係はこんな感じです。

アーキテクチャ 機種
armv7 iPhone4S
armv7s iPhone5, iPhone5c
arm64 iPhone5S, iPhone6, iPhone6 Plus

生成したIPAファイルはそれぞれのアーキテクチャでビルドしたものの集合です。3種類のアーキテクチャに対応する場合は、1つのアーキテクチャに対応する場合の3倍のサイズとなります。

新機種は古いアーキテクチャでビルドしたものと互換性があるので、最適な実行効率を求めなければ、armv7を対応するだけでiPhone4S以降の全機種で動作します。しかし、今年2月1日から64bit対応が必要になりました。アプリをストアに申請するためにはarm64のアーキテクチャ対応が必須となりました。

iPhone4S以降の全機種に対応するためにはarmv7とarm64の2つだけがあればとりあえず大丈夫です。それだけでIPAファイルのサイズが全機種対応の2/3になります。さらに対応機種をiPhone5S以降として良いのであればarm64のみでIPAファイルのサイズが1/3になります。

1

2. コンパイラ設定の最適化

「Build Settings」→「Optimization Level」で、リリース版を「Fastest, Smalllest」にすれば、ビルド時の最適化効果が最大になります。

3. シンボル情報をすべて外す

下記の3つの設定を「YES」にすることで、シンボル情報にかかる容量もビルド時に最適化されます。

  • Strip Linked Product
  • Deployment Postprocessing
  • Symbols Hidden by Default

他の最適化設定は公式の最適化設定ガイドをご参考ください。 CodeFootprint

4. 利用している外部ライブラリのサイズ確認

XCodeで「Project」→「Build Settings」→「Write Link Map File」を「YES」にして、「Path to link Map File」でlinkMapの出力パスを設定します。linkMapファイルは次回ビルド時にビルドフォルダの中に生成されます。

2

linkMapファイルには、アプリが利用しているすべての外部ライブラリの.aとプログラムの.oのサイズが記載されています。linkMapに記載されたサイズを参考に、より軽量なライブラリと差し替える判断材料になります。

5. ARCの代わりにMRCを利用

ARCのソースは書きやすくスタンダードになっていますが、ビルド時にretain/releaseの自動追加によって、MRCで作ったアプリのサイズは平均10%程度軽くなります。ソースの書きやすさは大事ですが、サイズを抑えるためにあえてMRC形式を採用することも一つの選択肢です。

6. 使っていないコードを削除

Objective-Cの動的な特性によって、importされていないソースファイルもビルド対象となり最終的に生成したIPAファイルの中に含まれます。不要なコードがあれば、削除したほうが実行ファイルは軽くなります。

7. クラス、メソッド名の短縮 & NSLogのコメントアウト

あまりおすすめできない最後の最後の手段ですが、Objective-Cでは、ビルド対象となったクラス名とメソッド名が__cstringに保存されているので、クラス名やメソッド名が長くなるとIPAファイルのサイズもわずかに大きくなります。そのため、ソースコードの難読化ツールで、クラス名やメソッド名の短縮も兼ねてやると、IPAファイルは数十KBから数百KBまで軽量化できます。

さらにプロジェクトの中にある静的な文字列もすべてに__cstringとして保存されます。NSLogなど静的な文字列が入っているデバッグコードをコメントアウトすれば(デバッグコードの使用量によって)数百KB程度が軽量化できるかもしれません。

実行ファイルに対するサイズの最適化方法は以上です。

Follow me!