App Thinningは、ユーザーの特定のデバイスに必要なリソースのみを配信することで、インストールされるアプリのサイズを削減するAppleのテクノロジーです。Apple Developer Documentation、2026によると、App ThinningにはSlicing、Bitcode、On-Demand Resourcesの3つのメカニズムが含まれています。各コンポーネントとディストリビューションサイズへの影響を見ていきましょう。
重要ポイント
App Thinning — iOS 9(2015年9月)とともにAppleが導入した、iOSアプリ配信最適化のための包括的なテクノロジーです。App Thinningの目的は、ソースコードや機能を変更することなく、ユーザーがデバイスにダウンロードするアプリのサイズを最小限に抑えることです。このテクノロジーは、ビルド段階(コンパイル)、App Store側(配信)、デバイス上(リソース管理)の3つのレベルで動作します。
App Thinning以前は、デベロッパーはすべての可能なデバイス向けのリソース(@2xおよび@3x画像、32ビットおよび64ビットコード、異なるGPU用のMetalシェーダー)をバイナリファイルに含めていました。これによりアプリサイズが肥大化し、Retina HDディスプレイを搭載したiPhone 6 Plusのユーザーは、使用されることのないiPad Pro用のベクターリソースを受け取っていました。Appleは、ビルド作業の一部をApp Storeサーバーに移すことでこの問題を解決しました。
Appleの調査(WWDC 2015、Session 412)によると、複数のアーキテクチャと解像度をサポートする標準的なアプリは、App Thinningの適用後に30〜50%削減できます。高精細テクスチャを大量に使用するゲームでは、削減効果は70〜80%に達する可能性があります。Appleはテクノロジーの改良を続けており、iOS 17ではARM64eの最適化と、Swift Package Managerを使用するアプリ向けのOn-Demand Resourcesの改善が追加されました。
モバイルアプリのサイズは増加し続けています。Sensor Tower(2025)によると、過去5年間でiOSアプリの平均サイズは45%増加しました。データプランが限られているユーザーやインターネットが遅いユーザーにとって、1メガバイトも重要です。App Thinningはデベロッパーの関与なしにこの問題を解決します。プロジェクト設定でサポートを有効にして、App Store Connectにビルドをアップロードするだけです。
App Thinningのプロセスは、App Store Connectにアプリのアーカイブをアップロードした後に開始されます。App Storeはバイナリファイルを分析し、アーキテクチャ(armv7、arm64、arm64e)、画面解像度(iPhone、iPad)、iOSバージョンごとにセグメントに分割します。各組み合わせに対して個別のバリアントが作成されます。ユーザーが“ダウンロード”をクリックすると、App Storeはデバイスモデル、iOSバージョン、接続タイプ(Wi-Fi/モバイルネットワーク)を判別し、対応するバリアントのみを送信します。
ユーザーにとってプロセスは透過的であり、“軽量版”の選択や設定ダイアログはありません。App Storeは、ダウンロードリクエスト時にサーバーに送信されるデバイスのメタデータに基づいて、最適なバリアントを自動的に選択します。デバイスがWi-Fiを使用している場合、App Storeは高品質のリソース(例:iPhone 16 ProのProResビデオ)を含むバリアントを送信できます。モバイルネットワークでのダウンロード時には、最小限のセットが使用されます。
第2の最適化レベルはBitcodeです。ENABLE_BITCODEオプションが有効な場合、Xcodeはアプリをマシンコードではなく、中間LLVM表現にコンパイルします。App StoreはBitcodeをユーザーのプロセッサアーキテクチャ向けに再コンパイルし、Appleはデベロッパーがアプリを更新することなく、新しいチップ世代(A17、M4)向けのコンパイラ最適化を適用できます。BitcodeはwatchOSとtvOSでは必須ですが、iOSではオプションです。
App Thinningは3つの独立したメカニズムで構成され、それぞれが最適化の特定の側面を担当します。Slicingはバイナリファイルをアーキテクチャと画面解像度に応じてバリアントに分割します。デベロッパーはAsset Catalogsを通じてSlicingを設定します。Xcodeは自動的に、ターゲットデバイスに一致するリソースのみをスライスに含めます。たとえば、iPhone SE(第3世代)は@2x画像とarm64コードのみを受け取り、iPad Pro M4は@3x画像とarm64eコードを受け取ります。
Bitcode — LLVM IR(Intermediate Representation) — プログラムのマシン非依存表現です。Bitcodeが有効な場合、Xcodeは最終的なマシンコードを生成せず、中間表現を保存します。App Store Connectはビルドアップロード時にBitcodeを受け取り、サポートされているすべてのデバイスのアーキテクチャ向けに再コンパイルします。Bitcodeにより、Appleはデベロッパーのコンパイル段階では利用できない最適化(例:M4チップでの新しいプロセッサ命令SME、SVEの使用)を適用できます。
On-Demand Resources(ODR) — 3番目のメカニズムで、使用後にアプリのリソースをアンロードできます。デベロッパーはリソース(ゲームレベル、オンボーディング画像、ビデオ)にODRタグを付けます。iOSはタグ付けされたリソースを必要に応じてバックグラウンドでダウンロードし、メモリ不足時や使用後にアンロードします。ODRは特に大量のコンテンツを含むゲームに効果的で、最初のレベルはアプリに同梱し、残りは進行に応じてダウンロードできます。
App Thinningメカニズムの選択は、アプリの種類とターゲットユーザーによって異なります。Slicingは常に有効にすることを推奨します。Asset Catalogsを適切に整理する以外にデベロッパーの追加作業は不要で、サイズを20〜30%安定して削減できます。Bitcodeは、カスタムMetalシェーダーを使用するアプリや、再コンパイルなしで新しいAppleアーキテクチャをサポートする予定のアプリに適しています。ODRは、大量のコンテンツを含むアプリ(ゲーム、写真編集アプリ、ストリーミングアプリ)に適しています。
標準的なビジネスアプリ(データフィード、フォーム、REST API)の場合、Slicingとオンボーディング画像用の最小限のODR設定で十分です。ゲームは3Dグラフィックスで3つのメカニズムすべての恩恵を受けます。Slicingは不要なシェーダーを削除し、BitcodeはGPUに合わせてレンダリングを最適化し、ODRは完了したレベルをアンロードします。Apple(WWDC 2024)によると、3つのメカニズムすべての組み合わせにより、ユニバーサルバイナリと比較して初期インストールサイズが平均45〜55%削減されます。
| メカニズム | 機能 | 動作場所 | デベロッパーの作業 |
|---|---|---|---|
| Slicing | 他のデバイス用リソースを削除 | App Store + デバイス | Asset Catalogs |
| Bitcode | アーキテクチャ向けに再コンパイル | App Store | ENABLE_BITCODE=YES |
| ODR | 必要に応じてリソースをダウンロード | デバイス | プロジェクトにODRタグ |
XcodeプロジェクトでApp Thinningを有効にするには、いくつかの手順を実行する必要があります。Slicingはビルド設定のApp Thinningを通じて設定します。Build Settings → App Thinning。None(最適化なし)、Automatic(デフォルトの自動設定)、Manual(テスト用の特定バリアント選択)の3つの値が利用可能です。AppleはほとんどのプロジェクトでAutomaticを推奨しています。
Asset Catalogsでは、リソースを適切に整理することが重要です。画像は幅/高さを指定してユニバーサルカタログに配置され、Xcodeが自動的に@1x、@2x、@3xのバリアントを作成します。Xcodeはビルド時に、プロジェクトで使用されている解像度のみを含めます。MetalシェーダーはGPUファミリー(Apple GPU、PowerVR、Mali)ごとに個別にコンパイルされ、これもAsset Catalogsを通じて管理されます。
BitcodeはBuild SettingsでENABLE_BITCODE = YESフラグによって有効になります。iOSではこのフラグはオプションですが(Xcode 14以降デフォルトでオフ)、watchOSとtvOSでは必須です。サードパーティライブラリを使用するプロジェクトでBitcodeを有効にする場合、それらすべてがBitcodeでコンパイルされている必要があります。そうでない場合、ビルドは失敗します。Bitcodeはコンパイル時間を20〜30%増加させますが、将来のアーキテクチャとの完全な互換性を提供します。
App Store Connectにアップロードした後、Activity → Build Metricセクションでスライスサイズを確認できます。App Store Connectは異なるデバイス向けのEstimated App Store Sizeを表示します。ローカル確認のために、Xcodeは-exportArchiveフラグとthinningオプションを指定したxcodebuildコマンドを提供し、ローカルマシンでスライスを作成できます。Slicingの結果は、アーカイブ後にOrganizer(Window → Organizer)で確認できます。App Thinning Profilesタブに異なるデバイス向けのサイズが表示されます。
# Slicingのローカル検証
xcodebuild -exportArchive \
-archivePath "App.xcarchive" \
-exportPath "export/" \
-exportOptionsPlist "export.plist" \
-thinning "<thin-for-all-variants>"
Xcodebuildは-thinningフラグを指定すると、アーキテクチャ、ビット幅、GPUの各組み合わせに対して.appファイルを作成します。パラメータ<thin-for-all-variants>は可能なすべてのバリアントを作成し、確認に便利です。CIパイプラインでは、iPhone14,4(iPhone SE 3)などの特定の組み合わせを指定します。結果の.appファイルはapp-sizeユーティリティで分析できます。
App Thinningの主な利点は、エンドユーザー向けのダウンロードサイズの削減です。Apple(WWDC 2024)によると、3つのApp Thinningメカニズムすべてを使用する標準的なアプリは、モバイルネットワークでのダウンロードが平均40%高速になり、ディスク容量を35%削減できます。これはインストール率に直接影響します。Sensor Towerによると、アプリサイズが10MB増えるごとにインストール率が1%低下します。
2つ目の利点は、Bitcodeによる将来のデバイスへの最適化です。Appleはデベロッパーの関与なしに、Bitcodeアプリを新しいアーキテクチャ向けに再コンパイルできます。たとえば、IntelからApple Silicon(M1)への移行時、Bitcodeアプリは追加のビルドなしでRosetta 2を通じてmacOS上で動作しました。Bitcodeを有効にしなかったデベロッパーは、arm64向けにアプリを再コンパイルする必要がありました。
3つ目の利点は、ODR(On-Demand Resources)がデバイスストレージの負荷を軽減することです。Asphalt 8: Airborneのような何十ものレベルを持つゲームは、ODRを使用して進行に応じて新しいトラックをダウンロードします。デベロッパーは、アプリとともにダウンロードされるリソースにInitial Install Tagsを設定し、インストール後にバックグラウンドでダウンロードされるコンテンツにPrefetch Tagsを設定できます。AppleはODRの制限を管理しています。1リクエストあたり最大512MB、デバイス上の合計キャッシュは最大20GBです。
App Thinningには、アプリ設計時に考慮すべきいくつかの重要な制限があります。第1に、SlicingはEnterprise(in-house)またはAd Hocで配布されるアプリには適用されません。これらのビルドにはすべてのバリアントが含まれており、App Storeを経由しません。Slicingのテストには、デベロッパーはTestFlightを使用できます。TestFlightもAppleサーバー側でSlicingを処理します。
第2に、Bitcodeはビルド時間と.xcarchiveアーカイブのサイズを約30〜50%増加させます。すべてのサードパーティライブラリがBitcodeをサポートしているわけではありません。1つでもBitcodeなしでコンパイルされた依存関係があると、ENABLE_BITCODEでのプロジェクトビルドは失敗します。AppleはBitcodeを有効にする前にライブラリの互換性を確認することを推奨しています。さらに、BitcodeはSwift Package Managerを完全にはサポートしておらず、一部のSwiftパッケージはBitcodeビルドを壊す可能性があります。
第3に、On-Demand Resourcesはコンテンツの即時利用を保証しません。ODRダウンロードはバックグラウンドで行われ、デバイスが低バッテリーモードや弱い信号状態の場合に遅延する可能性があります。デベロッパーはNSBundleResourceRequestを通じてODRダウンロードステータスを処理し、ユーザーに進捗インジケーターを表示する必要があります。ODRダウンロードの失敗はアプリの機能をブロックしてはいけません。グレースフルフォールバックが必要です。
よくある質問
いいえ、App Thinningは必須ではありません。App Thinningなしでも、アプリはすべてのリソースバリアントを含む単一のユニバーサルバイナリとしてApp Storeにアップロードされます。ただし、Appleはユーザーエクスペリエンスの向上とApp Storeサーバーの負荷軽減のため、App Thinningを強く推奨しています。
Xcode Organizerはアーカイブ後に異なるデバイス向けのEstimated App Store Sizeを表示します。App Store ConnectのActivityセクションでは、ビルドアップロード後の正確なスライスサイズが表示されます。ローカル確認には、-thinningフラグを指定したxcodebuildを使用してください。
はい、App ThinningはSwiftUIと完全に互換性があります。SlicingはAsset Catalogsで機能し、SwiftUIはImageとColorを通じてこれらを使用します。Bitcodeは、すべての依存関係がBitcodeでコンパイルされていることを条件に、SwiftUIプロジェクトをサポートします。ODRはフレームワークに関係なくNSBundleResourceRequestを通じて管理されます。
Slicingは起動時間に影響しません。削除されたリソースは読み込まれません。BitcodeはJITコンパイルのため、初回起動時に起動時間がわずかに増加する可能性があります。ODRは、Initial Install Tagsのリソースがまだダウンロードされていない場合、起動時間を増加させる可能性があります。Appleは重要なリソースのみをInitial Installとしてマークすることを推奨しています。
プロジェクトでBitcodeが必要だがライブラリがサポートしていない場合、2つの方法があります。ライブラリをプロジェクトから削除してBitcode互換の代替品を探すか、Build SettingsのENABLE_BITCODEで特定のターゲットのBitcodeを無効にします。AppleはiOSでのBitcode無効化を許可していますが、watchOSとtvOSでは必須サポートが必要です。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。