デバッグ用 RAM ディスクを使用した VTS テスト

Android 10 以降、CTS-on-GSI / VTS コンプライアンス テストの実行に使用される Generic System Image(GSI)は、リリース署名のために userdebug から user ビルドタイプに変更されました。これは VTS テストで問題になります。VTS は実行のために adb root を必要としますが、ユーザービルド デバイスでは adb root を使用できないからです。

デバッグ用 RAM ディスク(またはデバッグ ブートイメージ)は、ブートローダーがロック解除されているユーザービルド デバイスで adb root を有効にするために導入されました。これにより、CTS-on-GSI と VTS-on-GSI で同じ user ビルド GSI system.img を使用して、テストフローを簡素化できます。STS のセットアップの場合は、別の userdebug OEM system.img が引き続き必要です。

Android 10 のコンプライアンス テストにおけるイメージとビルドタイプの変更点を次の表に示します。

テストスイート テストに使用するイメージ ビルド デバッグ用 RAM ディスク adb root? Android 9 から 10 でのビルド バリアントの変更
CTS OEM のシステム イメージ user × × 変更なし
CTS-on-GSI GSI user × ×

userdebug から user GSI

リリース署名

STS OEM のシステム イメージ userdebug × Q の新機能
VTS GSI user

userdebug から user GSI

リリース署名

概要

次の追加のイメージ ファイルは、ビルドフォルダ(${ANDROID_PRODUCT_OUT})に生成されます。

  • boot-debug.img
  • vendor_boot-debug.img

boot-debug.img がデバイスの boot パーティションに書き込まれると、userdebug 版のシステム sepolicy ファイルと、追加のプロパティ ファイル adb_debug.prop が読み込まれます。これにより、ユーザービルド system.img(GSI または OEM のいずれかのもの)を使用した adb root が可能になります。

vendor_boot パーティションを含むデバイスを使用する汎用カーネル イメージ(GKI)の場合は、boot-debug.img を書き込んではなりません。boot パーティションには認定済み GKI イメージを書き込む必要があるからです。代わりに、デバッグ用 RAM ディスクを容易に使用できるように、vendor_boot-debug.imgvendor_boot パーティションに書き込む必要があります。

デバッグ用 RAM ディスクを使用するための前提条件

デバッグ用 RAM ディスクは、コンプライアンス テストを実行する OEM から提供されます。リリース署名されたものは使用できず、デバイスがロック解除されている場合にのみ使用できます。

次の場合、デバイスのアップグレード用にデバッグ用 RAM ディスクが生成または使用されることはありません。

  • BOARD_BUILD_SYSTEM_ROOT_IMAGE が true の場合
  • skip_initramfs がカーネルのコマンドラインで指定された場合

Android 12 GSI

Android 12 GSI では、デバッグ用 RAM ディスクを使用するための追加の手順は不要です。

2021 年 9 月 29 日以降、repack_bootimg ツールを使用してデバッグ用 RAM ディスクを更新する必要はなくなりました。SGR1.210929.001 (7777720) 以降の Android 12 GSI ビルドでは、最新の userdebug_plat_sepolicy.cil ファイルが system.img に組み込まれており、デバッグ用 RAM ディスクの userdebug_plat_sepolicy.cil は無視されます。詳しくは、CL をご覧ください。

Android 11 GSI

boot-debug.img または vendor_boot-debug.img を使用している場合、システム sepolicy は、boot-debug.img または vendor_boot-debug.img のデバッグ用 RAM ディスクの userdebug_plat_sepolicy.cil ファイルから読み込まれます。GSI イメージを起動するには、常に android11-gsi ブランチから最新の sepolicy の変更を組み込んで、boot-debug.img または vendor_boot-debug.img を再ビルドしてください。

または、repack_bootimg ツールを使用して、更新された GSI sepolicy で boot-debug.img または vendor_boot-debug.img を再ビルドすることもできます。

デバッグ用 RAM ディスクを再パックする

パートナーは、sepolicy の変更を組み込んで boot-debug.img を再ビルドする代わりに、repack_bootimg を使用して GSI sepolicy ファイルを boot-debug.img(デバイスで GKI を使用している場合は vendor_boot-debug.img)に更新できます。

手順は以下のとおりです。

  1. https://ci.android.com から otatools.zip をダウンロードします。aosp-main にある aosp_arm64-userdebug のビルド アーティファクトからダウンロードすることをおすすめします。

  2. repack_bootimg の実行環境をセットアップします。

    unzip otatools.zip -d otatools
    export PATH="${PWD}/otatools/bin:${PATH}"
    repack_bootimg --help
  3. 使用している GSI ビルドから userdebug_plat_sepolicy.cil または boot-with-debug-ramdisk-${KERNEL_VERSION}.img をダウンロードします。たとえば、RJR1.211020.001 (7840830) の arm64 GSI を使用している場合は、https://ci.android.com/builds/submitted/7840830/aosp_arm64-user/latest からダウンロードします。

  4. デバイスの boot-debug.img または vendor_boot-debug.imguserdebug_plat_sepolicy.cil で更新します。

    repack_bootimg --local --dst_bootimg boot-debug.img \
        --ramdisk_add userdebug_plat_sepolicy.cil:userdebug_plat_sepolicy.cil \
        --ramdisk_add userdebug_plat_sepolicy.cil:first_stage_ramdisk/userdebug_plat_sepolicy.cil
    # If using GKI
    repack_bootimg --local --dst_bootimg vendor_boot-debug.img \
        --ramdisk_add userdebug_plat_sepolicy.cil:userdebug_plat_sepolicy.cil \
        --ramdisk_add userdebug_plat_sepolicy.cil:first_stage_ramdisk/userdebug_plat_sepolicy.cil

    boot-with-debug-ramdisk-${KERNEL_VERSION}.img の場合:

    repack_bootimg --src_bootimg boot-with-debug-ramdisk-5.4.img \
        --dst_bootimg boot-debug.img \
        --ramdisk_add first_stage_ramdisk/userdebug_plat_sepolicy.cil:userdebug_plat_sepolicy.cil \
        --ramdisk_add first_stage_ramdisk/userdebug_plat_sepolicy.cil:first_stage_ramdisk/userdebug_plat_sepolicy.cil
    # If using GKI
    repack_bootimg --src_bootimg boot-with-debug-ramdisk-5.4.img \
        --dst_bootimg vendor_boot-debug.img \
        --ramdisk_add first_stage_ramdisk/userdebug_plat_sepolicy.cil:userdebug_plat_sepolicy.cil \
        --ramdisk_add first_stage_ramdisk/userdebug_plat_sepolicy.cil:first_stage_ramdisk/userdebug_plat_sepolicy.cil

    --ramdisk_add の引数は、デバイス設定に応じて調整できます。詳しい説明については、次のセクションをご覧ください。

userdebug sepolicy のパス

前述の repack_bootimg は、ファイル userdebug_plat_sepolicy.cil を、--src_bootimg の RAM ディスクから --dst_bootimg の RAM ディスクにコピーします。ただし、デバッグ用 RAM ディスク内のパスは、Android のバージョンによって異なります。Android 10 および 11 では、カーネルのコマンドラインで androidboot.force_normal_boot=1 が指定されているデバイスのパスは first_stage_ramdisk/userdebug_plat_sepolicy.cil です。それ以外の場合、パスは userdebug_plat_sepolicy.cil です。

カーネルのコマンドラインに androidboot.force_normal_boot が存在するかどうかを確認するには、次のコマンドを実行します。

adb root
adb shell cat /proc/cmdline | grep force_normal_boot

Android 12 以降では、カーネルのコマンドラインに androidboot.force_normal_boot=1 が存在するかどうかにかかわらず、デバッグ用 RAM ディスク内のパスは常に userdebug_plat_sepolicy.cil です。Android の各バージョンにおけるデバッグ用 RAM ディスク内のパスを次の表に示します。

デバッグ イメージ Android 10 Android 11 Android 12
GKI boot-with-debug-ramdisk-${KERNEL_VERSION}.img なし first_stage_ramdisk/userdebug_plat_sepolicy.cil userdebug_plat_sepolicy.cil
デバイス固有の boot-debug.img force_normal_boot に依存します force_normal_boot に依存します userdebug_plat_sepolicy.cil
デバイス固有の vendor_boot-debug.img なし force_normal_boot に依存します userdebug_plat_sepolicy.cil

--ramdisk_add を使用すると、src_path:dst_path ペアのリストを指定して、異なるパスの間でファイルをコピーできます。たとえば、次のコマンドはファイル first_stage_ramdisk/userdebug_plat_sepolicy.cil を、Android 11 の boot-with-debug-ramdisk-5.4.img から、Android 11 の vendor_boot-debug.img 内の first_stage_ramdisk/userdebug_plat_sepolicy.cil にコピーします。

repack_bootimg \
    --src_bootimg boot-with-debug-ramdisk-5.4.img \
    --dst_bootimg vendor_boot-debug.img \
    --ramdisk_add first_stage_ramdisk/userdebug_plat_sepolicy.cil:first_stage_ramdisk/userdebug_plat_sepolicy.cil

カーネルのコマンドラインに androidboot.force_normal_boot=1 が存在しない場合は、コマンドを下記のように調整して宛先パスを userdebug_plat_sepolicy.cil に変更します。

repack_bootimg \
    --src_bootimg boot-with-debug-ramdisk-5.4.img \
    --dst_bootimg vendor_boot-debug.img \
    --ramdisk_add first_stage_ramdisk/userdebug_plat_sepolicy.cil:userdebug_plat_sepolicy.cil

--dst_bootimg に渡されるイメージが AVB チェーン パーティションとして構成されている場合は、repack_bootimg コマンドを実行した後に AVB フッターを追加する必要があります。

たとえば、repack_bootimg を実行する前に、以下のコマンドを実行して、チェーンされた AVB フッターが vendor_boot-debug.img にあるかどうかを確認します。

avbtool info_image --image vendor_boot-debug.img

チェーンされた AVB フッターが元々ある場合は、repack_bootimg コマンドを実行した後に、AVB フッターを追加する必要があります。デバッグ用 RAM ディスクはデバイスがロック解除されている場合にのみ使用できるため、任意のテストキーを使って vendor_boot-debug.img に署名することができます。これにより、非リリースキーで署名されたイメージを boot または vendor_boot のパーティションに配置することが可能になります。

avbtool add_hash_footer --partition_name vendor_boot \
    --partition_size 100663296 \
    --algorithm SHA256_RSA4096 \
    --key otatools/external/avb/test/data/testkey_rsa4096.pem \
    --image vendor_boot-debug.img