به روز رسانی OTA را پیاده سازی کنید

برای پیاده‌سازی به‌روزرسانی‌های بی‌سیم (OTA) ، بوت‌لودر باید بتواند در طول بوت به یک دیسک رم ریکاوری دسترسی داشته باشد. اگر دستگاه از یک ایمیج ریکاوری AOSP اصلاح‌نشده استفاده کند، بوت‌لودر ۳۲ بایت اول روی پارتیشن misc را می‌خواند؛ اگر داده‌های موجود در آنجا با boot-recovery مطابقت داشته باشند، بوت‌لودر با ایمیج recovery بوت می‌شود. این روش امکان ادامه هرگونه کار ریکاوری در حال انتظار (مثلاً اعمال OTA یا حذف داده‌ها) را تا تکمیل فراهم می‌کند.

برای جزئیات بیشتر در مورد محتوای یک بلوک در فلش که برای ارتباطات توسط ریکاوری و بوت لودر استفاده می‌شود، به bootable/recovery/bootloader_message/bootloader_message.h مراجعه کنید.

دستگاه‌هایی با به‌روزرسانی‌های A/B

برای پشتیبانی از به‌روزرسانی‌های OTA در دستگاه‌هایی که از به‌روزرسانی‌های A/B استفاده می‌کنند، مطمئن شوید که بوت‌لودر دستگاه معیارهای زیر را برآورده می‌کند.

معیارهای عمومی

  • تمام پارتیشن‌هایی که از طریق OTA به‌روزرسانی می‌شوند، باید در حین بوت شدن سیستم اصلی قابل به‌روزرسانی باشند (و در حالت ریکاوری به‌روزرسانی نشوند).

  • برای بوت کردن پارتیشن system ، بوت‌لودر مقدار زیر را در خط فرمان هسته ارسال می‌کند: ro root=/dev/[node] rootwait init=/init .

  • این مسئولیت فریم‌ورک اندروید است که markBootSuccessful از HAL فراخوانی کند. بوت‌لودر هرگز نباید یک پارتیشن را به عنوان بوت موفقیت‌آمیز علامت‌گذاری کند.

پشتیبانی از کنترل بوت HAL

بوت لودر باید از boot_control HAL همانطور که در hardware/libhardware/include/hardware/boot_control.h تعریف شده است، پشتیبانی کند. به‌روزرسانی‌کننده، کنترل بوت HAL را بررسی می‌کند، اسلات بوتی که استفاده نمی‌شود را به‌روزرسانی می‌کند، اسلات فعال را با استفاده از HAL تغییر می‌دهد و سیستم عامل به‌روزرسانی شده را مجدداً راه‌اندازی می‌کند. برای جزئیات بیشتر، به پیاده‌سازی کنترل بوت HAL مراجعه کنید.

پشتیبانی از اسلات‌ها

بوت لودر باید از قابلیت‌های مربوط به پارتیشن‌ها و اسلات‌ها پشتیبانی کند، از جمله:

  • نام پارتیشن‌ها باید شامل پسوندی باشد که مشخص کند کدام پارتیشن‌ها به یک اسلات خاص در بوت‌لودر تعلق دارند. برای هر پارتیشن، یک متغیر متناظر با has-slot: partition base name با مقدار yes وجود دارد. اسلات‌ها به ترتیب حروف الفبا به صورت a، b، c و غیره نامگذاری می‌شوند که مربوط به پارتیشن‌هایی با پسوند _a ، _b ، _c و غیره هستند. بوت‌لودر باید با استفاده از ویژگی خط فرمان androidboot.slot_suffix به سیستم عامل اطلاع دهد که کدام اسلات بوت شده است. این ویژگی برای دستگاه‌هایی که با اندروید ۱۲ یا بالاتر راه‌اندازی می‌شوند، از طریق bootconfig تنظیم می‌شود.

  • مقدار slot-retry-count به یک مقدار مثبت (معمولاً 3 ) بازنشانی می‌شود، یا توسط کنترل بوت HAL از طریق فراخوانی setActiveBootSlot یا از طریق دستور fastboot set_active . هنگام تغییر پارتیشنی که بخشی از یک اسلات است، بوت‌لودر عبارت "successfully booted" را پاک کرده و تعداد تلاش مجدد برای اسلات را بازنشانی می‌کند.

بوت لودر همچنین باید تعیین کند که کدام اسلات بارگذاری شود. شکل، نمونه‌ای از فرآیند تصمیم‌گیری را نشان می‌دهد.

جریان اسلات بوت لودر
شکل 1. جریان اسلات‌گذاری بوت‌لودر
  1. مشخص کنید که کدام اسلات را امتحان کنید. سعی نکنید اسلاتی را که با عنوان slot-unbootable مشخص شده است، بارگذاری کنید. این اسلات باید با مقادیری که توسط fastboot برگردانده می‌شود، سازگار باشد و به عنوان اسلات فعلی شناخته می‌شود.

  2. اگر اسلات فعلی به عنوان slot-successful علامت‌گذاری نشده و slot-retry-count = 0 دارد، اسلات فعلی را به عنوان slot-unbootable علامت‌گذاری کنید. سپس یک اسلات دیگر را که unbootable علامت‌گذاری نشده و به عنوان slot-successful علامت‌گذاری شده است، انتخاب کنید. این اسلات اکنون اسلات انتخاب شده است. اگر هیچ اسلات فعلی در دسترس نیست، به حالت ریکاوری بوت کنید یا یک پیام خطای معنادار به کاربر نمایش دهید.

  3. boot.img مناسب را انتخاب کنید و مسیر پارتیشن سیستم صحیح را در خط فرمان هسته وارد کنید.

  4. پارامتر slot_suffix خط فرمان هسته را وارد کنید.

  5. بوت. اگر با عبارت slot-successful علامت‌گذاری نشده باشد، مقدار slot-retry-count کاهش دهید.

ابزار fastboot هنگام اجرای هرگونه دستور فلش، تعیین می‌کند که کدام پارتیشن باید فلش شود. برای مثال، اجرای دستور fastboot flash system system.img ابتدا متغیر current-slot را جستجو می‌کند و سپس نتیجه را به system الحاق می‌کند تا نام پارتیشنی که باید فلش شود ( system_a ، system_b و غیره) تولید شود.

هنگام تنظیم اسلات فعلی با استفاده از دستور fastboot set_active یا دستور boot control HAL setActiveBootSlot ، بوت لودر باید اسلات فعلی را به‌روزرسانی کند، slot-unbootable و slot-successful را پاک کند و تعداد تلاش مجدد را مجدداً تنظیم کند (این تنها راه برای پاک کردن slot-unbootable است).

دستگاه‌هایی که به‌روزرسانی A/B ندارند

برای پشتیبانی از به‌روزرسانی‌های OTA در دستگاه‌هایی که از به‌روزرسانی‌های A/B استفاده نمی‌کنند ( به دستگاه‌های قابل به‌روزرسانی غیر A/B مراجعه کنید)، مطمئن شوید که بوت‌لودر دستگاه معیارهای زیر را برآورده می‌کند.

  • پارتیشن recovery باید حاوی ایمیجی باشد که بتواند ایمیج سیستم را از یک پارتیشن پشتیبانی‌شده ( cache ، userdata ) بخواند و آن را در پارتیشن system بنویسد.

  • بوت لودر باید از بوت شدن مستقیم به حالت ریکاوری پشتیبانی کند.

  • اگر به‌روزرسانی‌های تصویر رادیو پشتیبانی شوند، پارتیشن recovery باید بتواند رادیو را نیز فلش کند. این کار را می‌توان به یکی از دو روش زیر انجام داد:

    • بوت لودر رادیو را فلش می‌کند. در این حالت، باید بتوان از پارتیشن ریکاوری دوباره به بوت لودر برگشت تا به‌روزرسانی کامل شود.

    • تصویر بازیابی، رادیو را روشن می‌کند. این قابلیت می‌تواند به صورت یک کتابخانه دودویی یا یک ابزار کمکی ارائه شود.