しおメモ

雑多な技術系ブログです。ニッチな内容が多いです。

iOSアプリの圧縮済みAssets内の画像のサイズを調べて小さくする

せっかくインストールしたアプリを削除されたくないので、インストール後のバイナリサイズを削ってみました。
今年は細かい作業やりたくないので、忘れないうちに記録に残しておくことにしました。

まず見るWWDCのセッション

App ThiningとかAssets Catalogのことを知っておけば、アーカイブ前にもろもろ対策できます。

アプリのサイズ

手元やCIでarchiveした.ipaのサイズと、App Store上のサイズと、インストール後のサイズの3つはそれぞれ異なります。

これは、App ThiningやApp Store向けの暗号化などの影響によるもので、 主に後者の理由で、App Store上で表示されるアプリサイズ(やApp Store Connectに表示される想定サイズ)は、端末にインストール後のサイズより大体大きくなります。

Assetsの中でかさばっているものを調べる

Xcodeでarchiveすると、.appの中にAssets.carという圧縮ファイルが生成されます。
この中で大きいものは、端末にインストールした後も嵩張ることが多いので、そこを重点的に削っていきます。

assetutilというツールを使って、Assets.carのメタ情報を一度展開します。

xcrun --sdk iphoneos assetutil --info Assets.car >> extracted

ここで吐き出されたファイルはJSON形式で、アセットごとに

{
  ...
  "AssetType" : "Vector",
  "SizeOnDisk" : 1234567,
  "Name" : "hoge",
  ...
}

というような形式で吐き出されます。
SizeOnDiskのところに注目すればいいので、気合のある人はJSONをパースしてソートします。

気合のない人は、

cat extracted | grep -n5 -E "\"SizeOnDisk\" : [0-9]{7}"

のようなコマンドを打てば、大体1MB以上の大きなファイルが引っかかってくれます。

画像を小さくする

Assets Catalogのコンパイラオプションを一応確認しておきます。

  • 何も指定していない場合、上のセッションのように適切にAssetsが使われていれば、PNGはいい感じになっている場合が多いので、減色処理などをしてもあまり効果がない
  • JPEGはそのままなので、大きい場合は適宜リサイズやqualityを下げたりが必要
  • PDFなどベクター画像に関しても、なぜかそのままのことが多いので、ファイルを小さくするか、JPEG,PNGなどの他のフォーマットの変換する

App Store上のサイズは、少ししか減らなかったのですが、端末インストール後のサイズは、ほとんど上の手法で削減したのサイズと同じくらい小さくなりました。