Android 9 以降では、Android ビルドシステムを使用した product パーティションの作成をサポートしています。これまで、Android 8.x では Android ビルドシステムで OEM 固有コンポーネント専用のスペースを作成することなく、SoC 固有のコンポーネントを system パーティションから vendor パーティションに強制的に分割していました。Android 9 以降では、さまざまなパーティションの priv-apps に適用できる追加の権限とホワイトリスト登録機能を利用できます。
product パーティションについて
多くの OEM は、AOSP システム イメージをカスタマイズして独自の機能や携帯通信会社の要件を実装しています。ただし、そのようなカスタマイズを行うと、1 つのシステム イメージを複数のソフトウェア SKU に使用できなくなります。異なるロケールや携帯通信会社などのカスタマイズをサポートするには、各イメージが異なっている必要があります。個別の product パーティションを使用してカスタマイズを行うと、1 つのシステム イメージを複数のソフトウェア SKU に使用できます(system パーティションは、多くのソフトウェア SKU 間で共有可能な汎用コードをホストします)。vendor パーティションは、指定された SoC に基づいて複数のデバイス間で共有できる、SoC 固有の BSP コードを引き続きホストしています。
パーティションを分割して使用することには、ディスク容量の管理(一定の容量を将来の拡張に備えて予約しておく必要があります)、パーティション間の安定したアプリケーション バイナリ インターフェース(ABI)の維持などのデメリットがあります。product パーティションを使用する前に、独自の AOSP の実装と、可能な緩和戦術を検討することをおすすめします(たとえば、無線(OTA)アップデート中のデバイスの再パーティショニングがありますが、これは Google ではなく一部の OEM によって行われます)。これには動的パーティショニングが適しています。
product パーティションと権限
Android 9 以降では、権限とホワイトリスト登録プロセスを変更すると、product パーティションで priv-apps に権限を付与する方法に影響します。permissions.xml ファイルは priv-apps と同じパーティションに存在する必要があります。priv-apps 用に permissions.xml ファイルを system パーティションに配置しても、それらの権限は product パーティションの priv-apps には(前者が後者の拡張版であるにもかかわらず)拡張されません。
権限とホワイトリスト登録プロセスの詳細については、特権の許可リストへの登録をご覧ください。
従来の /oem と /product
product パーティションには、プロダクト インターフェースの適用に応じて 2 種類の属性があります。また、product パーティションは、従来の oem パーティションとは異なります。
| パーティション | 属性 |
|---|---|
oem |
|
product |
|
product(適用されるインターフェース) |
|
このような理由から、Android 9 は product パーティションをサポートしながら、従来の oem パーティションに依存するデバイスのために、そのサポートも維持します。product パーティションを system パーティションから切り離すために、Android 11 では product インターフェースの適用をサポートしています。
/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 インターフェースが適用されると、product パーティションは system パーティションと切り離されます。product パーティションは、system パーティションから許可されたインターフェースのみを使用します。
product パーティションは、不安定なインターフェースを介して vendor パーティションに依存することはできません。product パーティションと vendor パーティションが直接やり取りすることは禁止されています
(これは SEpolicy によって強制されます)。
product パーティションを実装する
新しい product パーティションを実装する前に、AOSP の関連する product パーティションの変更を確認してください。product を設定するには、次のボードまたはプロダクト ビルドフラグを含めます。
BOARD_USES_PRODUCTIMAGEBOARD_PRODUCTIMAGE_PARTITION_SIZEBOARD_PRODUCTIMAGE_FILE_SYSTEM_TYPEPRODUCT_PRODUCT_PROPERTIES(/product/build.prop) これらは、PRODUCT_PRODUCT_PROPERTIES += product.abc=okのように、$(call inherit-product path/to/device.mk)内に存在する必要があります。
product パーティションにモジュールをインストールする
product パーティションにモジュールをインストールするには、次のビルドフラグを使用します。
product_specific: true(Android.bp)LOCAL_PRODUCT_MODULE := true(Android.mk)
確認付きブートを有効にする
悪意のあるソフトウェアによる product パーティションの改ざんを防ぐには、そのパーティションの Android の確認付きブート(AVB)を有効にします(vendor パーティションおよび system パーティションと同様)。AVB を有効にするには、次のビルドフラグを含めます。
BOARD_AVB_PRODUCT_ADD_HASHTREE_FOOTER_ARGS.