i.MX Androidでは、新しいAndroidバージョンで直接OTAパッケージをビルドし、それを旧バージョンのAndroidが動作しているデバイスに適用することは、実現できない場合があります。たとえば、i.MX Android-13.0.0_2.0.0リリースでビルドされたevk_8mm向けOTAパッケージは、i.MX Android-11.0.0_1.0.0でビルドされたイメージが動作しているevk_8mmボードには直接適用できません。
この記事では、まず、i.MX AndroidでクロスバージョンOTAが直接実行できない理由について説明します。次に、クロスバージョンOTAの前に考慮すべき点および実施すべき内容について説明します。
Googleが初めてデバイスをリリースすると、そのデバイスは「ローンチデバイス」と呼ばれます。ローンチデバイスには以下があります:
システムコードが新しいバージョンに更新された後、Pixel 3a XL向けにaosp_bonito-userまたはaosp_bonito-userdebugのランチターゲットを使用してOTAパッケージをビルドできます。このように更新されたデバイスを「レトロフィットデバイス」と呼ぶことにします。
FCMターゲットレベルはデバイスのmanifest.xmlに定義されており、特定のバージョンのsystem compatibility.matrix.xmlに対応しています。したがって、FCMターゲットレベルが変更されない場合、このデバイスによって提供されるHALに大きな変更を加える必要はありません。
これは、Google が自社のデバイスのシステムを維持する方法です。これは、i.MX Android デバイスが維持される方法ではありません。
保守対象のi.MXデバイスに対してコードが新しいバージョンに更新されると、すべてのデバイスは「ローンチデバイス」として扱われます。そのため、以前のバージョンと比較して、新しいシステムでは以下のような変更があります:
FCMターゲットレベルが変更される場合、このデバイスが提供するHALに大きな変更が加わる可能性があります。
PRODUCT_SHIPPING_API_LEVELが変更されると、プロパティ「ro.product.first_api_level」に基づく多くのコードロジックが異なる処理フローで実行されることになります。
パーティションの変更がある場合、更新後のコードで直接ビルドされたOTAパッケージは、適用できないことがよくあります。たとえば、新しいパーティション用のイメージは、旧システムが動作しているボードには適用できません。旧システムにはそのイメージ用のパーティションが存在しないためです。
クロスバージョンOTAが直接実行できない理由を明確にするためには、OTA中に変更できない項目があることを理解しておく必要があります。
1.OTA中は物理パーティションを変更することはできません。
関連する機能は以下のとおりです。
*動的パーティション
* gki
* ブートヘッダーバージョン
2.userdata パーティションのユーザーデータは変更しないでください。変更すると、OTA中にデータが失われる可能性があります。
関連する機能は以下のとおりです。
* 暗号化オプション
新しいバージョンのAndroidが、古いバージョンのAndroidで暗号化されたデータを認識できるようにするため、暗号化オプションは変更するべきではありません。
一部のfs_mgr暗号化オプションでは、product_shipping_api_levelがカーネルに渡される最終的な暗号化パラメータに影響を与えます。次のコードをご覧ください。同じfs_mgr暗号化オプションでも、first_api_levelが異なると、Androidバージョンごとに最終的な暗号化パラメータが異なります。
android10 system/extras/libfscrypt/fscrypt.cpp
if (filenames_encryption_mode == FS_ENCRYPTION_MODE_AES_256_CTS) {
// Use legacy padding with our original filenames encryption mode.
return FS_POLICY_FLAGS_PAD_4;
} else if (filenames_encryption_mode == FS_ENCRYPTION_MODE_ADIANTUM) {
// ...snip...
return (FS_POLICY_FLAGS_PAD_16 | FS_POLICY_FLAG_DIRECT_KEY);
}
// ...snip...
return FS_POLICY_FLAGS_PAD_16;
android11 system/extras/libfscrypt/fscrypt.cpp
if (!is_gki && options->version == 1 && options->filenames_mode == FSCRYPT_MODE_AES_256_CTS) {
options->flags |= FSCRYPT_POLICY_FLAGS_PAD_4;
} else {
options->flags |= FSCRYPT_POLICY_FLAGS_PAD_16;
}
android12 system/extras/libfscrypt/fscrypt.cpp
if (first_api_level <= __ANDROID_API_Q__ && options->version == 1 &&
options->filenames_mode == FSCRYPT_MODE_AES_256_CTS) {
options->flags |= FSCRYPT_POLICY_FLAGS_PAD_4;
} else {
options->flags |= FSCRYPT_POLICY_FLAGS_PAD_16;
}
fscryptのバージョンも結果に影響します。指定されていない場合、「product_shipping_api_level <= 29」であれば、デフォルトの「version」は「v1」になり、それ以外の場合は「v2」になります。
「casefold」や「project id」などの一部の fscrypt 機能は fscrypt「v2」に依存します。これらの機能は、「device/nxp」に「$(call inherit-product, $(SRC_TARGET_DIR)/product/emulated_storage.mk)」を含めることで有効になります。fscrypt「v1」を使用する場合は、「emulated_storage.mk」を含めないでください。
* userdataパーティションのファイルシステムタイプ
ext4(i.MX Android 13.0.0 より前で使用)
f2fs(i.mx android 13.0.0から使用)
* userdata パーティション上のエミュレーテッドストレージのファイルシステム
sdcardfs
ヒューズ
3. miscパーティション内のブート制御情報は、OTAの前後で認識される必要があります。
関連する機能は次のとおりです。
*ブートコントロールHAL
4。U-Bootがカーネルに渡すブート引数は、ブートローダーが更新されない限り変更できません
関連する機能は次のとおりです。
* bootconfig は、Android 12.0.0_1.0.0以降でブート引数を渡すために使用されます。vendor boot header v4とともに使用されます。
デュアルブートローダーまたはpostinstallが使用されている場合、ブートローダーの更新が可能であることを理解しておく必要があります。
これらの関連機能について、Googleは「レトロフィットデバイス」向けには実装や変更を行っておらず、「ローンチデバイス」向けの機能変更のみに対応しています。これにより、ローンチデバイスではクロスバージョンOTAの直接適用が可能になります。これは、OTA中に変更できない項目が Androidバージョン間で共通であるためです。
i.MX Androidでは、すべての保守対象デバイスに新機能を実装するため、Androidの新しいバージョンへの更新時に、OTA中に変更可能な項目が変更されることがよくあります。これにより、クロスバージョンOTAの直接適用は実現できなくなります。
参照用として、以下に主な機能変更の履歴を記載します。
* 物理パーティションの変更履歴
| bootloader_a/b | 4MB | 4MB | 4MB | 4MB | 4MB | 16MB | 16MB | 16MB |
| dtbo_a/b | 4MB | 4MB | 4MB | 4MB | 4MB | 4MB | 4MB | 4MB |
| boot_a/b | 48MB | 48MB | 64MB | 64MB | 64MB | 64MB | 64MB | 64MB |
| init_boot_a/b | - | - | - | - | 8MB | 8MB | ||
| vendor_boot_a/b | - | - | 64MB | 64MB | 64MB | 64MB | 64MB | |
| misc | 4MB | 4MB | 4MB | 4MB | 4MB | 4MB | 4MB | 4MB |
| metadata | 2MB | 2MB | 2MB | 2MB | 16MB | 16MB | 64MB | 64MB |
| presistdata | 1MB | 1MB | 1MB | 1MB | 1MB | 1MB | 1MB | 1MB |
| 素晴らしい | - | - | 7168MB | 3584MB | 4096MB | 4096MB | 4096MB | 4096MB |
| fbmisc | 1MB | 1MB | 1MB | 1MB | 1MB | 1MB | 1MB | 1MB |
| vbmeta_a/b | 1MB | 1MB | 1MB | 1MB | 1MB | 1MB | 1MB | 1MB |
| system_a/b | 2560MB | 1536MB | - | - | - | - | - | |
| vendor_a/b | 256MB | 512MB | - | - | - | - | - | |
| product_a/b | - | 1792MB | - | - | - | - | - |
boot_a/b:48MB → 64MB(デバッグオプションの有効化によりイメージサイズが増加)
vendor_boot_a/b:boot header v3。GKI機能を有効にするには、vendor bootおよびboot header v3が必須です。
init_boot_a/b:ramdisk内のinitバイナリがboot.imgからinit_boot.imgに移動されました。GoogleからのGKIイメージを書き込んでも、initに対するベンダーの変更には影響しません。
metadataパーティションについて:
2MB → 16MB(VTSの要件:「-m vts_gsi_boot_test -t MetadataPartition#MinimumSize」)
16MB → 64MB(パーティションをF2FSとしてフォーマットするには32MBでは足りないため、64MBが使用されます。)
metadataパーティションは、ユーザーデータチェックポイント機能を有効にした際にAndroid 11で初めてマウントされました。
* GKI機能の変更履歴
Android 11で初めて導入されました。一部のコードはモジュールとしてビルドされ、vendor_boot_a/bパーティションに配置されます。vendor_boot_a/bパーティションもAndroid 11で初めて導入されました。
GKIのプリビルドバイナリはAndroid 12から統合されました。
手順は以下のとおりです
動的パーティションに関して、注意すべき点があります。
次に、お客様側で、品質を保証するために xTS のフルテストを実施する必要があります。