הפעלה מחדש רכה (<= AOSP 14)

‫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 מבצע את השלבים הבאים:

  1. מקבל sys.powerctl=reboot,userspace.

  2. מבצע פיצול של תהליך UserspaceRebootWatchdogThread() נפרד כדי לעקוב אחרי ההפעלה מחדש הרכה.

  3. מפעיל פעולה של 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.

  4. מריץ את הפונקציה DoUserspaceReboot שמבצעת את הפעולות הבאות:

    1. שולח SIGTERM לתהליכים שהתחילו אחרי ש-userdata הותקן ומחכה שהם יסתיימו.
    2. אחרי שהזמן הקצוב לתפוגה מסתיים, נשלחת הפקודה SIGKILL כדי להפסיק את כל התהליכים הפעילים.
    3. שיחות /system/bin/vdc volume reset.
    4. מבטל את הטעינה של מכשיר הגיבוי של zRAM.
    5. מבטלים את הטעינה של חבילות APEX פעילות.
    6. חזרה למרחב השמות של נקודת העיגון של ה-bootstrap.
    7. מפעיל את הפעולה 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.

  • Block level checkpointing (לדוגמה, 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 שולט בערך הזמן הקצוב לתפוגה (timeout) באלפיות השנייה של תהליכים שקיבלו אות SIGKILL להפסקה. אם אחד מהתהליכים לא מפסיק לפעול בפרק הזמן שמוגדר כזמן קצוב לתפוגה, מופעלת הפעלה מחדש קשיחה.
  • init.userspace_reboot.sigterm.timeoutmillis שולט בערך הזמן הקצוב לתפוגה (timeout) באלפיות השנייה (מילי-שניות) לתהליכים שקיבלו אות 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

אם לא מציינים קובצי אנימציה ספציפיים להפעלה רכה מחדש, מוצגת אנימציית ברירת המחדל android.bootanim

בדיקה

‫Android 11 כולל הטמעה לדוגמה של הפעלה מחדש רכה. בנוסף, אפשר לאמת הפעלה מחדש רכה באמצעות בדיקות CTS ב-UserspaceRebootHostTest.