Android 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 פעילות.
- מחזירה את השדה למרחב השמות של הטעינה הראשונית.
- הפעלת הפעולה
userspace-reboot-resume
.
- שולח
אם ביקשת נקודת עצירה במערכת הקבצים לפני ההפעלה מחדש הרכה, userdata
יותקן מחדש במצב נקודת עצירה במהלך הפעולה userspace-reboot-fs-remount
(פרטים בקטע הבא). הפעלה מחדש עם יכולת שחזור תטופל אחרי שמגדירים את 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
מתקין מחדש את המפתחות באוסף המפתחות של מערכת הקבצים.
חזרה לאתחול קשיח
כדי לוודא שהפעלה מחדש רכה לא תשאיר את המכשיר במצב לא שמיש, ב-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
שמוגדרת כברירת מחדל.
בדיקה
Android 11 כולל הטמעת עזר של הפעלה מחדש חלקית. בנוסף, אפשר לאמת הפעלה מחדש רכה באמצעות בדיקות CTS ב-UserspaceRebootHostTest
.