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

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

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

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

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

معیارهای کلی

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

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

  • این وظیفه چارچوب Android است که markBootSuccessful را از 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 برای دستگاه‌هایی که با Android 12 یا بالاتر عرضه می‌شوند تنظیم می‌شود.

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

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

جریان جای‌گذاری راه‌انداز سیستم
شکل ۱. جریان جای‌گذاری راه‌انداز سیستم
  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_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 نیز باید بتواند رادیو را فلش کند. این کار را می‌توان به یکی از دو روش زیر انجام داد:

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

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