web-dev-qa-db-ja.com

iPhoneアプリケーションのサイズを小さくするにはどうすればよいですか?

代替タイトル(検索を支援するため)

PNGの圧縮

IPhoneアーカイブ(.ipa)のサイズを縮小する

Xcodeで画像を圧縮するビルドルールを追加する


iOSアプリは、100 MB未満の場合、3G経由でのみダウンロードできます。アプリのサイズを縮小するための最良の戦略は何ですか?

私が注目したい分野は次のとおりです。

  • 画像
  • データベース
  • コード
  • 静的ライブラリ

NB:元の質問は、この質問の改訂で表示できます

31
Sudharsanan

PNGは、ロスレスイメージ圧縮に最適なオプションです。 [〜#〜] pngout [〜#〜] を使用すると、サイズに合わせてPNGを最適化できますが、どのファイルが特に多くのスペースを使用しているかを問い合わせることができますか?デバッグ以外のリリースと比較してどうですか?

編集:無料のGUIバージョンのPNGOUTが必要な場合は、 PNGGauntlet を参照してください。

6
Paul Lammertsma

Xcodeビルドルールを追加してPNGを圧縮する

IOSアプリの画像は、そのサイズの大部分を占める可能性があります。これは、すべての画像を3重にする必要があるユニバーサルアプリ(iPhone Standard、iPhone Retina iPad)の場合に特に当てはまります。

iOSアプリで使用するのに最適なタイプの画像はPNGです 。デザイナーがこれらの画像をPhotoshopで作成した場合、それらは破棄できる大量のメタデータと共に保存されます。

ただし、デザイナーが画像を変更する必要がある場合に役立つため、これらのデータを完全に失う必要はありません。

PNGOUTの最適化

PNGファイルを最適化するためのツールはいくつかありますが、pngoutが最適なオプションのようです。

  1. pngoutのMacバージョンをダウンロード
  2. バイナリコマンドラインアプリケーションpngoutをプロジェクト内のディレクトリにコピーします。バイナリをプロジェクトディレクトリに追加すると、任意のシステムでプロジェクトを構築するすべての人が利用できます。

ビルドルールの作成(Xcode 4)

ビルドルールはターゲット固有であるため、ターゲットが複数ある場合は、それぞれにルールをコピーする必要があります。

  1. ビルド構成にDEBUGマクロとDISTRIBUTIONマクロを追加します。PNGの最適化は非常にプロセッサを集中的に使用するため、ディストリビューションビルドでのみ実行する必要があります。 Pre-processor macros ご覧のとおり、DEBUG_BUILD=1DISTRIBUTION_BUILD=1を追加しました。

  2. PNGファイルのビルドルールを追加します。ビルドルールは、ビルドプロセス中に特定のファイル(またはファイル)を処理するだけです。これの威力は、ルールを連鎖させることができることです。 ビルドルール-Xcode 4 http://tinypic.com/images/404.gif

  3. 「ルールの追加」ボタンをクリックします。

    • [プロセス]を "名前が一致するソースファイル"とその値*.pngに設定します。
    • 使用を「カスタムスクリプト」に設定

このコードをスクリプトボックスに貼り付けます

echo "----------------------------------------------------------------" >> "${DERIVED_FILES_DIR}/pngout-log.txt"
echo "${INPUT_FILE_PATH}" >> "${DERIVED_FILES_DIR}/pngout-log.txt"
echo "${DERIVED_FILES_DIR}/${INPUT_FILE_NAME}" >> "${DERIVED_FILES_DIR}/pngout-log.txt"
echo ${GCC_PREPROCESSOR_DEFINITIONS} >> "${DERIVED_FILES_DIR}/pngout-log.txt"

BUILD=`echo ${GCC_PREPROCESSOR_DEFINITIONS} | grep -o DISTRIBUTION_BUILD`

echo $BUILD >> "${DERIVED_FILES_DIR}/pngout-log.txt"

if [ "${BUILD}" == "DISTRIBUTION_BUILD" ]; then
echo "COMPRESS" >> "${DERIVED_FILES_DIR}/pngout-log.txt"
"${PROJECT_DIR}/build-process/pngout" -y -q -force "${INPUT_FILE_PATH}" "${DERIVED_FILES_DIR}/${INPUT_FILE_NAME}"
else
echo "COPY" >> "${DERIVED_FILES_DIR}/pngout-log.txt"
cp -f "${INPUT_FILE_PATH}" "${DERIVED_FILES_DIR}/${INPUT_FILE_NAME}"
fi

echo "...done." >> "${DERIVED_FILES_DIR}/pngout-log.txt"

注目すべきいくつかの環境変数があります。

  • ${INPUT_FILE_PATH} —画像ファイルへのフルパス
  • ${INPUT_FILE_NAME} —画像ファイル名(拡張子付き)
  • ${DERIVED_FILES_DIR} — Xcodeがビルドファイルなどを格納する場所
  • ${GCC_PREPROCESSOR_DEFINITIONS} —上で設定したマクロ

作業は次の行で行われます。

    "${PROJECT_DIR}/build-process/pngout" -y -q -force "${INPUT_FILE_PATH}" "${DERIVED_FILES_DIR}/${INPUT_FILE_NAME}"

${PROJECT_DIR}はプロジェクトへの完全パスであり、-yは既存のファイルを上書きし、-qpngouts出力を制限し、-forcepngoutを禁止しますファイルを最適化できない場合にステータス2で終了し、Xcodeレポートのビルドエラーが発生します。

このスクリプトは単に${GCC_PREPROCESSOR_DEFINITIONS}をテストしてDISTRIBUTION_BUILDかどうかを確認し、そうであればpngoutを使用してファイルを最適化します。それ以外の場合は${DERIVED_FILES_DIR}にコピーしてXcodeが続行できるようにしますそれを処理します。

最後に、「出力ファイル」リストに${DERIVED_FILES_DIR}/${INPUT_FILE_NAME}を追加することを忘れないでください。これは、Xcodeがあなたが持っているファイルを見つける方法を知る方法です処理されました。

23
rjstelling

通常、デバッグビルドはリリースビルドよりはるかに大きくなります。リリースモードでビルドしてみてください。

役立ついくつかのコンパイラオプションもあります。しかし、iPhoneリリースモードのデフォルトが何なのかわかりません。 -Osは、より小さいバイナリ用に最適化します。また、実行できないコードを削除するデッドコードストリッピングのオプションもあります。また、バイナリを削除してみることもできますが、それがiphoneバイナリで機能するかどうかはわかりません。

これは、問題が実行可能バイナリサイズによるものであり、イメージリソースによるものではないことを前提としています。

4

アプリのサイズを縮小するために ImageOptim および ImageAlpha を使用しました。詳細については、このケーススタディをご覧ください。 iPad用のTweetbot

3
Amit Vaghela

過去数か月でiOSアプリを90MBから50MBに減らしました。ここにいくつかのヒントとツールがあります:

iOSアプリのサイズをプロファイルするには

  1. ipaを解凍して、ビデオ、フォント、画像ファイルなどのリソースを確認します。

  2. Linkmapファイルと XCode Linkmap Parser を使用して、ライブラリとオブジェクトファイル(クラス)でバイナリファイルのプロファイルを作成します。

画像ファイルを削減するには

  • ImageOptim-CLI を使用して、画像圧縮プロセスを自動化します
  • nused-image を使用して、未使用の画像ファイルを検索します

バイナリファイルを削減するには

  • デバッグシンボルを削除する
  • fui を使用して未使用のインポートを検索します
1
Jakehao

@rjstellingには本当にいい答えがあり、私はそれをよりよく言うことができませんでしたが、それには1つの小さな問題があります。ローカライズされた画像では機能しません。これは画像にテキストを埋め込む場合にのみ問題になります。回避できる場合は絶対にしないことを強くお勧めします。ただし、ローカライズされた画像を使用する必要がある場合は、以下を使用する代わりに、rjstellingのすべての手順に従ってください。

if [ "${BUILD}" == "DISTRIBUTION_BUILD" ]; then
echo "COMPRESS" >> "${DERIVED_FILES_DIR}/pngout-log.txt"
"${PROJECT_DIR}/build-process/pngout" -y -q -force "${INPUT_FILE_PATH}" "${DERIVED_FILES_DIR}/${INPUT_FILE_NAME}"
else
echo "COPY" >> "${DERIVED_FILES_DIR}/pngout-log.txt"
cp -f "${INPUT_FILE_PATH}" "${DERIVED_FILES_DIR}/${INPUT_FILE_NAME}"
fi

以下のコードを使用してください:

if [ "${BUILD}" == "DISTRIBUTION_BUILD" ]; then
echo "COMPRESS" >> "${DERIVED_FILES_DIR}/pngout-log.txt"
"${PROJECT_DIR}/build-process/pngout" -y -q -force "${INPUT_FILE_PATH}" "${DERIVED_FILES_DIR}/${INPUT_FILE_REGION_PATH_COMPONENT}${INPUT_FILE_NAME}"
else
echo "COPY" >> "${DERIVED_FILES_DIR}/pngout-log.txt"
cp -f "${INPUT_FILE_PATH}" "${DERIVED_FILES_DIR}/${INPUT_FILE_REGION_PATH_COMPONENT}${INPUT_FILE_NAME}"
fi

唯一の変更点は、エクスポートファイルのパスです。画像のローカリゼーションを正しく機能させるには、エクスポートパスの前にINPUT_FILE_REGION_PATH_COMPONENTを追加する必要があります。 INPUT_FILE_REGION_PATH_COMPONENTは、特定のファイル用にローカライズされたフォルダーがない限り、通常は空です。その場合、フォルダー名と末尾のスラッシュが提供されるため、その必要はありません。

これを機能させるには、Output Files設定を${DERIVED_FILES_DIR}/${INPUT_FILE_REGION_PATH_COMPONENT}${INPUT_FILE_NAME}に変更する必要もあります。

私がその問題を経験した唯一の人かどうかはわかりませんが、うまくいけば誰かの役に立つでしょう。

1
btomw

。ipaファイルの検査

.ipaファイルの拡張子を.Zipに変更し、Finderで開いて解凍するだけです。解凍された.appバンドルを右クリックし、[パッケージの内容を表示]を選択して、内部のリソースを表示します。これにより、何が最もスペースを使用しているかがわかります。

ターミナルを開いて次のコマンドを実行すると、.ipa内の各アイテムの圧縮サイズを確認できます。

unzip -lv /path/to/your/app.ipa

Size列には、.ipaファイル内の各ファイルの圧縮サイズが含まれています。アプリのリソースのサイズを減らすために作業するときは、このサイズを評価する必要があります。リソースのサイズを大幅に減らすことができますが、.ipaファイルを作成した後、そのリソースの圧縮サイズがそれほど大きく変化していないことに気付く場合があります。 .ipaファイルのサイズを削減する最も効果的な方法は、不要なリソースを削除することです。

記事全体にアクセスするには、Apple開発者のWebサイトから link を参照してください。

0
Murat Yasar