記事ディレクトリ
前の 2 つの記事:
それぞれ動的パーティションと仮想 A/B パーティションのデバッグに最も一般的に使用されるツール、snapshotctl と dmctl を紹介しますこの記事では、BootControl HAL インターフェイスを設定するために特別に使用されるツール、bootctl (ブート コントロール) を紹介します。
このツールの最も一般的な使用場所は、A/B システムのスロット ステータスを確認し、Android システムのコマンド ラインでシステムを切り替えることです。
基本的な使い方は「Android A/B System OTA解析(3)本体システムとブートローダーの通信」で紹介しましたが、本記事ではこのツールについて詳しく紹介しています。
この記事は Rocky Watching the World (guyongqiangx) のオリジナルです。転載の場合は出典を示してください。
記事リンク: https://guyongqiangx.blog.csdn.net/article/details/129310109
この記事は Android バージョン android-11.0.0_r21 に基づいていますが、それ以降のバージョンも同様です。
オンライン コード: http://aospxref.com/android-11.0.0_r21/
1. bootctl のコンパイル
デフォルトでは、bootctl はシステムにコンパイルされません。デバイス ディレクトリの対応する makefilePRODUCT_PACKAGES
の変数。
追加方法がわからない場合は、デバイス ディレクトリで grep コマンドを実行して、Google の参照デバイスがどのように追加されているかを確認してください。
たとえば、Android 11 のクロスハッチ デバイスでは、次のPRODUCT_PACKAGES_DEBUG
ように。
http://aospxref.com/android-11.0.0_r21/raw/device/google/crosshatch/device.mk
# The following modules are included in debuggable builds only.
PRODUCT_PACKAGES_DEBUG += \
bootctl \
update_engine_client
ここにあるのでPRODUCT_PACKAGES_DEBUG
、bootctl は userdebug ビルドにのみ含まれています。
他のバージョンに bootctl を含めたい場合は、bootctlPRODUCT_PACKAGES
を に。
2. bootctl のヘルプ情報
bootctl のコマンドは比較的直感的で、基本的に名前と意味を確認できます。
console:/ # bootctl -h
bootctl - command-line wrapper for the boot HAL.
Usage:
bootctl COMMAND
Commands:
hal-info - Show info about boot_control HAL used.
get-number-slots - Prints number of slots.
get-current-slot - Prints currently running SLOT.
mark-boot-successful - Mark current slot as GOOD.
set-active-boot-slot SLOT - On next boot, load and execute SLOT.
set-slot-as-unbootable SLOT - Mark SLOT as invalid.
is-slot-bootable SLOT - Returns 0 only if SLOT is bootable.
is-slot-marked-successful SLOT - Returns 0 only if SLOT is marked GOOD.
get-suffix SLOT - Prints suffix for SLOT.
set-snapshot-merge-status STAT - Sets whether a snapshot-merge of any dynamic
partition is in progress. Valid STAT values
are: none, unknown, snapshotted, merging,
or cancelled.
get-snapshot-merge-status - Prints the current snapshot-merge status.
SLOT parameter is the zero-based slot-number.
Android 11 に 2 つの新しいコマンドが追加されました。
set-snapshot-merge-status STAT
get-snapshot-merge-status
これら 2 つのコマンドは、仮想 A/B パーティションのスナップショット ステータスを設定および表示するために特別に使用されます。
BootControl HAL インターフェイスに関する具体的な情報については、次の 2 つの記事を参照してください。
- 「Android A/B System OTA解析 (3) メインシステムとブートローダー間の通信」
- 「Android仮想パーティションの詳細解説(5) BootControlインターフェースの変更点」
前回の記事では BootControl のコード実装を分析し、後の記事では仮想 A/B パーティションをサポートするための BootControl インターフェイス上のシステムの変更を分析しました。
3. bootctl の使い方
以下は、デバイスでの bootctl コマンドの一般的な使用方法です。
1.物情報
現在の IBootControl インターフェイスの HAL 情報を表示する Hal-info コマンド:
- Android 7.1 システムで hal-info コマンドを実行します。
console:/ # bootctl hal-info
HAL name: boot control hal for bcm platform
HAL author: Broadcom
HAL module version: 0.1
- Android 11 で hal-info コマンドを実行する
console:/ # bootctl hal-info
HAL Version: [email protected]::IBootControl
2. get-number-slots
get-number-slots は、現在のシステムのスロット数を出力するために使用され、A/B システムには通常 2 つあります。
console:/ # bootctl get-number-slots
2
3. get-current-slot
get-current-slot は、現在システムで実行中のスロット (slot) を出力するために使用されます。
console:/ # bootctl get-current-slot
1
A/B システムは通常、0 と 1 の 2 つのスロットで構成され、ここでのシステムはスロット 1 で実行されます。
4.マーク-ブート-成功
mark-boot-successful 現在実行中のシステムを正常に起動したとマークします
console:/ # bootctl mark-boot-successful
5. set-active-boot-slot
set-active-boot-slot システムの次のブート用のスロットを設定します。
console:/ # bootctl get-current-slot
1
これは、現在のシステムがスロット 1 (B スロット) で実行されていることを示しています。
console:/ # bootctl set-active-boot-slot 0
別のスロット 0 (A スロット) が次回の起動用に設定されます。
fastboot を介してコマンドを実行するのと同じです。
fastboot set_active a
6. set-slot-as-unbootable
set-slot-as-unbootable は、対応するスロットを起動不可能としてマークします。
次のコマンドは、スロット 0 (A スロット) を無効で起動できないものとしてマークします。
console:/ # bootctl set-slot-as-unbootable 0
7. is-slot-bootable
is-slot-bootable コマンドを使用して、指定したスロットを起動できるかどうかを確認します
指定されたスロットが起動できる場合は 0 を返し、コマンドが正常に終了するとコンソールに表示されます。
指定したスロットが起動できない場合、コンソールにコマンドの異常終了として表示されます。
console:/ # bootctl is-slot-bootable 1
console:/ # bootctl is-slot-bootable 0
70|console:/ #
上記のコマンドでは、スロット 1 は正常に起動できますが (コマンドは正常に終了します)、スロット 0 は起動できません (コマンドが異常終了します)。
8. is-slot-marked-successful
is-slot-marked-successful は、対応するスロットが正常に開始されたとマークされているかどうかを返します
指定されたスロットが正常に開始されたとマークされている場合は 0 を返します。これは、コマンドが正常に終了したときにコンソールに表示されます。
指定されたスロットが正常に開始されたとマークされていない場合は、コマンドが異常終了したとしてコンソールに表示されます。
console:/ # bootctl is-slot-marked-successful 1
console:/ #
console:/ # bootctl is-slot-marked-successful 0
70|console:/ #
ここでの実行結果は、スロット 1 が正常に開始されたとマークされ、スロット 0 が正常に開始されたとマークされていないことを示しています。
9. 取得サフィックス
get-suffix は、指定されたスロットのサフィックスを返します
console:/ # bootctl get-suffix 0
_a
console:/ # bootctl get-suffix 1
_b
ここでは、システムの 2 つのスロットの接尾辞がそれぞれ_a
と_b
。
10. set-snapshot-merge-status
set-snapshot-merge-status システムの現在のマージ ステータスを設定します。Android 11 以降に適用されます。
操作の有効な値は、none、unknown、snapshotted、merging、および cancel です。
console:/ # bootctl get-snapshot-merge-status
none
console:/ # bootctl set-snapshot-merge-status unknown
console:/ # bootctl get-snapshot-merge-status
unknown
console:/ # bootctl set-snapshot-merge-status cancelled
console:/ # bootctl get-snapshot-merge-status
cancelled
console:/ # bootctl set-snapshot-merge-status active
bootctl - command-line wrapper for the boot HAL.
Usage:
bootctl COMMAND
Commands:
hal-info - Show info about boot_control HAL used.
get-number-slots - Prints number of slots.
get-current-slot - Prints currently running SLOT.
mark-boot-successful - Mark current slot as GOOD.
set-active-boot-slot SLOT - On next boot, load and execute SLOT.
set-slot-as-unbootable SLOT - Mark SLOT as invalid.
is-slot-bootable SLOT - Returns 0 only if SLOT is bootable.
is-slot-marked-successful SLOT - Returns 0 only if SLOT is marked GOOD.
get-suffix SLOT - Prints suffix for SLOT.
set-snapshot-merge-status STAT - Sets whether a snapshot-merge of any dynamic
partition is in progress. Valid STAT values
are: none, unknown, snapshotted, merging,
or cancelled.
get-snapshot-merge-status - Prints the current snapshot-merge status.
SLOT parameter is the zero-based slot-number.
64|console:/ #
上記の最後の操作で、マージ ステータスをアクティブの無効な値に設定しようとして失敗しました。
11. get-snapshot-merge-status
get-snapshot-merge-status 現在のシステムのマージ ステータスを取得します。Android 11 以降に適用されます。
console:/ # bootctl get-snapshot-merge-status
none
4. 考える質問
IBootContol によって定義された HAL インターフェイスが実装され、いくつかの場所で使用されます。
-
Android のメイン システムは IBootControl インターフェイスを実装し、BootControl Service を介して上位層にサービスを提供します。これには、Update Engine や bootctl ツールが含まれます。
-
IBootControl の対応する構造はブートローダーに実装され、ブートローダー (通常は misc パーティション) の IBootControl によって外部デバイス (フラッシュ、eMMC) に格納されたデータを操作するために使用されます。
fastboot ツールの一部のスロット関連の操作は、ブートローダーによって実装された IBootControl インターフェイスを通じても機能します。
ここで質問なのですが、bootctl ツール コマンドに対応する fastboot コマンドをご存知ですか?
5. その他
これまで、次のような Android OTA アップグレード関連のトピックについて書いてきました。
- 基本紹介:「Android A/B System」シリーズ
- コアモジュール: 「Android Update Engine Analysis」シリーズ
- 動的パーティション: 「Android 動的パーティション」シリーズ
- Virtual A/B:「Android Virtual A/B Partition」シリーズ
- アップグレードツール:「Android OTA関連ツール」シリーズ
Android OTA アップグレードに関するこれらの記事の詳細については、「Android OTA アップグレード シリーズ コラム記事の紹介」を参照してください。
すでに動的パーティションと仮想パーティションの有料コラムを購読している場合は、必ず WeChat に私を追加し、購読アカウントをメモして、「動的パーティションと仮想パーティションのコラム VIP Q&A グループ」に引き込んでください。A/B システム、動的パーティション、仮想パーティション、さまざまな OTA アップグレード、および署名に関する質問に、都合のよいときにお答えします。
さらに、現在 400 人以上の友人を持つ Android OTA アップグレード ディスカッション グループがあり、主に携帯電話、車載機器、テレビ、セットトップ ボックス、タブレットなどのさまざまなデバイスの OTA アップグレードに関するトピックについて話し合っています。 OTA アップグレード作業、ようこそ グループに参加して一緒にコミュニケーションをとってください。WeChat に私を追加する際は、「Android OTA ディスカッション グループ」と指定してください。このグループは Android OTA 開発者に限定されています~
公式アカウント「Rocky Watching the World」の舞台裏で「wx」と返信すると、個人の WeChat を取得できます。