概要

Android デバイスには、起動プロセスでさまざまな機能を果たす複数のパーティションが含まれています。

標準パーティション

  • boot パーティション。このパーティションはカーネル イメージを含み、mkbootimg を使用して作成されます。仮想パーティションを使用すると、新しいブート パーティションをフラッシュせずに、任意のイメージを直接フラッシュできます。Android 13 より前にリリースされたデバイスの場合、このパーティションには汎用 RAM ディスクも含まれています。

    • kernel。仮想 kernel パーティションは、新しいカーネル イメージを古いカーネル イメージに書き込むことで、カーネル(zImagezImage-dtbImage.gz-dtb)を上書きします。提供された開発用カーネルに互換性がない場合、vendorsystem、または dtb のパーティション(存在する場合)を、関連するカーネル モジュールに更新する必要があります。

    • ramdisk。仮想 ramdisk パーティションは、新しい ramdisk イメージを古い ramdisk に書き込むことで、ramdisk を上書きします。

    上書き処理では、eMMC にある既存のイメージの開始位置を決定し、新しいイメージをその位置にコピーします。新しいイメージ(カーネルまたは RAM ディスク)が既存のイメージより大きい場合があります。スペースを空けるために、ブートローダーはイメージの後にデータを移動するか、処理を中止してエラーを報告できます。

  • init_boot パーティション。Android 13 以降のデバイスの場合は、このパーティションに汎用 RAM ディスクが含まれています。

  • system パーティション。このパーティションには Android フレームワークが格納されています。

  • odm パーティション。このパーティションには、元の設計メーカー(ODM)のシステム オン チップ(SoC)ベンダーのボード サポート パッケージ(BSP)に対するカスタマイズが含まれています。このようなカスタマイズにより、ODM は、SoC コンポーネントの置き換えやカスタマイズを行えます。またハードウェア抽象化レイヤ(HAL)上のボード固有のコンポーネント、デーモン、ODM 固有の機能のカーネル モジュールを実装できます。このパーティションは省略可能です。通常、デバイスが複数のハードウェア SKU に 1 つのベンダー イメージを使用できるように、カスタマイズを格納するために使用されます。詳しくは、ODM パーティションをご覧ください。

  • odm_dlkm パーティション。このパーティションは、ODM カーネル モジュールの格納専用です。ODM カーネル モジュールを(odm パーティションではなく)odm_dlkm パーティションに格納することで、odm パーティションを更新することなく ODM カーネル モジュールを更新できるようになります。

  • recovery パーティション。このパーティションには、OTA プロセス中に起動されるリカバリ イメージが格納されています。シームレス アップデートをサポートするデバイスは、リカバリ イメージを個別のイメージではなく、boot または init_boot イメージに含まれる RAM ディスクとして格納できます。

  • cache パーティション。このパーティションには一時データが格納されています。デバイスがシームレス アップデートを使用する場合、このパーティションは省略可能です。キャッシュ パーティションはブートローダーから書き込み可能にする必要はありませんが、消去可能にする必要があります。パーティション サイズは、デバイスタイプと userdata の空き容量によって異なります。通常 50 MB~100 MB で十分です。

  • misc パーティション。このパーティションはリカバリ パーティションで使用され、サイズは 4 KB 以上です。

  • userdata パーティション。このパーティションには、カスタマイズ データなど、ユーザーがインストールしたアプリとデータが含まれます。

  • metadata パーティション。このパーティションは、デバイスがメタデータ暗号化を使用するときのメタデータ暗号鍵の保存に使用されます。サイズは 16 MB 以上です。暗号化されておらず、データはスナップショットされません。デバイスが出荷時の設定にリセットされると消去されます。このパーティションの使用には厳しい制限があります。

  • vendor パーティション。このパーティションには、AOSP に配布できないあらゆるバイナリが含まれています。デバイスに専有情報が含まれていない場合は、このパーティションを省略できます。

  • vendor_dlkm パーティション。このパーティションは、ベンダー カーネル モジュールの格納専用です。ベンダー カーネル モジュールを(vendor パーティションではなく)vendor_dlkm パーティションに格納することで、vendor パーティションを更新することなくカーネル モジュールを更新できるようになります。

  • radio パーティション。このパーティションは無線イメージを含み、無線固有のソフトウェアを専用パーティションに格納するデバイスにのみ必要です。

  • tos パーティション。このパーティションには Trusty OS のバイナリ イメージが格納されます。デバイスに Trusty が含まれている場合にのみ使用されます。詳細については、TOS パーティションをご覧ください。

  • pvmfw パーティション。このパーティションには、保護された仮想マシンのファームウェア(pvmfw)が含まれます。これは、保護された仮想マシンで実行される最初のコードとなります。詳細については、保護された仮想マシンのファームウェアをご覧ください。

動的パーティション

Android 11 以降を搭載したデバイスは、動的パーティションをサポートできます。動的パーティションは、Android のユーザー空間パーティショニング システムであり、無線(OTA)アップデート時のパーティションの作成、サイズ変更、破棄をサポートします。詳細については、動的パーティションをご覧ください。

クリティカル パーティションの指定

デバイスが動作するために特定のパーティションまたはデータを必要とする場合、これらのパーティションまたはデータを完全に保護されるもの、または再フラッシュ可能なものとして指定する必要があります。つまり、fastboot oem コマンドによる再構築、提供、抽出を行えます。これらのパーティションまたはデータには、デバイスごとの工場固有の設定、シリアル番号、調整データなどがあります。

Android 11 の変更点

Android 11 では、ライブラリへのリンク制限や新しい Soong イメージ バリアントなど、パーティションにいくつかの変更が加えられました。

Android パーティション レイアウト

図 1. Android 11 のパーティション レイアウト

  • シングル システム イメージ(SSI)。system イメージと system_ext イメージを含む新しいコンセプト イメージ。対象デバイスのグループがこれらのパーティションを共有する場合、これらのデバイスは SSI を共有し、system イメージと system_ext イメージのビルドをスキップできます。

  • system_ext パーティション。system リソースを使用できる新しいパーティション。以下のシステム モジュールを含めることができます。

    • AOSP システム モジュールを system パーティションに拡張します。このようなモジュールは、後で system パーティションにインストールできるように、AOSP にストリーミングすることをおすすめします。

    • OEM または SoC 固有のモジュールをバンドルします。そのようなモジュールは、product パーティションまたは vendor パーティションにインストールできるように、分割することをおすすめします。

  • system パーティション。OEM 製品で使用される一般的なシステム イメージ。独自のモジュールを AOSP にアップストリーミングするか、system_ext パーティションに移動することで、これらのモジュールを system パーティションから移動することをおすすめします。

  • product パーティション。このパーティションでは、許可されたインターフェースを使用して、他のパーティションにバンドルされていない製品固有のモジュールをインストールできるようになりました。

VNDK の変更点

Vendor Native Development Kit(VNDK)は、system パーティションにインストールされるライブラリのセットであり、特にベンダーがその HAL を実装するために設計されたものです。

  • Android 10 以前では、vendor パーティションは system パーティション内の VNDK ライブラリにリンクできますが、system パーティション内の他のライブラリにリンクすることはできません。product パーティション内のネイティブ モジュールは、system パーティション内の任意のライブラリにリンクできます。

  • Android 11 以降では、product パーティションと vendor パーティションを system パーティションの VNDK ライブラリにリンクできますが、system パーティション内の他のライブラリにリンクすることはできません。

Soong 製品バリエーション

Soong ビルドシステムは、イメージ バリアントを使用してビルドの依存関係を分割します。ネイティブ モジュール(/build/soong/cc)は、システム プロセス モジュールをコアバリアントに変更し、ベンダー プロセス モジュールをベンダー バリアントに変更できます。1 つのイメージ バリアントのモジュールを他のイメージ バリアントの他のモジュールにリンクすることはできません。

  • Android 10 以前では、システム モジュールはコアバリアントを自動的に作成します。また、Android.bp ファイルで vendor_available: true を定義してベンダー バリアントを作成することもできます。これにより、ベンダー モジュールをシステム モジュールにリンクできます。VNDK ライブラリは system ライブラリのベンダー バリアントです。Android.bp ファイルで vendor_available: true を定義して、ベンダー モジュールのベンダー バリアントを作成することもできます(をご覧ください)。

  • Android 11 では、システム モジュールは vendor_available: true を定義することで、コアバリアントやベンダー バリアントに加えて、プロダクト バリアントも作成できます。

  • Android 12 以降では、vendor_available: true が定義されたシステム モジュールは、コアバリアントに加えて、ベンダー バリアントも作成できます。プロダクト バリアントを作成するには、product_available: true を定義する必要があります。product_available: true が定義されていない一部の VNDK ライブラリは、プロダクト モジュールでは利用できません。