回答:
このメカニズムは、Android開発者サイトで次のように説明されています。
zipalignは、Androidアプリケーション(.apk)ファイルに重要な最適化を提供するアーカイブ調整ツールです。目的は、すべての非圧縮データが、ファイルの先頭を基準とした特定の配置で開始されるようにすることです。具体的には、画像や生ファイルなど、.apk内のすべての非圧縮データを4バイト境界に揃えます。これにより、アライメント制限のあるバイナリデータが含まれている場合でも、すべての部分にmmap()を使用して直接アクセスできます。利点は、アプリケーションの実行時に消費されるRAMの量が減ることです。
要するに.apk
、パックされたファイル内のデータの順序により、コンテンツへのアクセスがより簡単/高速/最適になります。
より詳細な情報については、AddictiveTips:AndroidのZipalignとアプリをZipalignedにする方法の「完全なガイド」を参照してください。質問の2番目の部分に回答します。
かなり理解できることですが、状況は調整されていないアプリケーションパッケージのために予約されています。リソースの読み取りは遅く、メモリ使用量はスペクトルの上限になります。また、アライメントされていないアプリケーションがいくつあるかにも依存します。たとえば、ホームアプリケーションが揃っていないアプリケーションの数が少ない場合、アプリケーションの起動時間が遅くなります。これが最良のシナリオです。最悪の場合、調整されていないアプリケーションが多数あると、システムがプロセスの開始と終了を繰り返し、遅延と膨大なバッテリーの消耗に苦しみます。
上記にzipalignの正確な動作を追加するには-
Androidオペレーティング環境では、各アプリケーションパッケージに格納されているデータファイルは複数のプロセスからアクセスされます。たとえば、インストーラーはデータマニフェストを読み取って、関連する権限を判断します。システムサーバーは、通知の表示など、さまざまな理由でこれらのリソースを読み取ることができます。たとえば、ホームアプリケーションはリソースを読み取り、アプリケーションの名前とアイコンを取得します。Androidは真のマルチタスクオペレーティングインフラストラクチャに基づいているため、これらのファイルは継続的かつ繰り返しアクセスされます。最後に、重要なこととして、アプリケーション自体がマニフェストデータを読み取ります。
AndroidはLinuxベースなので、メモリマッピングはプロセスの効率的な処理において重要な役割を果たします。基本的に、Android OSのリソース処理コードの最適なアライメントは4バイト境界です。つまり、APKが4バイトの境界にメモリマッピングされ、それに応じてアライメントされている場合、OSは、目的のデータマニフェストに到達するためにアプリケーションパッケージ全体を「読み通す」必要はありません。すべてのシステムプロセスは、必要なリソースを探す場所を事前に知っているため、よりスムーズで高速に実行されます。
要約すると、APKをzipalignすると、パッケージ内のすべての非圧縮データが4バイト境界に整列され、すべての部分にメモリマップで直接アクセスできるようになります。クエリコードがアプリケーションパッケージ全体を読み取る必要がないため、実行中のRAM消費量が削減されます。
struct x { uint16_t id; uint32_t data[100]; };
ています。32ビットアラインメントが必要な場合は、しないでください。使用struct x { uint16_t id; uint16_t padding; uint32_t data[100]; };