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

仮想A / Bの実装

新しいデバイスに仮想A / Bを実装する、または起動したデバイスを後付けするには、デバイス固有のコードを変更する必要があります。

ビルドフラグ

仮想A / Bを使用するデバイスがされなければならないA / B装置として構成しなければならず、動的パーティションで起動します

仮想A / Bで起動するデバイスの場合、仮想A / Bデバイスの基本構成を継承するようにデバイスを設定します。

$(call inherit-product, \
    $(SRC_TARGET_DIR)/product/virtual_ab_ota.mk)

以下のための多くのボードサイズとして半分しか仮想A / Bの必要性に起動しないデバイスBOARD_SUPER_PARTITION_SIZE Bスロットはスーパーでなくなったため。つまり、 BOARD_SUPER_PARTITION_SIZEより大きいこと、または順番に、より大きいかまたはオーバーヘッド+(パーティションサイズ)を合計と等しくなければならないれ、オーバーヘッド+(更新グループのサイズ)合計に等しくなければなりません。

仮想A / Bで圧縮スナップショットを有効にするには、代わりに次の基本構成を継承します。

$(call inherit-product, \
    $(SRC_TARGET_DIR)/product/virtual_ab_ota/compression.mk)

ブート制御HAL

ブート制御HALは、ブートスロットを制御するために、OTAクライアントのインターフェースを提供します。仮想A / Bでは、フラッシュ/ファクトリリセット中にブートローダーを確実に保護するために追加のAPIが必要になるため、ブート制御HALのマイナーバージョンアップグレードが必要です。参照IBootControl.haltypes.hal HAL定義の最新バージョン。

// hardware/interfaces/boot/1.1/types.hal
enum MergeStatus : uint8_t {
    NONE, UNKNOWN, SNAPSHOTTED, MERGING, CANCELLED };

// hardware/interfaces/boot/1.1/IBootControl.hal
package android.hardware.boot@1.1;
interface IBootControl extends @1.0::IBootControl {
    setSnapshotMergeStatus(MergeStatus status)
        generates (bool success);
    getSnapshotMergeStatus()
        generates (MergeStatus status);
}
// Recommended implementation

Return<bool> BootControl::setSnapshotMergeStatus(MergeStatus v) {
    // Write value to persistent storage
    // e.g. misc partition (using libbootloader_message)
    // bootloader rejects wipe when status is SNAPSHOTTED
    // or MERGING
}

Fstabの変更

メタデータパーティションの整合性は、特にOTA更新が適用された直後のブートプロセスに不可欠です。だから、メタデータパーティションは、前にチェックする必要がありますfirst_stage_initそれがマウントされます。この問題が発生したことを確認するには、追加checkのためのエントリにfs_mgrフラグを/metadata 。以下に例を示します。

/dev/block/by-name/metadata /metadata ext4 noatime,nosuid,nodev,discard,sync wait,formattable,first_stage_mount,check

カーネル要件

スナップショット、セットを有効にするにはCONFIG_DM_SNAPSHOTtrue

F2FSを使用してデバイスの場合、含まれたユーザへの輸出FS_NOCOW_FLフラグ:f2fs修正ファイルピニングにカーネルパッチを。含めるサポート整列固定ファイル:f2fsカーネルパッチを同様に。

オーバーフローステータスビット:仮想A / Bは、カーネルバージョン4.3で追加された機能に依存しているsnapshotsnapshot-mergeのターゲット。 Android 9以降で起動するすべてのデバイスには、カーネルバージョン4.4以降がすでに含まれている必要があります。

圧縮されたスナップショットを有効にするために、サポートされる最小のカーネルバージョンは4.19です。セットCONFIG_DM_USER=mまたはCONFIG_DM_USER=y 。前者(モジュール)を使用する場合は、モジュールを第1ステージのRAMディスクにロードする必要があります。これは、デバイスのMakefileに次の行を追加することで実現できます。

BOARD_GENERIC_RAMDISK_KERNEL_MODULES_LOAD := dm-user.ko

Android11にアップグレードするデバイスでの改造

Android 11にアップグレードする場合、動的パーティションで起動したデバイスは、オプションで仮想A / Bを後付けできます。更新プロセスは、仮想A / Bで起動するデバイスの場合とほとんど同じですが、いくつかの小さな違いがあります。

  • COWファイルの場所-起動デバイスの場合は、OTAクライアントは、スペースを使用する前に、スーパーパーティション内のすべての利用可能な空きスペースを使用しています/data 。 COWファイルが作成されることはありませんようにレトロフィットデバイスの場合、スーパーのパーティションに十分なスペースが常にあります/data

  • ビルド時の機能フラグ-仮想A / Bを改装デバイスでは、両方PRODUCT_VIRTUAL_AB_OTAPRODUCT_VIRTUAL_AB_OTA_RETROFITに設定されているtrueの下方に示すように、。

    (call inherit-product, \
        (SRC_TARGET_DIR)/product/virtual_ab_ota_retrofit.mk)
    
  • スーパーパーティションサイズ-仮想A / Bで起動デバイスをカットすることができますBOARD_SUPER_PARTITION_SIZE Bスロットは、スーパーのパーティションに含まれていないので、半分に。ように仮想A / Bを改装デバイスは、古いスーパーパーティションサイズを保つBOARD_SUPER_PARTITION_SIZEより大きいかまたは順番に2以上*和(パーティションのサイズ)に等しい2 *和(更新グループのサイズ)+オーバーヘッド、に等しいです。 +オーバーヘッド

ブートローダーの変更

更新のマージステップの間、 /data AndroidのOSの唯一のインスタンス全体を保持しています。移行を開始する、ネイティブたらsystemvendor 、およびproductパーティションのコピーが終了するまで不完全です。このプロセス中に、リカバリまたは[システム設定]ダイアログを介してデバイスが工場出荷時にリセットされた場合、デバイスは起動できなくなります。

消去する前に/data 、デバイスの状態に応じて、回復またはロールバックでマージを終えます。

  • 以前に新しいビルドが正常に起動した場合は、移行を終了します。
  • それ以外の場合は、古いスロットにロールバックします。
    • 動的パーティションの場合は、前の状態にロールバックします。
    • 静的パーティションの場合、アクティブスロットを古いスロットに設定します。

ブートローダと両方fastbootd消去することができます/dataデバイスのロックが解除されている場合は、パーティションを。一方でfastbootd完了するまでに移行を強制することができ、ブートローダはできません。ブートローダは、マージが進行中であるかどうかわからない、または内のブロック何/data OSのパーティションを構成しています。デバイスは、次の手順を実行して、ユーザーが無意識のうちにデバイスを操作不能(ブリック)にしないようにする必要があります。

  1. ブートローダにより値セットを読み取ることができるように、ブート制御HALを実装setSnapshotMergeStatus()メソッド。
  2. マージステータスがされている場合はMERGING 、またはマージステータスがある場合にSNAPSHOTTEDし、スロットが新しく更新されたスロットに変更されました、その後、拭くために要求userdatametadataのマージ状態を保存する、またはパーティションをブートローダーに拒否しなければなりません。
  3. 実装fastboot snapshot-update cancelユーザーは、この保護メカニズムバイパスしたいというブートローダに知らせることができるようにコマンドを。
  4. 問題へのツールやスクリプトを点滅修正カスタムfastboot snapshot-update cancelデバイス全体を点滅するとき。デバイス全体をフラッシュするとOTAが削除されるため、これは安全に発行できます。ツーリングは、実装することで、実行時に、このコマンドを検出することができますfastboot getvar snapshot-update-status 。このコマンドは、エラー状態を区別するのに役立ちます。

struct VirtualAbState {
    uint8_t StructVersion;
    uint8_t MergeStatus;
    uint8_t SourceSlot;
};

bool ShouldPreventUserdataWipe() {
    VirtualAbState state;
    if (!ReadVirtualAbState(&state)) ...
    return state.MergeStatus == MergeStatus::MERGING ||
           (state.MergeStatus == MergeStatus::SNAPSHOTTED &&
            state.SourceSlot != CurrentSlot()));
}

Fastbootツールの変更

Android 11は、fastbootプロトコルに次の変更を加えます。

  • getvar snapshot-update-status -ブート制御HALは、ブートローダに伝達する値を返します。
    • 状態がされている場合はMERGING 、ブートローダは返さなければなりませんmerging
    • 状態である場合はSNAPSHOTTED 、ブートローダは返さなければなりませんsnapshotted
    • それ以外の場合は、ブートローダは返さない必要がありnone
  • snapshot-update merge -を完了マージ操作、必要に応じて、リカバリ/ fastbootdに起動します。このコマンドは、場合にのみ有効であるsnapshot-update-statusされmerging 、およびだけfastbootdでサポートされています。
  • snapshot-update cancel -にブート制御HALのマージステータスを設定しますCANCELLED 。デバイスがロックされている場合、このコマンドは無効です。
  • eraseまたはwipe - eraseまたはwipemetadatauserdataブート制御HAL用のマージ状態を保持している、またはパーティションは、スナップショットのマージ状態をチェックする必要があります。ステータスがされている場合はMERGINGまたはSNAPSHOTTED 、デバイスは動作を中止すべきです。
  • set_active - set_activeスナップショットマージステータスをチェックする必要がアクティブスロットを変更するコマンド。ステータスがされている場合はMERGING 、デバイスは動作を中止すべきです。スロットを安全に変更することができるSNAPSHOTTED状態。

これらの変更は、誤ってデバイスを起動できなくすることを防ぐように設計されていますが、自動化されたツールを混乱させる可能性があります。コマンドが実行されているなどのように、すべてのパーティション、点滅の成分として使用されている場合にはfastboot flashall 、次のフローを使用することをお勧めします:

  1. クエリgetvar snapshot-update-status
  2. 場合mergingまたはsnapshotted 、発行snapshot-update cancel
  3. 点滅する手順に進みます。

ストレージ要件の削減

スーパーに割り当てられた完全なA / Bのストレージを持っていない、との使用に期待しているデバイス/data必要に応じては、強くブロックマッピングツールを使用することをお勧めします。ブロックマッピングツールは、ビルド間でブロック割り当ての一貫性を保ち、スナップショットへの不要な書き込みを減らします。これは、下の文書化されたOTAサイズを縮小します