Androidデバイスには、起動プロセスでさまざまな機能を提供するいくつかのパーティションが含まれています。
標準パーティション
boot
パーティション。このパーティションには、mkbootimg
を使用して結合されたカーネルイメージとramdiskイメージが含まれています。仮想パーティションを使用して、新しいブートパーティションをフラッシュせずに、いずれかのイメージを直接フラッシュできます。カーネル。仮想
kernel
パーティションは、古いカーネルイメージの上に新しいカーネルイメージを書き込むことにより、カーネル(zImage
、zImage-dtb
、Image.gz-dtb
)を上書きします。提供されている開発カーネルに互換性がない場合は、vendor
、system
、またはdtb
パーティション(存在する場合)を関連するカーネルモジュールで更新する必要がある場合があります。ramdisk。仮想
ramdisk
パーティションは、古いramdiskイメージの上に新しいramdiskイメージを書き込むことにより、ramdiskを上書きします。
上書き操作は、eMMC内の既存のイメージの開始位置を決定し、新しいイメージをその位置にコピーします。新しいイメージ(カーネルまたはRAMディスク)は、既存のイメージよりも大きい場合があります。スペースを確保するために、ブートローダーはイメージに続いてデータを移動したり、エラーで操作を中止したりできます。
system
パーティション。このパーティションにはAndroidフレームワークが含まれています。odm
パーティション。このパーティションには、システムオンチップ(SoC)ベンダーのボードサポートパッケージ(BSP)に対するオリジナルデザインメーカー(ODM)のカスタマイズが含まれています。このようなカスタマイズにより、ODMはSoCコンポーネントを置き換えたりカスタマイズしたり、ボード固有のコンポーネント、デーモン、およびハードウェア抽象化レイヤー(HAL)上のODM固有の機能用のカーネルモジュールを実装したりできます。このパーティションはオプションです。通常、デバイスが複数のハードウェアSKUに単一のベンダーイメージを使用できるように、カスタマイズを含めるために使用されます。詳細については、 ODMパーティションを参照してください。odm_dlkm
パーティション。このパーティションは、ODMカーネルモジュールの保存専用です。 (odm
パーティションではなく)odm_dlkm
パーティションにODMカーネルモジュールを保存すると、odm
パーティションを更新せずにODMカーネルモジュールを更新できます。recovery
パーティション。このパーティションには、OTAプロセス中に起動されるリカバリイメージが格納されます。シームレスな更新をサポートするデバイスは、リカバリイメージを(個別のイメージではなく)ブートイメージに含まれるRAMディスクとして保存できます。cache
パーティション。このパーティションは一時データを保存し、デバイスがシームレスな更新を使用する場合はオプションです。キャッシュパーティションは、ブートローダーから書き込み可能である必要はありませんが、消去可能である必要があります。パーティションサイズは、デバイスの種類とuserdata
の空き容量によって異なります。通常、50 MB〜100MBで十分です。misc
のパーティション。このパーティションはリカバリパーティションによって使用され、4KB以上です。userdata
パーティション。このパーティションには、ユーザーがインストールしたアプリと、カスタマイズデータを含むデータが含まれています。metadata
パーティション。このパーティションは、デバイスがメタデータ暗号化を使用するときにメタデータ暗号化キーを格納するために使用されます。サイズは16MB以上です。暗号化されておらず、データのスナップショットも作成されていません。デバイスが工場出荷時にリセットされると消去されます。このパーティションの使用は厳しく制限されています。vendor
パーティション。このパーティションには、AOSPに配布できないバイナリが含まれています。デバイスに専有情報が含まれていない場合は、このパーティションを省略できます。vendor_dlkm
パーティション。このパーティションは、ベンダーカーネルモジュールの保存専用です。 (vendor
パーティションではなく)vendor_dlkm
パーティションにベンダーカーネルモジュールを保存すると、vendor
パーティションを更新せずにカーネルモジュールを更新できます。radio
パーティション。このパーティションには無線イメージが含まれており、専用パーティションに無線固有のソフトウェアを備えた無線を含むデバイスにのみ必要です。tos
パーティション。このパーティションは、Trusty OSのバイナリイメージを格納し、デバイスにTrustyが含まれている場合にのみ使用されます。詳細については、 TOSパーティションを参照してください。
動的パーティション
Android 11以降を実行しているデバイスは、動的パーティションをサポートできます。動的パーティションは、Androidのユーザースペースパーティションシステムであり、無線(OTA)更新中にパーティションを作成、サイズ変更、または破棄できます。詳細については、動的パーティションを参照してください。
重要なパーティションの指定
デバイスの実行に特定のパーティションまたはデータが必要な場合は、それらのパーティション/データを完全に保護または再フラッシュ可能として指定する必要があります。つまり、 fastboot oem
コマンドを使用して、それらを再構築、提供、または抽出できます。これには、デバイスごとの工場固有の設定、シリアル番号、キャリブレーションデータなどのデータが含まれます。
Android11での変更
Android 11には、ライブラリへのリンクの制限や新しいSoongイメージバリアントなど、パーティションに対する多数の変更が含まれています。
図1.Android11のパーティションレイアウト
シングルシステムイメージ(SSI)。
system
イメージとsystem_ext
イメージを含む新しい概念イメージ。これらのパーティションがターゲットデバイスのセットに共通である場合、それらのデバイスはSSIを共有し、system
およびsystem_ext
イメージの構築をスキップできます。system_ext
パーティション。system
リソースを使用でき、次のようなシステムモジュールを含めることができる新しいパーティション。system
パーティション内のAOSPシステムモジュールを拡張します。このようなモジュールをAOSPにアップストリームして、後でsystem
パーティションにインストールできるようにすることをお勧めします。OEMまたはSoC固有のモジュールをバンドルします。このようなモジュールをバンドル解除して、
product
またはvendor
のパーティションにインストールできるようにすることをお勧めします。
system
パーティション。 OEM製品に使用される一般的なシステムイメージ。プロプライエタリモジュールをAOSPにアップストリームするか、system_ext
パーティションに移動することにより、system
パーティションから移動することをお勧めします。product
パーティション。このパーティションは、許可されたインターフェイスを使用して、他のパーティションにバンドルされていない製品固有のモジュールをインストールできるようになりました。
VNDKの変更
ベンダーネイティブ開発キット(VNDK)は、 system
パーティションにインストールされ、ベンダーがHALを実装するために専用に設計されたライブラリのセットです。
Android 10以前では、
vendor
パーティションはsystem
パーティション内のVNDKライブラリにリンクできますが、system
パーティション内の他のライブラリにリンクすることはできません。product
パーティション内のネイティブモジュールは、system
パーティション内の任意のライブラリにリンクできます。Android 11以降では、
product
とvendor
のパーティションはsystem
system
内の他のライブラリにリンクすることはできません。
Soong製品のバリエーション
Soongビルドシステムは、イメージバリアントを使用してビルドの依存関係を分割します。ネイティブモジュール( /build/soong/cc
)は、システムプロセスモジュールをコアバリアントに、ベンダープロセスモジュールをベンダーバリアントに変更できます。あるイメージバリアントのモジュールは、別のイメージバリアントの他のモジュールにリンクできません。
Android 10以前では、システムモジュールがコアバリアントを自動的に作成します。また、
Android.bp
ファイルでvendor_available: true
を定義することにより、ベンダーバリアントを作成することもできます。これにより、ベンダーモジュールをシステムモジュールにリンクできます。system
ライブラリのベンダーバリアントであるVNDKライブラリは、Android.bp
ファイルでvendor_available: true
を定義することにより、ベンダーモジュールのベンダーバリアントを作成することもできます(例を参照)。Android 11以降では、システムモジュールは、
vendor_available: true
を定義することにより、(コアバリアントとベンダーバリアントに加えて)製品バリアントを作成することもできます。