現在のコンパイルのiOSアプリのパッケージングアプローチがあるファイルとリソースファイルは、ファイルマージを実行するために、複数のデバイスとの互換性を適応させるために、アップロードとダウンロードファイルはより多くのストレージスペースを取る、その結果、すべてのファイルが含まれています。
アプリの間伐は約ある节省 iOS 设备存储空间
のApp Storeおよびインストール、更新、および他のシーンのiOS版アプリやwatchOSを実行し、最適化の一連のインストールパッケージのサイズを最小化するためにのみ必要なダウンロードしますオペレーティングシステムを可能にする機能、リソースとは、あなたのデバイス上のストレージスペースを節約し、フットプリントのAppを減らします。スライス、ビットコード、オンデマンド:このプロセスは、以下の3つのプロセスが含ま資源を。
A、スライス
アプリのスライスは、アプリケーションのリソース要件を節約する上で最も重要な役割を果たしています。
多くのアプリケーションは異なる独立したリソースが含まれており、これらの異なるデバイスのために、異なるサイズのデバイス上で実行する必要があり、ユーザ機器のほとんどは必要ありません。そのため、アプリケーション開発者は、AppStoreにアップロードしたパッケージをインストールするには、Appleが自動的にサービスパックをインストールしますカット、異なるアプリケーション変異体について(APPバリアントを)、またはApp Storeが「スターターアプリケーションを「のために作られた異なるデバイスでは異なるであろうと呼ばれ、アプリをダウンロードする際に、システムは、デバイスモデルのダウンロードに応じて異なる「Liteのアプリ」をインストールします。(支持体上IOS9.0.2)
下位互換性のためにiOSアプリ後、今では32ビットと64ビットの2つのスライスの両方を含みます。また、画像リソースでは、2倍、3倍、すべての画像です。そして、ときにユーザーアプリ、デバイスが特異的であるため、実際には、リソースのセットの一つだけ。しかし、今購入し、ダウンロード時間は、パッケージがダウンロードされ、全体のアプリです。AppleはiOSの9で、最終的に所望のコンテンツ(スライス)のダウンロードのみを選択することができます。開発者のために、やることが多くはありません、ちょうどそれに材料2倍3倍のマークを管理するために、資産・カタログを使用します。
たとえば、ユーザーがiPhone 5cとを使用しており、32ビットCPUとGPUを実行している、金属製のAPIをサポートしていません。ユーザーは、最新のユニバーサルゲーム・アプリケーションをダウンロードした場合、それは64ビットのバイナリコード、iPadや「@ 3X」iPhone 6 Plusの資源や金属APIコードが含まれていますが、これらは、あなたのデバイスがアクセス権を持っていないです。これは、32ビットコード、「@ 2xの」iPhone OpenGLグラフィックスのコードサイズとリソースが必要です。
注意:スライスのアプリが9.0以降を実行しているデバイスでサポートされています。
次のようにスライス主なワークフローは次のとおりです。
- リソースファイル内のアセット・カタログスライスの役割を使用する唯一の権利、多重解像度画像を提供するために、デバイスと資産カタログリソースを使用してXcodeでターゲットを選択します。
- またはシミュレータ装置コンパイラと実行アプリで。
- Xcodeは自動的に「簡易版アプリ」を構築しますが、またコンパイル時間を短縮してについては、お近くのテスト機器を実行します。
- パッケージ化されたアプリ(設定エラー異なるターゲットデバイスを検出するために、あなたは、ローカル正しいし、テストパックに「Liteのアプリ」ターゲットデバイスをエクスポートすることができます)
- 接続iTunesにパッケージ化アプリをアップロードします。App Storeはアーカイブをアップロードするために異なる「Liteのアプリ」アプリを作成します。
- iTunesの接続では、テストのために資格をテスターにプレビュー版をリリースしました。
- プレビュー版をダウンロードしてTestFlightテスター。TestFlightは自動的にテスタースターターアプリ」に応じて適切な機器をダウンロードします。
次のようにリンゴの最終的な効果は、リソースをダウンロード:
二、ビットコード(iOSの、watchOS)
開口部のビットコードをコンパイルした後、開発者は、単に中間表現(ミドルウェア)ではなく、最終的な実行可能バイナリファイルよりも、アプリケーションをアップロードアップロードできること。ユーザーがアプリをダウンロードする前に、AppStoreのは、自動的にコンパイルミドルウェア、ユーザーがダウンロードしてインストールするためのファイルを実行するために必要な機器を製造することになります。それは我々がApp Storeにプログラムを送信すると、Xcodeのは(ビットコード)の中間形式にコンパイルされます、です。アプリストアは、再度このビットコードは64または32ビットの実行可能なプログラムとしてコンパイルされます。Appleはアプリケーションの命令セットのタイプをダウンロードするユーザーの携帯電話に応じてのみ、バイナリの命令セットを生成します、発行されました。インストールパッケージのサイズを合理化する目的を達成するために。
ビットコードの中間コードLLVMアセンブリ各チッププラットフォーム上の命令またはデータの実行可能マシン命令の後端ことは理解されるようにコードLLVMコンパイラのフロントエンドLLVMは、C / C ++ / OC /スイフト他のプログラミング言語として理解することができるです次に、ビットコードは、2つの符号間の中央に位置しています。LLVMコンパイラ作品、対応するアセンブリ命令に変換し、ターゲット・マシンのインターネットに依存してマシンコードチップに翻訳し、中間コードビットコードにプロジェクトのソースコードの先端を変換する責任があります。LLVMコンパイラを作ることができるこのデザインは簡単としてだけでなく、新しいCPU(バックエンド)コマンドの出力をサポートするには、次のLLVMインフラストラクチャで、LLVMアーキテクチャの上に新しい言語(フロントエンド)を発明することが可能なアーキテクチャとなりました。
ビットコードちょうど中間コードは、任意のプラットフォーム上で実行することはできませんが、それは、CPUのアーキテクチャを含め、サポートされている任意のCPUアーキテクチャに変換することができますがまだ発明されなかったが、それは、ビットコードがApp Storeにアプリケーションを提出するオープンしました今後のAppleハードウェアのアップグレードのための施策、このメカニズムは、ケースは再リリース開発者向けバージョンではなく、新しいデバイスと互換性があることを確認することができます。携帯電話の後にAppleの新しいCPUアーキテクチャとAppleのようにも新しいデザイン、バックエンドサーバー、外のアプリケーションのビットコードから始めることができる場合たとえば、ダウンロードに新しい携帯電話ユーザーのために、新しいCPU上で実行可能なプログラムにコンパイルし、このアプリケーションを実行します。
文書では見ることができます
実際には、アプリのスライスは、アプリの間引き処理の大部分を処理します。「アプリのスライス」機能は最終的にiOSの9.0.2にオン
説明スライスは、メイン処理アプリ間伐ですが、この機能は(iOS9.0が原因のiCloudバグのため閉鎖された)iOS9.0.2でだけサポート以上のものが必要。実際のビットコードでは、命令セットが最適化されていません。お使いのデバイスの状態に応じて、コンパイラの最適化を行い、これによりパフォーマンスを向上させます。ビットコードだから、基本的に達成されていないものについて、パッケージの最適化効果の大きさ。
ビットコードの注意事項
- Xcodeの7は、アプリケーションがビットコードになっている場合、デフォルトビットコードで有効になって、その後、他のサードパーティのライブラリの統合はまた、ビットコードにコンパイルパッケージである必要が本当にビットコードにコンパイルすることができます
- コンパイラは.APPボリュームが大きくなると発生コンパイルビットコードを開いた後、(中間コード、ユーザーがパッケージをダウンロードしていない)、およびファイルが.dSYMがクラッシュログ(サービスパケットを再コンパイル生成されるダウンロードするAppleユーザーを、象徴使用することはできません新しいシンボルファイル)があります
- アーカイブのAppStoreは、パケット方式によってアップロードされ、対応するインストールパッケージが主催ツールXcodeで新しいシンボルファイルにダウンロードすることができます
三、オンデマンド・リソース(iOS版)
ODRは、(オンデマンドリソースのリソース需要)リソースの消費を削減アプリケーションのiOSの別の方法です。このようなマルチレベルのゲームとして、あなたは通常、彼らの現在のシリーズと次のレベルを必要としています。ユーザーが必要とするいくつかのレベルのゲームをダウンロードすることができODR手段。あなたの増え続けるシリーズ、ダウンロードに他のシリーズのアプリケーション、および削除ユーザーで正常シリーズを渡します。
アプリケーションのコンテンツの場合は、ユーザーがクリックし、それらを動的に必要なときに、ユーザーが唯一のストレージスペースを取ることを意味しますApp Storeで、からダウンロードされます。この機能についての興味深い事も嘘時にバックグラウンドでダウンロードするようなコンテンツは、自動的に収納スペースストレスの多い時間に削除されます。
オンデマンドリソースの追加は、実行可能コードのいずれのタイプであってもよいです。
開発プロセスでは、1つまたは複数のタグを割り当てることにより、オンデマンドのリソースを識別することができます。アプリにそれをロードするときは、決定するためにエイリアスタグを使用することができます。
利点:
- 小さいアプリサイズ。アプリケーションは小さいです。
- アプリのリソースの遅延ロード。レイジーロードするアプリケーションリソース。
- ほとんど使用されたリソースのリモートストレージ。遠位めったに使用リソース。
- アプリ内購入のリソースのリモートストレージ。使用可能なストレージリソースの先端。
示し下図Appで最小のフットプリントを維持する例。
あなたは、このようなすぐにAppStoreの負荷からアプリケーションをインストールした後などのリソースの優先度を設定することができます。
_tag_は、作成した文字列識別子です。アプリは、タグではなく、個々のリソースを要求します。
オンデマンドリソースのライフサイクルを3.1
アプリケーションは、オペレーティング・システムからリソースを要求します。オペレーティングシステムは、リソースを必要なすべての資産・パックを含むように要求を送信します。
地元の資産パック内のリソースは、要求が存在して確認してください。もしそうなら、直接アプリケーションを使用しています。
要求されたリソースがローカルに存在しない場合は、App Storeで保存されます。
オペレーティングシステムは、ローカルに存在しないリソースのダウンロードを開始します
リモートリソースをダウンロード
ダウンロードがダウンロードされている成功するか、リソースパッケージを監視するためのリソースと、メモリリソースパックは+1カウントすることと、このリソースが利用可能であるアプリケーションに通知します。
要求されたリソースが利用可能である場合には、アプリケーションのラベル資源は、資源に対応します。
ローカルラベルでシステムのリリースリソースを操作します
オペレーティングシステムは、ローカルにキャッシュリソースをクリアします。キャッシュリソースが一定時間後にすべての要求、オペレーティングシステムに関連付けられていない場合は、それが解放されます。
下に示すように、完全なライフサイクル:
四、实际处理方法
iOS9 以后 Xcode 默认开启 On-Demand Resources 功能,可以在下图所示位置进行设置。
在 App 中创建 Tags
给文件设置 tag
给图片设置 tag
给 tag 设置加载的优先级
4.1 加载优先级
- Initial install tags.资源和 App 同时下载。在 App Store 中,App 的大小计算已经包含了这部分资源。当没有NSBundleResourceRequest 对象访问它们时,它们将会从设备上清除。
- Prefetch tag order. 在 App 安装后开始下载,按照预加载列表中的顺序依次下载。
- Dowloaded only on demand. 只有在 App 中发出请求时才会下载。
4.2 资源大小限制
五、学习文章
What is app thinning? (iOS, tvOS, watchOS)
On-Demand Resources Essentials
App Thinning
App Thinning