OTA برای دستگاه‌های A/B بدون پارتیشن‌های پویا

‫Android 10 از پارتیشن‌های پویا، سیستم پارتیشن‌بندی فضای کاربر که می‌تواند درطول به‌روزرسانی‌های ازطریق هوا (OTA) پارتیشن‌ها را ایجاد، تغییر اندازه، و حذف کند، پشتیبانی می‌کند.

این صفحه توضیح می‌دهد که چگونه کلاینت‌های OTA درطول به‌روزرسانی برای دستگاه‌های A/B که بدون پشتیبانی از پارتیشن‌های پویا راه‌اندازی شده‌اند، اندازه پارتیشن‌های پویا را تغییر می‌دهند و چگونه کلاینت‌های OTA به Android 10 ارتقا می‌یابند.

پس‌زمینه

درطول به‌روزرسانی دستگاه A/B برای پشتیبانی از پارتیشن‌های پویا، جدول پارتیشن GUID (GPT) در دستگاه حفظ می‌شود، بنابراین پارتیشن super در دستگاه وجود ندارد. فراداده در system_a و system_b ذخیره می‌شود، اما با تغییر BOARD_SUPER_PARTITION_METADATA_DEVICE می‌توان آن را سفارشی‌سازی کرد.

در هریک از دستگاه‌های بلوکی، دو جایگاه فراداده وجود دارد. فقط یک جایگاه فراداده در هر دستگاه بلوکی استفاده می‌شود. برای مثال، «فراداده ۰» در system_a و «فراداده ۱» در system_b به ترتیب با پارتیشن‌های جایگاه‌های A و B مطابقت دارند. در زمان اجرا، مهم نیست کدام جایگاه به‌روزرسانی می‌شود.

در این صفحه، جایگاه‌های فراداده «فراداده S (منبع)» و «فراداده T (هدف)» نامیده می‌شوند. به‌همین ترتیب، به پارتیشن‌ها system_s، vendor_t، و غیره گفته می‌شود.

برای اطلاعات بیشتر درباره پیکربندی‌های سیستم ساخت، به ارتقا دادن دستگاه‌ها مراجعه کنید.

برای اطلاعات بیشتر درباره نحوه تعلق پارتیشن‌ها به گروه‌های به‌روزرسانی، به تغییرات پیکربندی بُرد برای دستگاه‌های جدید مراجعه کنید.

نمونه‌ای از فراداده در دستگاه:

  • دستگاه بلوکی فیزیکی system_a
    • فراداده 0
      • گروه foo_a
        • پارتیشن منطقی (پویا) system_a
        • بخش منطقی (پویا) product_services_a
        • بخش‌های دیگر به‌روزرسانی‌شده توسط Foo
      • گروه bar_a
        • پارتیشن منطقی (پویا) vendor_a
        • بخش منطقی (پویا) product_a
        • سایر پارتیشن‌ها توسط Bar به‌روزرسانی شد
    • فراداده ۱ (استفاده نمی‌شود)
  • دستگاه بلوکی فیزیکی system_b
    • فراداده ۰ (استفاده نشده است)
    • فراداده ۱
      • گروه foo_b
        • بخش منطقی (پویا) system_b
        • بخش منطقی (پویا) product_services_b
        • بخش‌های دیگر به‌روزرسانی‌شده توسط Foo
      • گروه bar_b
        • بخش منطقی (پویا) vendor_b
        • بخش منطقی (پویا) product_b
        • سایر بخش‌ها توسط Bar به‌روزرسانی شد

می‌توانید از ابزار lpdump در system/extras/partition_tools برای تخلیه فراداده در دستگاهتان استفاده کنید. برای مثال:

lpdump --slot 0 /dev/block/by-name/system_a
lpdump --slot 1 /dev/block/by-name/system_b

به‌روزرسانی کردن

در دستگاه‌هایی که Android 9 و نسخه‌های پایین‌تر را اجرا می‌کنند، کارخواه OTA در دستگاه از نگاشت پارتیشن‌های پویا قبل‌از به‌روزرسانی پشتیبانی نمی‌کند. مجموعه دیگری از وصله‌ها ایجاد می‌شود تا نگاشت بتواند مستقیماً روی پارتیشن‌های فیزیکی موجود اعمال شود.

تولیدکننده OTA فایل نهایی super.img را می‌سازد که حاوی محتوای همه پارتیشن‌های پویا است، سپس تصویر را به چند تصویر تقسیم می‌کند که با اندازه‌های دستگاه‌های بلوک فیزیکی متناظر با سیستم، فروشنده، و غیره مطابقت دارد. این تصاویر با نام‌های super_system.img، super_vendor.img، و غیره نام‌گذاری شده‌اند. کارخواه OTA این تصاویر را روی پارتیشن‌های فیزیکی اعمال می‌کند، نه روی پارتیشن‌های منطقی (پویا).

چون کارخواه OTA نمی‌داند چگونه پارتیشن‌های پویا را نگاشت کند، وقتی بسته به‌روزرسانی تولید می‌شود، همه مراحل پس‌از نصب به‌طور خودکار برای این پارتیشن‌ها غیرفعال می‌شوند. برای جزئیات بیشتر، پیکربندی پس‌از نصب را ببینید.

جریان به‌روزرسانی همانند Android 9 است.

قبل‌از به‌روزرسانی:

ro.boot.dynamic_partitions=
ro.boot.dynamic_partitions_retrofit=

پس‌از به‌روزرسانی:

ro.boot.dynamic_partitions=true
ro.boot.dynamic_partitions_retrofit=true

به‌روزرسانی‌های آینده پس‌از نوسازی

پس‌از به‌روزرسانی مقاوم‌سازی، کارخواه OTA به‌روز می‌شود تا با پارتیشن‌های پویا کار کند. گستره‌های پارتیشن‌های منبع هرگز در سراسر پارتیشن‌های فیزیکی مقصد گسترده نمی‌شود.

به‌روزرسانی جریان بااستفاده از بسته به‌روزرسانی معمولی

  1. فراداده پارتیشن super را مقداردهی اولیه کنید.
    1. فراداده جدید M را از فراداده S (فراداده منبع) بسازید. برای مثال، اگر «فراداده S» از [system_s، vendor_s، product_s] به‌عنوان دستگاه‌های مسدودشده استفاده کند، فراداده جدید M از [system_t، vendor_t، product_t] به‌عنوان دستگاه‌های مسدودشده استفاده می‌کند. همه گروه‌ها و پارتیشن‌ها در M دور انداخته می‌شوند.
    2. گروه‌های هدف و بخش‌ها را براساس فیلد dynamic_partition_metadata در مانیفست به‌روزرسانی اضافه کنید. اندازه هر پارتیشن را می‌توانید در new_partition_info ببینید.
    3. نوشتن M در فراداده T.
    4. بخش‌های اضافه شده را در نگاشت‌گر دستگاه به‌عنوان نوشتنی نگاشت کنید.
  2. به‌روزرسانی را در دستگاه‌های بلوک اعمال کنید.
    1. درصورت لزوم، پارتیشن‌های منبع را در نگاشت‌گر دستگاه به‌صورت فقط خواندنی نگاشت کنید. این کار برای بارگیری از منابع غیررسمی ضروری است زیرا بخش‌های منبع قبل‌از به‌روزرسانی نگاشت نمی‌شوند.
    2. به‌روزرسانی کامل یا دلتا را روی همه دستگاه‌های بلوک در جایگاه هدف اعمال کنید.
    3. بخش‌ها را سوار کنید تا اسکریپت پس‌از نصب اجرا شود، و سپس بخش‌ها را پیاده کنید.
  3. بخش‌های هدف را لغو نگاشت کنید.

جریان به‌روزرسانی بااستفاده از بسته به‌روزرسانی مقاوم‌سازی

اگر بسته به‌روزرسانی اصلاحی روی دستگاهی اعمال شود که قبلاً بخش‌های پویا را فعال کرده است، کارخواه OTA فایل super.img را مستقیماً روی دستگاه‌های بلوکی اعمال می‌کند. جریان به‌روزرسانی شبیه به به‌روزرسانی پس‌از نصب است. برای جزئیات، به‌روزرسانی مقاوم‌سازی را ببینید.

برای مثال، موارد زیر را فرض کنید:

  • شیار A شیار فعال است.
  • ‫system_a حاوی فراداده فعال در جایگاه ۰ است.
  • ‫system_a،‏ vendor_a، و product_a به‌عنوان دستگاه‌های قطعه استفاده می‌شوند.

وقتی کارخواه OTA بسته به‌روزرسانی مقاوم‌سازی را دریافت می‌کند، super_system.img را روی system_b فیزیکی، super_vendor.img را روی vendor_b فیزیکی، و super_product.img را روی product_b فیزیکی اعمال می‌کند. دستگاه بلوک فیزیکی system_b حاوی فراداده صحیح برای نگاشت system_b منطقی، vendor_b، و product_b در زمان بوت است.

تولید بسته‌های به‌روزرسانی

به‌روزرسانی افزایشی ازطریق هوا

هنگام تولید «به‌روزرسانی‌های از راه دور» افزایشی برای دستگاه‌های نوسازی‌شده، به‌روزرسانی‌ها به این بستگی دارد که ساخت پایه PRODUCT_USE_DYNAMIC_PARTITIONS و PRODUCT_RETROFIT_DYNAMIC_PARTITIONS را تعریف می‌کند یا نه.

  • اگر ساختار پایه متغیرها را تعریف نکند، این یک به‌روزرسانی پس‌سازگار است. بسته به‌روزرسانی حاوی فایل super.img تقسیم‌شده است و مرحله پس‌از نصب را غیرفعال می‌کند.
  • اگر ساختار پایه متغیرها را تعریف نکند، این همان به‌روزرسانی معمولی با پارتیشن‌های پویا است. بسته به‌روزرسانی حاوی تصاویر برای پارتیشن‌های منطقی (پویا) است. مرحله پس‌از نصب را می‌توان فعال کرد.

OTA کامل

دو بسته کامل OTA برای دستگاه‌های اصلاح‌شده تولید می‌شود.

  • ‫$(PRODUCT)-ota-retrofit-$(TAG).zip همیشه شامل تقسیم super.img می‌شود و مرحله پس‌از نصب را برای به‌روزرسانی پس‌ساز غیرفعال می‌کند.
    • با یک آرگومان اضافی --retrofit_dynamic_partitions به دستورگان ota_from_target_files تولید می‌شود.
    • می‌تواند برای همه ساخت‌ها اعمال شود.
  • $(PRODUCT)-ota-$(TAG).zip حاوی تصاویر منطقی برای به‌روزرسانی‌های آینده است.
    • این تنظیم فقط برای ساختارهایی با پارتیشن‌های پویا فعال اعمال می‌شود. جزئیات مربوط به اجرای این سیاست را در زیر ببینید.

رد کردن به‌روزرسانی غیربازسازی‌شده در ساختارهای قدیمی

بسته کامل OTA معمولی را فقط برای ساخت‌هایی اعمال کنید که پارتیشن‌های پویا در آن‌ها فعال است. اگر سرور OTA به‌درستی پیکربندی نشده باشد و این بسته‌ها را به دستگاه‌های دارای Android 9 یا پایین‌تر ارسال کند، دستگاه‌ها بوت نمی‌شوند. کارخواه OTA در Android 9 و نسخه‌های پایین‌تر نمی‌تواند بین بسته OTA پس‌ساز و بسته OTA کامل معمولی تفاوت قائل شود، بنابراین کارخواه بسته کامل را رد نمی‌کند.

برای جلوگیری از پذیرش بسته کامل OTA توسط دستگاه، می‌توانید مرحله‌ای پس‌از نصب را برای بررسی پیکربندی دستگاه موجود الزامی کنید. برای مثال:

device/device_name/dynamic_partitions/check_dynamic_partitions

#!/system/bin/sh
DP_PROPERTY_NAME="ro.boot.dynamic_partitions"
DP_RETROFIT_PROPERTY_NAME="ro.boot.dynamic_partitions_retrofit"

DP_PROPERTY=$(getprop ${DP_PROPERTY_NAME})
DP_RETROFIT_PROPERTY=$(getprop ${DP_RETROFIT_PROPERTY_NAME})

if [ "${DP_PROPERTY}" != "true" ] || [ "${DP_RETROFIT_PROPERTY}" != "true" ] ; then
    echo "Error: applied non-retrofit update on build without dynamic" \
         "partitions."
    echo "${DP_PROPERTY_NAME}=${DP_PROPERTY}"
    echo "${DP_RETROFIT_PROPERTY_NAME}=${DP_RETROFIT_PROPERTY}"
    exit 1
fi

device/device_name/dynamic_partitions/Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE:= check_dynamic_partitions
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := EXECUTABLES
LOCAL_SRC_FILES := check_dynamic_partitions
LOCAL_PRODUCT_MODULE := true
include $(BUILD_PREBUILT)

device/device_name/device.mk

PRODUCT_PACKAGES += check_dynamic_partitions

# OPTIONAL=false so that the error in check_dynamic_partitions will be
# propagated to OTA client.
AB_OTA_POSTINSTALL_CONFIG += \
    RUN_POSTINSTALL_product=true \
    POSTINSTALL_PATH_product=bin/check_dynamic_partitions \
    FILESYSTEM_TYPE_product=ext4 \
    POSTINSTALL_OPTIONAL_product=false \

وقتی بسته OTA معمولی روی دستگاهی که پارتیشن‌های پویا در آن فعال نیست اعمال می‌شود، کارخواه OTA‏ check_dynamic_partitions را به‌عنوان مرحله پس‌از نصب اجرا می‌کند و به‌روزرسانی را رد می‌کند.