プロダクト パーティションの作成

Android 9 以降では、Android ビルドシステムを使用した /product パーティションの作成をサポートしています。これまで、Android 8.x では Android ビルドシステムから作成された OEM 固有のコンポーネントに専用スペースを割り当てることなく、SoC 固有のコンポーネントを /system パーティションから /vendor パーティションに分割することを強制していました。Android 9 以降では、さまざまなパーティションの priv-apps に適用できる追加の権限とホワイトリスト登録機能を利用できます。

プロダクト パーティションについて

多くの OEM は、AOSP システム イメージをカスタマイズして独自の機能や携帯通信会社の要件を実装しています。ただし、そのようなカスタマイズを行うと、1 つのシステム イメージを複数のソフトウェア SKU に使用できなくなります。異なるロケールや携帯通信会社などのカスタマイズをサポートするには、各イメージが異なっている必要があります。個別の /product パーティションを使用してカスタマイズを行うと、1 つのシステム イメージを複数のソフトウェア SKU に使用できます(/system パーティションは、多くのソフトウェア SKU 間で共有可能な汎用コードをホストします)。/vendor パーティションは、指定された SoC に基づいて複数のデバイス間で共有できる、SoC 固有の BSP コードを引き続きホストしています。

パーティションを分割して使用することには、ディスク容量の管理(一定の容量を将来の拡張に備えて予約しておく必要があります)、パーティション間の安定したアプリケーション バイナリ インターフェース(ABI)の維持などのデメリットがあります。/product パーティションを使用する前に、独自の AOSP の実装と、可能な緩和戦術を検討することをおすすめします(たとえば、無線(OTA)アップデート中のデバイスの再パーティショニングがありますが、これは Google ではなく一部の OEM によって行われます)。

プロダクト パーティションと権限

Android 9 以降では、権限とホワイトリスト登録プロセスを変更すると、プロダクト パーティションで priv-apps に権限を付与する方法に影響します。permissions.xml ファイルは priv-apps と同じパーティションに存在する必要があります。priv-apps 用に permissions.xml ファイルを /system パーティションに配置しても、それらの権限は /product パーティションの priv-apps には(前者が後者の拡張版であるにもかかわらず)拡張されません。 権限とホワイトリスト登録プロセスの詳細については、特権のホワイトリスト登録を参照してください。

従来の /oem と /product

新しい /product パーティションは、従来の /oem パーティションと次の点で異なります。

パーティション 属性
/oem
  • 更新できません。通常工場で 1 回フラッシュされます。
  • ブランドや色など、わずかな違いごとに作成されます。/oem パーティションの内容が異なっても、製品ソフトウェアが異なるわけではありません。
  • /system パーティションは、/oem パーティションに依存しません(特定のファイルがそこで見つかった場合のみ、/oem パーティションを使用します)。
  • /system パーティションの公開 API のみを使用します。
/product
  • 更新可能
  • システム イメージと一体化されています(一緒に更新されます)
  • プロダクトやプロダクト ファミリーごとに作成されます。
  • システム パーティションは /productパーティションに依存できます。
  • 非公開 API は同時に更新されるため、使用可能です。

このような理由から、Android 9 は新しい /product パーティションをサポートしながら、従来の /oem パーティションに依存するデバイスのために、そのサポートも維持します。

/product のコンポーネント

/product パーティションには、次のコンポーネントが含まれます。

  • プロダクト固有のシステム プロパティ(/product/build.prop
  • プロダクト固有の RRO(/product/overlay/*.apk
  • プロダクト固有のアプリ(/product/app/*.apk
  • プロダクト固有の priv-apps(/product/priv-app/*.apk
  • プロダクト固有のライブラリ(/product/lib/*
  • プロダクト固有の Java ライブラリ(/product/framework/*.jar
  • プロダクト固有の Android フレームワーク システム構成(/product/etc/sysconfig/*/product/etc/permissions/*
  • プロダクト固有のメディア ファイル(/product/media/audio/*
  • プロダクト固有の(bootanimation ファイル)

custom_images は使用不可

custom_images は使用できません。これは次の機能がサポートされていないためです。

  • 特定のターゲットへのモジュールのインストールcustom_images は、アーティファクトをイメージにコピーすることはサポートしていますが、ビルドルールの一部としてターゲット パーティションを指定して、モジュールを特定のパーティションにインストールすることはできません。
  • Soong のサポート。Soong ビルドシステムを使用して custom_images を作成することはできません。
  • OTA アップデートのサポートcustom_images は、OTA アップデートを受信できないファクトリー ROM イメージとして使用されます。

パーティション間の ABI の維持

Android 9 の /product パーティションは、/system パーティションの拡張版です。/product/system の間には弱い ABI があるため、両方を同時にアップグレードする必要があり、ABI はシステム SDK ベースである必要があります。システム SDK が、/product/system の間のすべての API サーフェスをカバーしていない場合、OEM は 2 つのパーティション間の ABI を維持する必要があります。

/product パーティションと /system パーティションは、相互に依存関係を持つことができます。ただし、汎用システム イメージ(GSI)は、/product パーティションなしで正しく動作する必要があります。

/product パーティションは、/vendor パーティションに依存することはできません。/product パーティションと /vendor パーティションが直接やり取りすることは禁止されています (これは SEpolicy によって強制されます)。

プロダクト パーティションの実装

新しいプロダクト パーティションを実装する前に、AOSP の関連するプロダクト パーティションの変更を確認してください。/product を設定するには、次のボードまたはプロダクト ビルドフラグを含めます。

  • BOARD_USES_PRODUCTIMAGE
  • BOARD_PRODUCTIMAGE_PARTITION_SIZE
  • BOARD_PRODUCTIMAGE_FILE_SYSTEM_TYPE
  • /product/build.prop 用の PRODUCT_PRODUCT_PROPERTIES。 これらは、PRODUCT_PRODUCT_PROPERTIES += product.abc=ok のように、$(call inherit-product path/to/device.mk) 内に存在する必要があります。

product パーティションへのモジュールのインストール

product パーティションにモジュールをインストールするには、次のビルドフラグを使用します。

  • Android.bpproduct_specific: true
  • Android.mkLOCAL_PRODUCT_MODULE := true

確認付きブートの有効化

悪意のあるソフトウェアによる /product パーティションの改ざんを防ぐには、そのパーティションの Android の確認付きブート(AVB)を有効にします(/vendor パーティションおよび /system パーティションと同様)。AVB を有効にするには、次のビルドフラグを含めます。 BOARD_AVB_PRODUCT_ADD_HASHTREE_FOOTER_ARGS