Android デバイスには、起動プロセスでさまざまな機能を果たす複数のパーティションが含まれています。
標準パーティション
boot
パーティション。このパーティションはカーネル イメージを含み、mkbootimg
を使用して作成されます。仮想パーティションを使用すると、新しいブート パーティションをフラッシュせずに、任意のイメージを直接フラッシュできます。Android 13 より前にリリースされたデバイスの場合、このパーティションには汎用 RAM ディスクも含まれています。kernel。仮想
kernel
パーティションは、新しいカーネル イメージを古いカーネル イメージに書き込むことで、カーネル(zImage
、zImage-dtb
、Image.gz-dtb
)を上書きします。提供された開発用カーネルに互換性がない場合、vendor
、system
、または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 イメージ バリアントなど、パーティションにいくつかの変更が加えられました。
図 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 ライブラリは、プロダクト モジュールでは利用できません。