Android 11 では、汎用カーネル イメージ(GKI)とベンダー ブート パーティションという概念が導入されています。ベンダー ブート パーティションは、GKI と互換性のあるカーネル モジュールを格納し、第 1 ステージの init により読み込まれます。Android 11 より前のリリースでは、カーネル モジュールはベンダー パーティションと ODM パーティションに格納され、ベンダー プロセスによって読み込まれます。
Android 11 以降では、カーネルとすべてのカーネル モジュールを、他のパーティションから独立して更新できます。ベンダー パーティションに格納されたカーネル モジュールの更新を(ベンダー パーティションを更新せずに)有効にするには、すべてのベンダー パーティション モジュールを Vendor DLKM(動的に読み込み可能なカーネル モジュール)という新しいパーティションに移動します。このパーティションは個別に更新できます。同様に、ODM パーティションに保存されているすべてのカーネル モジュールを ODM DLKM という新しいパーティションに移動できます。このパーティションも個別に更新できます。
パーティションの場所
vendor_dlkm
パーティションと odm_dlkm
パーティションは、別の動的パーティションとして super パーティションに配置されています。
/vendor/lib/modules の vendor_dlkm の内容
- ベンダー カーネル モジュール
modprobe
構成ファイルmodules.load
ファイル
/odm/lib/modules の odm_dlkm の内容
- ODM カーネル モジュール
modprobe
構成ファイルmodules.load
ファイル
カーネル モジュールの構成ファイルの詳細については、カーネル モジュールのサポートをご覧ください。
ビルドサポート
vendor_dlkm
と odm_dlkm
をビルドするプロセスは、他の動的パーティションをビルドするプロセスと同様です。
vendor_dlkm ビルドの例
以下の例のように vendor_dlkm
をビルドします。
BoardConfig.mk
BOARD_USES_VENDOR_DLKMIMAGE := true
BOARD_VENDOR_DLKMIMAGE_FILE_SYSTEM_TYPE := ext4
TARGET_COPY_OUT_VENDOR_DLKM := vendor_dlkm
BOARD_<GROUP_NAME>_PARTITION_LIST += vendor_dlkm
<GROUP_NAME>
は、所定の更新グループの適切な名前に置き換えます。更新グループは、ベンダー パーティションが属するグループである必要があります。
A/B デバイスと仮想 A/B デバイスの場合: device.mk
AB_OTA_PARTITIONS += vendor_dlkm
fstab
次のように vendor_dlkm
のエントリを fstab に追加します。デバイスに応じてフラグを変更します。CL の CF に vendor_dlkm
を追加するを例として使用します。
vendor_dlkm /vendor_dlkm ext4 noatime,ro,errors=panic wait,logical,first_stage_mount,slotselect,avb
odm_dlkm ビルドの例
以下の例のように odm_dlkm
をビルドします。
BoardConfig.mk
BOARD_USES_ODM_DLKIMAGE := true
BOARD_ODM_DLKIMAGE_FILE_SYSTEM_TYPE := ext4
TARGET_COPY_OUT_ODM_DLKM := odm_dlkm
BOARD_<group_name>_PARTITION_LIST += odm_dlkm
A/B デバイスと仮想 A/B デバイスの場合: device.mk
AB_OTA_PARTITIONS += odm_dlkm
fstab
次のように odm_dlkm
のエントリを fstab に追加します。デバイスに応じてフラグを変更します。CL の CF に odm_dlkm
を追加するを例として使用します。
odm_dlkm /odm_dlkm ext4 noatime,ro,errors=panic wait,logical,first_stage_mount,slotselect,avb
カーネル モジュールをパーティションにコピーする
vendor_dlkm
パーティションにコピーするカーネル モジュールを選択するには、そのパーティションを BOARD_VENDOR_KERNEL_MODULES
にリストします。
modules.load
の内容をオーバーライドする場合は、BOARD_VENDOR_KERNEL_MODULES_LOAD
で指定します。
ビルド時に、BOARD_VENDOR_KERNEL_MODULES
にリストされているモジュールが $ANDROID_PRODUCT_OUT/vendor_dlkm/lib/modules
にインストールされます。/vendor_dlkm/lib/modules
へのシンボリック リンクが /vendor/lib/modules
に作成されます。
同様に、odm_dlkm
パーティションにコピーするカーネル モジュールを選択するには、そのパーティションを BOARD_ODM_KERNEL_MODULES
にリストします。プラットフォーム ビルドは、これらのモジュールに対して depmod
を実行し、depmod
出力ファイルをイメージにコピーします。ビルドにより modules.load
ファイルが作成され、イメージに格納されます。このファイルには、BOARD_ODM_KERNEL_MODULES
にリストされているすべてのモジュールが含まれています。
modules.load
の内容をオーバーライドする場合は、BOARD_ODM_KERNEL_MODULES_LOAD
で指定します。
ビルド時に、BOARD_ODM_KERNEL_MODULES
にリストされているモジュールが $ANDROID_PRODUCT_OUT/odm_dlkm/lib/modules
にインストールされます。/odm_dlkm/lib/modules
へのシンボリック リンクが /odm/lib/modules
に作成されます。
ベンダー モジュールと ODM カーネル モジュールには、常に /vendor/lib/modules
と /odm/lib/modules
を使用します。
/vendor_dlkm/lib/modules は使用しないでください。vendor_dlkm
パーティションのないデバイスでこれを行うと、BOARD_VENDOR_KERNEL_MODULES
が直接 /vendor/lib/modules
にインストールされます。/vendor_dlkm/lib/modules
は存在しないため、問題が発生します。
/odm_dlkm/lib/modules
は使用しません。odm_dlkm
パーティションのないデバイスでこれを行うと、BOARD_ODM_KERNEL_MODULES
が直接 /odm/lib/modules
にインストールされます。/odm_dlkm/lib/modules
は存在しないため、問題が発生します。
パーティションのマウントとモジュールの読み込み
first_stage_init
の間に、vendor_dlkm
パーティションと odm_dlkm
パーティションはそれぞれ /vendor_dlkm
ディレクトリと /odm_dlkm
ディレクトリにマウントされます。これが行われた時点で、/vendor/lib/modules
と /odm/lib/modules
のシンボリック リンクが利用可能になります。
その後、ベンダー プロセス(.rc
スクリプトなど)は modules.load
で指定された順序に基づいてカーネル モジュールを読み込めるようになります。そのベンダー プロセスは、必要に応じて後でモジュールを読み込むこともできます。
関連ドキュメント
ベンダー ブート パーティション(ベンダー RAM ディスクを含む)の作成に関するドキュメントについては、カーネル モジュールのサポートをご覧ください。