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

Fastboot をユーザー空間に移動する

Android 10 では、fastboot の実装をブートローダーからユーザー空間に移動することで、サイズ変更可能なパーティションのサポートを追加しました。この再配置により、ハードウェア抽象化レイヤ(HAL)によって実装された fastBoot のベンダー固有の部分のみを使用して、保守可能でテスト可能な共通の場所にフラッシュ コードを移動できます。

統合された fastboot とリカバリ

ユーザー空間 fastboot とリカバリは似ているため、1 つのパーティションまたはバイナリに統合できます。この機能の利点として、使用するスペースが少なくなること、全体のパーティション数が少なくなること、さらに fastboot とリカバリがカーネルとライブラリを共有できるようになることが挙げられます。

fastbootd をサポートするには、ブートローダーが boot-fastboot の新しいブート コントロール ブロック(BCB)コマンドを実装する必要があります。fastbootd モードを実行するには、ブートローダーで boot-fastboot を BCB メッセージのコマンド フィールドに書き込み、BCB の recovery フィールドはそのままにしておく必要があります(それにより、中断されたリカバリタスクを再開できます)。statusstagereserved の各フィールドもそのまま残ります。 ブートローダーは、BCB コマンドに boot-fastboot が出現すると、リカバリ イメージを読み込み起動します。その後、リカバリで BCB メッセージが解析され、fastbootd モードに切り替わります。

新しい adb コマンド

このセクションでは、fastbootd を統合するために必要な追加の adb コマンドについて説明します。コマンドを実行するのがシステムであるかリカバリであるかによって、このコマンドの動作が異なります。

コマンド 説明
reboot fastboot
  • fastbootd(システム)に再起動します。
  • 再起動(リカバリ)なしで直接 fastbootd に入ります。

新しい fastboot コマンド

このセクションでは、fastbootd を統合するために必要な追加の fastboot コマンドについて説明します。論理パーティションのフラッシュや管理に使用する新しいコマンドについてもここで説明します。 一部のコマンドについては、そのコマンドを実行するのがブートローダーであるか fastbootd であるかによって、動作が異なります。

コマンド 説明
reboot recovery
  • リカバリ(ブートローダー)に再起動します。
  • 再起動(fastbootd)なしで直接リカバリに入ります。
reboot fastboot fastbootd に再起動します。
getvar is-userspace
  • 「yes」(fastbootd)を返します。
  • 「no」(ブートローダー)を返します。
getvar is-logical:<partition> 指定されたパーティションが論理パーティションである場合は「yes」を返し、それ以外の場合は「no」を返します。論理パーティションは、以下のすべてのコマンドをサポートします。
getvar super-partition-name スーパー パーティションの名前を返します。スーパー パーティションが A/B パーティションの場合は(通常はそのようにならない)、現在のスロット サフィックスがこの名前に含まれます。
create-logical-partition <partition> <size> 指定した名前とサイズで論理パーティションを作成します。この名前は論理パーティションとしてすでに存在しているものであってはなりません。
delete-logical-partition <partition> 指定した論理パーティションを削除(実際にはパーティションをワイプ)します。
resize-logical-partition <partition> <size> 論理パーティションの内容を変更せずに、新しいサイズに変更します。 サイズ変更の実行に十分な空き領域がない場合は失敗します。
update-super <partition> スーパー パーティション メタデータに変更をマージします。マージができない場合(たとえば、デバイスの形式がサポートされていない場合など)、このコマンドは失敗します。オプションの「wipe」パラメータを使用した場合、マージを実行する代わりに、デバイスのメタデータを上書きします。

fastbootd は、引き続き次の既存の fastboot コマンドをサポートします。

コマンド 説明
flash <partition> [ <filename> ] フラッシュ パーティションにファイルを書き込みます。デバイスはロック解除状態でなければなりません。
erase <partition> パーティションを消去します(セキュアな消去である必要はありません)。デバイスはロック解除状態でなければなりません。
getvar <variable> | all ブートローダー変数、またはすべての変数を表示します。変数が存在しない場合はエラーを返します。
set_active <slot>

指定した A/B ブートスロットをアクティブに設定します。システムは次のブート時に、指定したスロットから起動します。

A/B サポートの場合、スロットは独立した起動が可能なパーティションの重複セットです。スロットは ab のように名前がつけられます。これらはパーティション名に接尾辞 _a_b などを付けることで区別されます。

reboot デバイスは通常どおりに再起動します。
reboot-bootloader(または reboot bootloader デバイスをブートローダーに再起動します。

ブートローダーの変更

ブートローダーは引き続きブートローダー、無線、ブート/リカバリの各パーティションのフラッシュをサポートし、その後、デバイスは fastboot(ユーザー空間)で起動し、他のすべてのパーティションをフラッシュします。ブートローダーは、次のコマンドをサポートしている必要があります。

コマンド 説明
download フラッシュに画像をダウンロードします。
flash recovery <image>/ flash boot <image>/ flash bootloader <image>/ リカバリ / ブート パーティションとブートローダーをフラッシュします。
reboot デバイスを再起動します。
reboot fastboot fastboot に再起動します。
reboot recovery リカバリに再起動します。
getvar リカバリ / ブートイメージ(current-slotmax-download-sizeなど)のフラッシュに必要なブートローダー変数を取得します。
oem OEM によって定義されたコマンド。

ブートローダーで動的パーティションのフラッシュを許可してはいけません。また、Partition should be flashed in fastbootd というエラーを返す必要があります。レトロフィットされた動的パーティション デバイスの場合、fastboot ツールは、ブートローダー モードで動的パーティションを直接フラッシュするための強制モードをサポートします。ブートローダーはこの操作をサポートできます。たとえば、system がレトロフィットされたデバイスの動的パーティションである場合、fastboot --force flash system を使用するとブートローダーは fastbootd の代わりにパーティションをフラッシュできるようになります。この強制モードは出荷時点のフラッシュを柔軟に行うためのもので、デベロッパーにはおすすめしません。

fastboot OEM HAL

ブートローダーの fastboot を完全に置き換えるには、fastboot が既存のすべての fastboot コマンドを処理する必要があります。これらのコマンドの多くは OEM から提供され、ドキュメント化されていますが、カスタム実装が必要です(OEM 独自のコマンドも多く、このようなコマンドはドキュメント化されていません)。このようなコマンドを処理するため、fastboot HAL は必要な OEM コマンドを指定し、OEM が独自のコマンドを実装できるようにします。

fastboot HAL の定義は次のとおりです。

import IFastbootLogger;

    /**
     * IFastboot interface implements vendor specific fastboot commands.
     */
    interface IFastboot {
        /**
         * Returns a bool indicating whether the bootloader is enforcing verified
         * boot.
         *
         * @return verifiedBootState True if the bootloader is enforcing verified
         * boot and False otherwise.
         */
        isVerifiedBootEnabled() generates (bool verifiedBootState);

        /**
         * Returns a bool indicating the off-mode-charge setting. If off-mode
         * charging is enabled, the device autoboots into a special mode when
         * power is applied.
         *
         * @return offModeChargeState True if the setting is enabled and False if
         * not.
         */
        isOffModeChargeEnabled() generates (bool offModeChargeState);

        /**
         * Returns the minimum battery voltage required for flashing in mV.
         *
         * @return batteryVoltage Minimum battery voltage (in mV) required for
         * flashing to be successful.
         */
        getBatteryVoltageFlashingThreshold() generates (int32_t batteryVoltage);

        /**
         * Returns the file system type of the partition. This is only required for
         * physical partitions that need to be wiped and reformatted.
         *
         * @return type Can be ext4, f2fs or raw.
         * @return result SUCCESS if the operation is successful,
         * FAILURE_UNKNOWN if the partition is invalid or does not require
         * reformatting.
         */
        getPartitionType(string partitionName) generates (FileSystemType type, Result result);

        /**
         * Executes a fastboot OEM command.
         *
         * @param oemCmdArgs The oem command that is passed to the fastboot HAL.
         * @response result Returns the status SUCCESS if the operation is
         * successful,
         * INVALID_ARGUMENT for bad arguments,
         * FAILURE_UNKNOWN for an invalid/unsupported command.
         */
        doOemCommand(string oemCmd) generates (Result result);

    };
    

fastbootd の有効化

デバイスで fastbootd を有効にする手順は、以下のとおりです。

  1. fastbootddevice.mkPRODUCT_PACKAGES に追加します(PRODUCT_PACKAGES += fastbootd)。

  2. fastboot HAL、ブート コントロール HAL、Health HAL がリカバリ イメージの一部としてパッケージ化されていることを確認します。

  3. fastbootd で必要となるデバイス独自の sepolicy アクセス許可を追加します。たとえば、fastbootd はデバイス独自のパーティションをフラッシュするため、そのパーティションへの書き込みアクセスが必要となります。さらに、fastboot HAL の実装にはデバイス独自のアクセス許可も必要になる場合があります。

ユーザー空間の fastboot の検証

ベンダー テストスイート(VTS)には、ユーザー空間 fastboot を検証するためのテストが含まれています。