اندروید 11 از راهاندازیهای نرمافزار پشتیبانی میکند، که در زمان اجرا فرآیندهای موجود در فضای کاربر برای اعمال بهروزرسانیهایی که نیاز به راهاندازی مجدد دارند استفاده میشود (مثلاً بهروزرسانیهای بستههای APEX). در حال حاضر، راهاندازی مجدد نرم محدود به فرآیندهایی است که پس از نصب userdata
شروع شدهاند.
یک راه اندازی مجدد نرم به روش های زیر درخواست می شود:
از
PowerManager
، با فراخوانیPowerManager.reboot(PowerManager.REBOOT_USERSPACE)
از پوسته، با استفاده از
adb shell svc power reboot userspace
یاadb reboot userspace
پس از راهاندازی مجدد نرم، فضای ذخیرهسازی رمزگذاری شده اعتبارنامه باز میماند.
اگر دستگاهی از راهاندازی مجدد نرمافزار پشتیبانی میکند، متد API PowerManager.isRebootingUserspace()
true
را برمیگرداند و مقدار ویژگی سیستم init.userspace_reboot.is_supported
برابر با 1
است.
اگر دستگاه از راهاندازیهای نرمافزار پشتیبانی نمیکند، تماسها به PowerManager.reboot(PowerManager.REBOOT_USERSPACE)
، adb reboot userspace
و adb shell svc power reboot userspace
با شکست مواجه میشوند.
اجرای راه اندازی مجدد نرم
پس از درخواست یک راه اندازی مجدد نرم (از طریق PowerManager
یا از یک پوسته)، init
مراحل زیر را انجام می دهد:
sys.powerctl=reboot,userspace
دریافت میکند.یک فرآیند
UserspaceRebootWatchdogThread()
جداگانه را برای نظارت بر راه اندازی مجدد نرم ایجاد می کند.یک اقدام
userspace-reboot-requested
راهاندازی میکند، که تمام ویژگیهای سیستم را که ممکن است بر راهاندازی مجدد نرم تأثیر بگذارد، بازنشانی میکند. خواص تحت تأثیر:-
sys.usb.config
-
sys.usb.state
-
sys.boot_completed
-
dev.bootcomplete
-
sys.init.updatable_crashing
-
sys.init.updatable_crashing_process_name
-
apexd.status
-
sys.user.0.ce_available
-
sys.shutdown.requested
-
service.bootanim.exit
ویژگی های بالا باید در طول توالی بوت دوباره تنظیم شوند. در صورت نیاز، می توانید ویژگی های اضافی را بازنشانی کنید. برای مثال، به عمل
on userspace-reboot-requested
درrootdir/init.rc
مراجعه کنید.-
تابع
DoUserspaceReboot
را اجرا می کند که اقدامات زیر را انجام می دهد:-
SIGTERM
به فرآیندهایی که پس از نصبuserdata
شروع شدهاند ارسال میکند و منتظر میماند تا متوقف شوند. - پس از اتمام زمان،
SIGKILL
می فرستد تا فرآیندهای در حال اجرا را از بین ببرد. -
/system/bin/vdc volume reset
را میخواند. - دستگاه پشتیبان zRAM را جدا می کند.
- بسته های فعال APEX را از حالت نصب خارج می کند.
- به فضای نام mount bootstrap برمی گردد.
- عملکرد
userspace-reboot-resume
فعال می کند.
-
اگر کنترل سیستم فایل قبل از راهاندازی مجدد نرمافزار درخواست شده باشد، userdata
در طول عمل userspace-reboot-fs-remount
مجدداً به حالت checkpointing سوار میشوند (برای جزئیات به بخش زیر مراجعه کنید). پس از تنظیم sys.boot_completed property
روی 1
، یک راه اندازی مجدد نرم در نظر گرفته می شود. در پایان راه اندازی مجدد نرم، صفحه نمایش خاموش نگه داشته می شود و برای بیدار کردن آن به تعامل صریح کاربر نیاز است.
بازرسی سیستم فایل
اگر یک نقطه بازرسی سیستم فایل قبل از راهاندازی مجدد نرمافزار درخواست شده باشد، userdata
در حالت بازرسی در طول راهاندازی مجدد نرمافزار مجدداً نصب میشوند. منطق نصب مجدد در تابع fs_mgr_remount_userdata_into_checkpointing
پیاده سازی شده است و بین روش های چک پوینت متفاوت است. به طور خاص، زمانی که userdata
پشتیبانی میکنند:
بررسی نقاط سیستم فایل (به عنوان مثال،
f2fs
)،userdata
با گزینهcheckpoint=disable
دوباره نصب میشوند.نقطه بازرسی سطح بلوک (مثلاً
ext4
)، سپس/data
حذف میشود و تمام دستگاههای نقشهبردار دستگاه والد که در بالای آن نصب شده بود، نابود میشوند. در مرحله بعد،userdata
با استفاده از همان مسیر کدی که در بوت چک پوینت معمولی استفاده می شود، سوار می شوند.
اگر برای مدیریت کلیدهای رمزگذاری شده با اعتبار (CE) و رمزگذاری شده توسط دستگاه (DE) از یک دسته کلید در سطح سیستم فایل استفاده شود، پس از جداسازی userdata
، کلیدها گم می شوند. برای اجازه دادن به بازیابی کلید، هنگام نصب یک کلید در یک کلید سیستم فایل، vold
نیز همان کلید از نوع fscrypt-provisioning
را برای کلید زنی سطح جلسه نصب می کند. هنگامی که init_user0
فراخوانی می شود، vold
کلیدها را در keyring سیستم فایل دوباره نصب می کند.
بازگشت به راه اندازی مجدد سخت
برای اطمینان از اینکه راهاندازی نرمافزار دستگاه را در حالت غیرقابل استفاده قرار نمیدهد، Android 11 شامل یک راهاندازی مجدد به راهاندازی مجدد سخت میشود که با رعایت یکی از شرایط زیر فعال میشود:
- یک دستگاه نمیتواند راهاندازی مجدد نرم (یعنی
sys.init.userspace_reboot.in_progress=1
) را در مدت زمان معین شروع کند. - یک فرآیند در مدت زمان معین متوقف نمی شود.
- عملیات
/system/bin/vdc volume reset
ناموفق است. - جداسازی دستگاه zRAM انجام نمیشود.
- بسته فعال APEX به اشتباه جدا می شود.
- تلاش برای نصب مجدد
userdata
در حالت چک پوینت با شکست مواجه شد. - یک دستگاه با موفقیت بوت نمیشود (یعنی
sys.boot_completed=1
) در یک بازه زمانی مشخص.
پیکربندی هر دستگاه
برخی از جنبه های راه اندازی مجدد نرم را می توان با تغییر مقادیر ویژگی های زیر تنظیم کرد:
-
init.userspace_reboot.is_supported
زمانی را کنترل می کند که یک دستگاه بتواند یک راه اندازی مجدد نرم انجام دهد. اگر مقدار این ویژگیfalse
،0
باشد یا مشخص نشده باشد، تلاش برای راه اندازی مجدد رد می شود. -
init.userspace_reboot.sigkill.timeoutmillis
تایم اوت را در میلی ثانیه برای فرآیندهایی که سیگنالSIGKILL
برای توقف دریافت کرده اند کنترل می کند. اگر یکی از فرآیندها در بازه زمانی مشخص متوقف نشود، راهاندازی مجدد به حالت سخت آغاز میشود. -
init.userspace_reboot.sigterm.timeoutmillis
تایم اوت را برای فرآیندهایی که سیگنالSIGTERM
برای خاتمه دریافت کرده اند را بر حسب میلی ثانیه کنترل می کند. تمام فرآیندهایی که در بازه زمانی مشخص خاتمه نمی یابند یک سیگنالSIGKILL
دریافت می کنند. -
init.userspace_reboot.started.timeoutmillis
زمان وقفه را در میلی ثانیه برای راه اندازی مجدد نرم کنترل می کند (یعنیsys.init.userspace_reboot.in_progress=1
). اگر دستگاهی نتواند در بازه زمانی داده شده راه اندازی مجدد نرم افزاری را شروع کند، راه اندازی مجدد مجدد به راه اندازی مجدد سخت آغاز می شود. -
init.userspace_reboot.userdata_remount.timeoutmillis
زمان وقفه را در میلی ثانیه کنترل می کند تاuserdata
از حالت نصب خارج کند. اگر دستگاهی نتواندuserdata
در بازه زمانی مشخص شده جدا کند، راهاندازی مجدد به حالت سخت آغاز میشود. -
init.userspace_reboot.watchdog.timeoutmillis
زمان بوت موفقیت آمیز دستگاه را کنترل می کند (یعنیsys.boot_completed=1
). اگر دستگاهی در مدت زمان مشخص شده بوت نشود، راه اندازی مجدد به راه اندازی مجدد سخت راه اندازی می شود.
سفارشی کردن انیمیشن در حین راه اندازی مجدد نرم
پیاده سازی مرجع یک راه اندازی مجدد نرم شامل توانایی سفارشی کردن انیمیشن نشان داده شده در طول راه اندازی مجدد نرم است.
در پایان عمل userspace-reboot-fs-remount
، init
سرویس bootanim
راه اندازی می کند. این سرویس وجود فایل های انیمیشن زیر را به ترتیب فهرست شده جستجو می کند و اولین موردی را که پیدا می کند پخش می کند:
-
/product/media/userspace-reboot.zip
-
/oem/media/userspace-reboot.zip
-
/system/media/userspace-reboot.zip
اگر هیچ فایل پویانمایی مشخصی برای راه اندازی مجدد نرم افزار مشخص نشده باشد، bootanim
یک انیمیشن پیش فرض android
را نشان می دهد.
تست کردن
اندروید 11 شامل اجرای مرجع یک راه اندازی مجدد نرم افزاری است. علاوه بر این، میتوانید با استفاده از تستهای CTS در UserspaceRebootHostTest
، راهاندازی مجدد نرم را تأیید کنید.