Google は、黒人コミュニティに対する人種平等の促進に取り組んでいます。取り組みを見る

Android12でのBootconfigの実装

Android 12では、bootconfig機能により、Android11以前で使用されていたandroidboot.*カーネルコマンドラインオプションが置き換えられます。 bootconfig機能は、ビルドおよびブートローダーからAndroid12に構成の詳細を渡すためのメカニズムです。

この機能は、Androidユーザースペースの構成パラメーターをカーネルの構成パラメーターから分離する方法を提供します。長いandroidboot.*カーネルパラメータをbootconfigファイルに移動すると、カーネルコマンドラインにスペースが作成され、将来の拡張を容易にするために使用できるようになります。

カーネルとAndroidユーザースペースの両方がbootconfigをサポートしている必要があります。

  • このサポートを備えた最初のリリース:Android 12
  • このサポートを備えた最初のカーネルバージョン:12-5.4.xxカーネル

12-5.10.xxカーネルバージョンで起動する新しいデバイスのbootconfig機能を実装します。デバイスをアップグレードする場合は、実装する必要はありません。

例とソース

このセクションの例とソースコードを見ると、 bootconfigコードの形式は、Android11以前で使用されているカーネルコマンドラインの形式とわずかに異なるだけであることに注意してください。ただし、次の違いは使用法にとって重要です。

  • パラメータは、スペースではなく、改行エスケープシーケンス\nで区切る必要があります。

ブートローダーの例

ブートローダーの例については、CuttlefishU-bootリファレンスブートローダーの実装を参照してください。リファレンスの2つのコミットを以下に示します。 1つ目は、ブートヘッダーバージョンのサポートを最新バージョンにアップレブします。この例では、最初のコミットでバージョンサポートが次のバージョンv4に更新(またはアップレブ)されます。 2番目は2つのことを行います。 bootconfig処理を追加し、実行時にパラメーターを追加する方法を示します。

ビルド例

ベンダーブートヘッダーv4を使用してvendor_boot.imgをビルドするためのmkbootimgの変更を示すビルド例についてはmkbootimg changes for bootconfig参照してください。次のことを行うには、イカの変更を参照してください。

実装

パートナーは、ブートローダーにサポートを追加し、ビルド時のandroidboot.*パラメーターをカーネルコマンドラインからbootconfigファイルに移動する必要があります。この変更を実装する最良の方法は、段階的に実装することです。インクリメンタルプロセスに従う方法については、インクリメンタルの実装と検証のセクションを参照してください。

/ proc / cmdlineファイルでandroidboot.*パラメーターを検索する変更がある場合は、代わりに/ proc/bootconfigファイルをポイントします。 ro.boot.*プロパティは新しいbootconfig値で設定されるため、これらのプロパティを使用してコードを変更する必要はありません。

ビルドの変更

まず、ブートヘッダーのバージョンをバージョン4にアップレブします。

- BOARD_BOOT_HEADER_VERSION := 3

+ BOARD_BOOT_HEADER_VERSION := 4

bootconfigカーネルのcmdlineパラメーターを追加します。これにより、カーネルはbootconfigセクションを検索します。

BOARD_KERNEL_CMDLINE += bootconfig

bootconfigパラメーターは、カーネルコマンドラインがBOARD\_KERNEL\_CMDLINEから作成されるのと同様に、 BOARD_BOOTCONFIG変数のパラメーターから作成されます。

androidboot.*パラメータは、次のようにそのまま移動できます。

- BOARD_KERNEL_CMDLINE += androidboot..selinux=enforcing

+ BOARD_BOOTCONFIG += androidboot..selinux=enforcing

ブートローダーの変更

ブートローダーは、カーネルにジャンプする前にinitramfsをセットアップします。カーネルブート構成はbootconfigセクションを検索し、期待されるトレーラーとともに、 initramfs,の最後にあることを探します。

ブートローダーは、ベンダーのブートイメージヘッダーからvendor_boot.imgレイアウト情報を取得します。

Diagram of bootconfig memory allocation layout

1.Android12bootconfigのメモリ割り当て

ブートローダーは、メモリにbootconfigセクションを作成します。 bootconfigセクションには、次のメモリ割り当てが含まれています。

  • パラメーター
  • 4Bサイズparameters size
  • 4Bサイズparameters checksum
  • 12 B bootconfigマジックストリング( #BOOTCONFIG\n

パラメータは、ビルド時に認識されているパラメータと、ビルド時に認識されていないパラメータの2つのソースから取得されます。不明なパラメータを追加する必要があります。

ビルド時に既知のパラメーターは、bootconfigセクションのvendor_bootイメージの最後にパッケージ化されます。セクションのサイズは、ベンダーブートヘッダーフィールドvendor_bootconfig_sizeに(バイト単位で)格納されます。

ビルド時に認識されないパラメーターは、ブートローダーの実行時にのみ認識されます。これらは、bootconfigトレーラーを適用する前に、bootconfigパラメーターセクションの最後に追加する必要があります。

bootconfigトレーラーが適用された後にパラメーターを追加する必要がある場合は、トレーラーを上書きして再適用します。

インクリメンタルな実装と検証

このセクションに記載されているプロセスに従って、bootconfig機能を段階的に実装します。 bootconfigパラメーターが追加されている間は、カーネルのcmdlineパラメーターは変更されません。

これらは、検証を伴う増分実装の手順です。

  1. ブートローダーを作成して変更を加えてから、次の手順を実行します。
    1. BOARD_BOOTCONFIG変数を使用して、新しいbootconfigパラメーターを追加します。
    2. デバイスが正しく起動し続けることができるように、カーネルのコマンドラインパラメータをそのままにします。これにより、デバッグと検証がはるかに簡単になります。
  2. /proc/bootconfigの内容を確認して、作業を確認します。デバイスの起動後に、新しく追加されたパラメータが表示されることを確認します。
  3. BOARD_BOOTCONFIG変数とブートローダーを使用して、 androidboot.*パラメーターをカーネルBOARD_BOOTCONFIGからbootconfigに移動します。
  4. 各パラメーターが/proc/bootconfigに存在し、 /proc/cmdlineに存在しないことを確認します。これを確認できれば、実装は成功しています。

OTAのアップグレードとダウングレードに関する考慮事項

異なるバージョンのAndroid間、または異なるカーネルバージョン間でOTAのアップグレードとダウングレードを管理する場合は、特別な注意が必要です。

Android 12は、bootconfigをサポートする最初のバージョンです。それ以前のバージョンにダウングレードする場合は、bootconfigの代わりにカーネルコマンドラインパラメーターを使用する必要があります。

カーネルバージョン12-5.4以降はbootconfigをサポートします。それ以前のバージョン(11-5.4を含む)にダウングレードする場合は、カーネルコマンドラインパラメーターを使用する必要があります。

Android11以前からAndroid12以降へのアップグレードでは、カーネルのコマンドラインパラメーターを引き続き使用できます。カーネルバージョンのアップグレードについても同じことが言えます。

トラブルシューティング

検証手順を実行するときに、 /proc/bootconfigに期待されるパラメーターが表示されない場合は、 logcatのカーネルログを確認してください。カーネルがbootconfigをサポートしている場合、bootconfigのログエントリは常に存在します。

ログ出力の例

$ adb logcat | grep bootconfig
02-24 17:00:07.610     0     0 I Load bootconfig: 128 bytes 9 nodes

エラーログが返される場合は、bootconfigの読み込みに問題があります。さまざまなエラータイプを確認するには、 init/main.cを表示します。