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 ライブラリは、プロダクト モジュールでは利用できません。