概要

Androidデバイスには、起動プロセスでさまざまな機能を提供するいくつかのパーティションが含まれています。

標準パーティション

  • bootパーティション。このパーティションには、 mkbootimgを使用して結合されたカーネルイメージとramdiskイメージが含まれています。仮想パーティションを使用して、新しいブートパーティションをフラッシュせずに、いずれかのイメージを直接フラッシュできます。

    • カーネル。仮想kernelパーティションは、古いカーネルイメージの上に新しいカーネルイメージを書き込むことにより、カーネル( zImagezImage-dtbImage.gz-dtb )を上書きします。提供されている開発カーネルに互換性がない場合は、 vendorsystem 、または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イメージバリアントなど、パーティションに対する多数の変更が含まれています。

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

図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以降では、 productvendorのパーティションは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を定義することにより、(コアバリアントとベンダーバリアントに加えて)製品バリアントを作成することもできます。