עדכוני מערכת ללא בדיקת A/B

עדכונים שאינם AB הם שיטת OTA מדור קודם שמשמשת מכשירים ישנים יותר של Android (Android 6 וגרסאות ישנות יותר). במכשירים האלה יש מחיצה ייעודית לשחזור שמכילה את התוכנה הדרושה כדי לפתוח את חבילת העדכון שהורדתם ולהחיל את העדכון על המחיצות האחרות.

במכשירי Android ישנים יותר ללא מחיצות A/B, נפח האחסון ב-Flash מכיל בדרך כלל את המחיצות הבאות:

אתחול
מכיל את ליבה Linux ומערכת קבצים מינימלית ברמה הבסיסית (root) (המערכת נטענת בדיסק RAM). הוא מחבר את המערכת ומחיצות אחרות ומפעיל את סביבת זמן הריצה שנמצאת במחיצה של המערכת.
מערכת
ספריות ואפליקציות מערכת שיש להן קוד מקור שזמין בפרויקט Android Open Source Project‏ (AOSP). במהלך הפעולה הרגילה, המחיצה הזו מורכבת לקריאה בלבד, והתוכן שלה משתנה רק במהלך עדכון OTA.
ספק
ספריות ואפליקציות מערכת שללא זמין להן קוד מקור בפרויקט Android Open Source Project‏ (AOSP). במהלך הפעולה הרגילה, המחיצה הזו מורכבת לקריאה בלבד, והתוכן שלה משתנה רק במהלך עדכון OTA.
userdata
כאן נשמרים הנתונים שנשמרו על ידי אפליקציות שהמשתמש התקין וכו'. בדרך כלל, תהליך העדכון ב-OTA לא נוגע למחיצה הזו.
מטמון
אזור אחסון זמני שמשמש כמה אפליקציות (כדי לגשת למחיצה הזו נדרשות הרשאות מיוחדות לאפליקציות) ולאחסון חבילות עדכון OTA שהורדתם. תוכנות אחרות משתמשות במרחב הזה, מתוך הנחה שהקבצים יכולים להיעלם בכל שלב. התקנות של חבילות OTA מסוימות עלולות למחוק את המחיצה הזו לחלוטין. המטמון מכיל גם את יומני העדכונים מעדכון OTA.
שחזור
מערכת Linux מלאה שנייה, כולל ליבה והקובץ הבינארי המיוחד לשחזור, שמקריא חבילה ומשתמש בתוכן שלה כדי לעדכן את המחיצות האחרות.
שונות
מחיצה זעירה שמשמשת את תהליך השחזור כדי לאחסן מידע מסוים על הפעולות שהוא מבצע, למקרה שהמכשיר יופעל מחדש בזמן החלת חבילת ה-OTA.

מחזור החיים של עדכון OTA

עדכון OTA אופייני כולל את השלבים הבאים:

  1. המכשיר מבצע בדיקה שוטפת עם שרתי OTA ומקבל הודעה על זמינות של עדכון, כולל כתובת ה-URL של חבילת העדכון ומחרוזת תיאור שמוצגת למשתמש.
  2. מעדכנים את ההורדות במטמון או במחיצה של נתונים, והחתימה הקריפטוגרפית שלהם מאומתת מול האישורים שב-/system/etc/security/otacerts.zip. המשתמש מתבקש להתקין את העדכון.
  3. המכשיר מופעל מחדש למצב שחזור, שבו הליבה והמערכת במחיצה לשחזור מאתחול במקום הליבה במחיצה לאתחול.
  4. קובץ הבינארי של השחזור מופעל על ידי init. הוא מוצא ארגומנטים של שורת הפקודה ב-/cache/recovery/command שמפנים אותו לחבילה שהורדתם.
  5. התהליך של שחזור הנתונים מאמת את החתימה הקריפטוגרפית של החבילה באמצעות המפתחות הציבוריים שב-/res/keys (חלק מדיסק ה-RAM שנמצא במחיצה של התהליך לשחזור).
  6. הנתונים נשלפים מהחבילה ומשמשים לעדכון המחיצות של האתחול, המערכת ו/או הספק לפי הצורך. אחד מהקבצים החדשים שנותרו במחיצה של המערכת מכיל את התוכן של מחיצת השחזור החדשה.
  7. המכשיר יופעל מחדש באופן תקין.
    1. מחלצים את מחיצת האתחול המעודכנת, מחברים אותה ומתחילים להריץ קבצים בינאריים במחיצה המערכת המעודכנת.
    2. כחלק מההפעלה הרגילה, המערכת בודקת את התוכן של מחיצת השחזור לעומת התוכן הרצוי (שאוחסן קודם בקובץ /system). אם יש הבדל, מתבצע פלאש מחדש של מחיצת השחזור עם התוכן הרצוי. (בהפעלות הבאות, מחיצה לשחזור כבר מכילה את התוכן החדש, כך שאין צורך לבצע שחזור מחדש).

עדכון המערכת הושלם! יומני העדכונים נמצאים ב-/cache/recovery/last_log.#.

עדכון חבילות

חבילת עדכון היא קובץ .zip שמכיל את קובץ הבינארי להפעלה META-INF/com/google/android/update-binary. אחרי אימות החתימה על החבילה, recovery מחלץ את הקובץ הבינארי הזה אל /tmp ומריץ אותו, עם הארגומנטים הבאים:

  • עדכון מספר הגרסה של ה-API הבינארי אם הארגומנטים שהועברו ל-update משתנים, המספר הזה עולה.
  • מתאר הקובץ של צינור הפקודה. תוכנית העדכון יכולה להשתמש בצינור הזה כדי לשלוח פקודות בחזרה לקובץ הבינארי של התהליך לשחזור, בעיקר בשביל שינויים בממשק המשתמש, כמו ציון ההתקדמות למשתמש.
  • שם הקובץ .zip של חבילת העדכון.

חבילת עדכון יכולה להשתמש בכל קובץ בינארי מקושר באופן סטטי כקובץ הבינארי של העדכון. הכלים ליצירת חבילות OTA משתמשים בתוכנית העדכון (bootable/recovery/updater), שמספקת שפת סקריפט פשוטה שיכולה לבצע משימות התקנה רבות. אפשר להחליף אותו בכל קובץ בינארי אחר שפועל במכשיר.

לפרטים על קובץ העדכון הבינארי, התחביר של edify והפונקציות המובנות, ראו Inside OTA Packages.

העברה מגרסאות קודמות

כשעוברים מגרסה של Android 2.3/3.0/4.0, השינוי העיקרי הוא ההמרה של כל הפונקציונליות הספציפית למכשיר מקבוצה של פונקציות C עם שמות מוגדרים מראש לאובייקטים של C++‎. בטבלה הבאה מפורטות הפונקציות הישנות והשיטות החדשות שמטרתן דומה:

פונקציית C שיטה ב-C++‎
device_recovery_start()‎ Device::RecoveryStart()
device_toggle_display()
device_reboot_now()
RecoveryUI::CheckKey()
(וגם RecoveryUI::IsKeyPressed())
device_handle_key()‎ Device::HandleMenuKey()
device_perform_action()‎ Device::InvokeMenuItem()
device_wipe_data()‎ Device::WipeData()‎
device_ui_init() ScreenRecoveryUI::Init()‎

המרת פונקציות ישנות לשיטות חדשות אמורה להיות פשוטה יחסית. חשוב לא לשכוח להוסיף את הפונקציה החדשה make_device() כדי ליצור מכונה של המשנה החדשה של Device ולהחזיר אותה.