כדאי לבחור את התיקונים הבאים לטיפול בבעיות הידועות הבאות.
בדיקת נפח האחסון שניתן להקצות בצורה נכונה במהלך התקנה ממקור לא ידוע
התקנה ממקור לא ידוע של חבילת OTA מלאה במכשיר A/B וירטואלי
מחיצה שגודלה קטן מ- *2 * amount(size of update groups)* עלולה להיכשל
עם הפרטים הבאים ביומן השחזור /tmp/recovery.log
:
The maximum size of all groups with suffix _b (...) has exceeded half of allocatable space for dynamic partitions ...
דוגמה ליומן:
[INFO:dynamic_partition_control_android.cc(1020)] Will overwrite existing partitions. Slot A may be unbootable until update finishes!
[...]
[ERROR:dynamic_partition_control_android.cc(803)] The maximum size of all groups with suffix _b (2147483648) has exceeded half of allocatable space for dynamic partitions 1073741824.
אם נתקלתם בבעיה הזו, בחרו באפשרות CL 1399393, בנייה מחדש ו-Flash מחיצת האתחול או מחיצת השחזור אם המכשיר לא משתמש בשחזור בתור לאתחל.
תיקון שגיאת פילוח במהלך המיזוג
לאחר החלת עדכון OTA, במהלך מיזוג ה-VAB, מתבצעת קריאה אל
update_engine_client --cancel
גורם לקריסה של CleanupPreviousUpdateAction
. א'
שגיאה פוטנציאלית של המצביע הכללי קיימת גם כאשר markSlotSuccessful
מגיע באיחור.
כדי לפתור את הבעיה, צריך להוסיף את הפונקציה StopActionInternal
.
המשימה CleanupPreviousUpdateAction
מבטלת את המשימות הממתינות להשמדה. הוא שומר על
שעוקב אחרי מזהה המשימה של המשימה הממתינה בלולאת ההודעות. במצב מופעל
משמידים, המשימה שבהמתנה בוטלה כדי למנוע התנהלות פוגעת.
כדי לתקן את הבעיה, צריך לוודא שהשינויים הבאים נמצאים בעץ המקור של Android 11 SIGSEGV
קריסות ב-update_engine
במהלך המיזוג:
- CL 1439792 (a) דרישה מוקדמת ל-CL 1439372)
- CL 1439372
(
CleanupPreviousUpdateAction
: ביטול משימות בהמתנה בהשמדה) - CL 1663460 (תיקון של
שגיאה פוטנציאלית של המצביע הכללי לחיפוש כאשר
markSlotSuccessful
מגיע באיחור)
מניעת מיזוג מוקדם של update_engine
כשמכשיר מבצע אתחול (Android 11 ואילך), וההפעלה מסתיימת,
update_engine
מתקשרת אל ScheduleWaitMarkBootSuccessful()
.
WaitForMergeOrSchedule()
. הפעולה הזו תתחיל את תהליך המיזוג. עם זאת, המכשיר
מופעלת מחדש לחריץ הישן. מכיוון שהמיזוג כבר התחיל, המכשיר לא מצליח
ולא יהיה פעיל יותר.
מוסיפים את השינויים הבאים לעץ המקור. לתשומת ליבכם: CL 1664859 הוא אופציונלי.
- CL 1439792 (a) דרישה מוקדמת ל-CL 1439372)
- CL 1439372
(
CleanupPreviousUpdateAction
: ביטול משימות בהמתנה בהשמדה) - CL 1663460 (תיקון של
שגיאה פוטנציאלית של המצביע הכללי לחיפוש כאשר
markSlotSuccessful
מגיע באיחור) - CL 1664859 (אופציונלי -
הוספה של
unittest
ל-CleanupPreviousUpdateAction
)
מוודאים שהתצורה הנכונה של dm-verity
ב-Android מגרסה 11 ואילך, אפשר להגדיר בטעות מכשירים עם אפשרויות dm-ver הבאות:
CONFIG_DM_VERITY_AVB=y
בליבה (kernel)- תוכנת האתחול שהוגדרה לשימוש בכל מצב אימות (למשל
AVB_HASHTREE_ERROR_MODE_RESTART_AND_INVALIDATE
), בליAVB_HASHTREE_ERROR_MODE_MANAGED_RESTART_AND_EIO
.
בתצורת המכשיר הזו, כל שגיאת אימות גורמת למחיצת vbmeta
נפגמים והעיבוד של מכשירים שאינם מסוג A/B לא תקין. באופן דומה, אם
פעיל, ייתכן גם שמכשירי A/B לא יפעלו. השתמשו רק
מצב הגרסה (AVB_HASHTREE_ERROR_MODE_MANAGED_RESTART_AND_EIO
).
- מגדירים את
CONFIG_DM_VERITY_AVB=n
בליבה (kernel). - מגדירים את המכשירים לשימוש
במקום זאת, מצב
AVB_HASHTREE_ERROR_MODE_MANAGED_RESTART_AND_EIO
.
מידע נוסף זמין במסמכי התיעוד בנושא verity: טיפול ב-dm-verity שגיאות.
מוודאים שהקובץ שמוזג מוגדר כראוי
אם אתם בונים תמונות מערכת ותמונות ספקים בנפרד, צריך להשתמש
merge_target_files
כדי למזג אותם, הגדרות של Virtual A/B עשויות להיות
ירד באופן שגוי בתהליך המיזוג. כדי לאמת שמערכת ה-A/B הווירטואלית
ההגדרות האישיות של קובץ היעד שמוזגו נכונות, צריך להחיל את
תיקונים: CL
2084183
(מיזוג צמדי מפתח/ערך זהים בפרטי מחיצות דינמיות)
עדכון הרכיבים הדרושים
החל מ-Android 13, snapuserd
הועבר מ-ramdisk של ספק לגנרי
Ramdisk. אם המכשיר שלך משדרג ל-Android 13, ייתכן ששני המכשירים
ramdisk של ספק ו-ramdisk גנרי מכילים עותק של snapuserd
. כאן
לביצוע פעולת A/B וירטואלית נדרש עותק המערכת של snapuserd
. כדי לוודא
העותק הנכון של snapuserd
נמצא, יש להחיל CL
2031243
(מעתיקים את snapuserd
אל first_stage_ramdisk).