מחיצת אתחול גנרית

באנדרואיד 12, תמונת boot הגנרית, המכונה תמונת ליבה כללית (GKI) , מכילה את ה-ramdisk הגנרית ואת ליבת ה-GKI.

עבור מכשירים המופעלים עם אנדרואיד 13, ה-ramdisk הגנרי מוסר מתמונת boot וממוקם בתמונת init_boot נפרדת. שינוי זה משאיר את תמונת boot עם ליבת GKI בלבד.

עבור שדרוג מכשירים שממשיכים להשתמש ב-Android 12 או גרסאות ליבה ישנות יותר, ה-ramdisk הגנרי נשאר במקום בו היה ללא דרישה לתמונת init_boot חדשה.

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

במכשירים ש:

  • אל תשתמש במחיצת recovery ייעודית, כל סיביות השחזור עוברות מה-ramdisk הגנרי אל vendor_boot ramdisk.

  • האם השתמש במחיצת recovery ייעודית, אין צורך בשינוי ב-ramdisk recovery מכיוון ש-ramdisk recovery הוא עצמאי.

ארכיטקטורה

התרשימים הבאים ממחישים את הארכיטקטורה עבור מכשירים עם אנדרואיד 12 ומעלה. למכשיר המושק עם אנדרואיד 13 יש תמונת init_boot חדשה המכילה את ה-ramdisk הגנרי. מכשירים המשדרגים מאנדרואיד 12 לאנדרואיד 13 משתמשים באותה ארכיטקטורה כפי שעשו עם אנדרואיד 12.

הפעל עם אנדרואיד 13, ללא שחזור ייעודי

הפעלה/שדרוג מכשיר, GKI, ללא שחזור ייעודי

איור 1. מכשירים מושקים או משדרגים לאנדרואיד 13, עם GKI, ללא שחזור ייעודי

השקה עם אנדרואיד 13, ייעודי ושחזור A/B (ramdisk ייעודי)

מכשיר השקה/שדרוג, GKI, ייעודי ושחזור A/B

איור 2. מכשירים מושקים או משדרגים לאנדרואיד 13, עם GKI, ייעודי ושחזור A/B

עיין באיור זה אם למכשיר יש מחיצות recovery_a ו- recovery_b .

השקה עם אנדרואיד 13, שחזור ייעודי ולא A/B (ramdisk ייעודי)

מכשיר השקה/שדרוג, GKI, שחזור ייעודי ולא A/B

איור 3. מכשירים מושקים או משדרגים לאנדרואיד 13, עם GKI, שחזור ייעודי ולא A/B

עיין באיור זה אם למכשיר יש מחיצה בשם recovery ללא סיומת חריץ.

הפעל או שדרג לאנדרואיד 12, ללא שחזור ייעודי

הפעלה/שדרוג מכשיר, GKI, ללא שחזור ייעודי

איור 4. מכשירים מושקים או משדרגים לאנדרואיד 12, עם GKI, ללא שחזור ייעודי

הפעל או שדרג לאנדרואיד 12, ייעודי ושחזור A/B (ramdisk ייעודי)

מכשיר השקה/שדרוג, GKI, ייעודי ושחזור A/B

איור 5. מכשירים מושקים או משדרגים לאנדרואיד 12, עם GKI, ייעודי ושחזור A/B

עיין באיור זה אם למכשיר יש מחיצות recovery_a ו- recovery_b .

הפעל או שדרג לאנדרואיד 12, שחזור ייעודי ולא A/B (ramdisk ייעודי)

מכשיר השקה/שדרוג, GKI, שחזור ייעודי ולא A/B

איור 6. מכשירים מושקים או משדרגים לאנדרואיד 12, עם GKI, שחזור ייעודי ולא A/B

עיין באיור זה אם למכשיר יש מחיצה בשם recovery ללא סיומת חריץ.

שדרוג לאנדרואיד 12, התאוששות כאתחול (שחזור כ-ramdisk)

הפעלה/שדרוג מכשיר, ללא GKI, התאוששות בעת האתחול

איור 7. התקנים המשדרגים לאנדרואיד 12, ללא GKI, התאוששות בעת האתחול

שדרג לאנדרואיד 12, שחזור ייעודי (ramdisk ייעודי)

התקן הפעלה/שדרוג, ללא GKI, שחזור ייעודי

איור 8. התקנים המשדרגים לאנדרואיד 12, ללא GKI, שחזור ייעודי

אתחול תוכן תמונות

תמונות האתחול של אנדרואיד מכילות את הדברים הבאים.

  • תמונת init_boot נוספה עבור מכשירים המופעלים עם אנדרואיד 13

    • גרסת כותרת V4
    • תמונת ramdisk גנרית
  • תמונת boot גנרית

    • גרסת כותרת V3 או V4
      • boot_signature עבור אישור GKI boot.img (v4 בלבד). ה-GKI המאושר boot.img אינו חתום לאתחול מאומת. יצרני OEM עדיין חייבים לחתום על boot.img המובנה מראש עם מפתח AVB ספציפי למכשיר.
      • cmdline כללי ( GENERIC_KERNEL_CMDLINE )
      • ליבת GKI
    • תמונת ramdisk גנרית
      • כלול רק בתמונות boot מאנדרואיד 12 ואילך
  • תמונת vendor_boot (לפרטים, ראה מחיצות אתחול של ספק )

    • כותרת vendor_boot
      • cmdline ספציפי למכשיר ( BOARD_KERNEL_CMDLINE )
    • תמונת ramdisk vendor_boot
      • lib/modules
      • משאבי שחזור (אם אין שחזור ייעודי)
    • תמונת dtb
  • תמונת recovery

    • גרסת כותרת V2
      • cmdline ספציפי למכשיר לשחזור, במידת הצורך
      • עבור מחיצת שחזור שאינה A/B, תוכן הכותרת חייב להיות עצמאי; ראה תמונות שחזור . לדוגמה:
      • cmdline אינו משורשר boot ול- vendor_boot cmdline .
      • הכותרת מציינת DTBO לשחזור, במידת הצורך.
      • עבור מחיצת שחזור A/B, התוכן עשוי להיות משורשר או להסיק boot ומ- vendor_boot . לדוגמה:
      • cmdline משורשר boot ו- vendor_boot cmdline .
      • ניתן להסיק DTBO מכותרת vendor_boot .
    • תמונת ramdisk recovery
      • משאבי שחזור
      • עבור מחיצת שחזור שאינה A/B, התוכן של ה-ramdisk חייב להיות עצמאי; ראה תמונות שחזור . לדוגמה:
      • lib/modules חייבים להכיל את כל מודולי הליבה הנדרשים לאתחול מצב שחזור
      • ה-ramdisk לשחזור חייב להכיל init .
      • עבור מחיצת שחזור A/B, ה-ramdisk לשחזור מוצמד ל-ramdisk הגנרי ו- vendor_boot , ומכאן שהוא לא צריך להיות עצמאי. לדוגמה:
      • lib/modules עשויים להכיל רק מודולי ליבה נוספים הדרושים לאתחול מצב שחזור מלבד מודולי ליבה ב- vendor_boot ramdisk.
      • ייתכן שהקישור הסימבולי ב- /init קיים, אבל הוא מואפל על ידי ה- /init הבינארי בשלב הראשון בתמונת האתחול.

תוכן תמונת ramdisk כללי

ה-ramdisk הגנרי מכיל את הרכיבים הבאים.

  • init
  • נוסף system/etc/ramdisk/build.prop
  • ro. PRODUCT .bootimg.* build
  • ספריות ריקות עבור נקודות הרכבה: debug_ramdisk/ , mnt/ , dev/ , sys/ , proc/ , metadata/
  • first_stage_ramdisk/
    • ספריות ריקות משוכפלות עבור נקודות הרכבה: debug_ramdisk/ , mnt/ , dev/ , sys/ , proc/ , metadata/

שילוב תמונת אתחול

דגלי Build שולטים כיצד בונים תמונות init_boot , boot , recovery ו- vendor_boot . הערך של משתנה לוח בוליאני חייב להיות המחרוזת true או להיות ריקה (שהיא ברירת המחדל).

  • TARGET_NO_KERNEL . משתנה זה מציין אם ה-build משתמש בתמונת אתחול בנויה מראש. אם משתנה זה מוגדר כ- true , הגדר את BOARD_PREBUILT_BOOTIMAGE למיקום של תמונת האתחול הבנויה מראש ( BOARD_PREBUILT_BOOTIMAGE:= device/${company}/${board}/boot.img )

  • BOARD_USES_RECOVERY_AS_BOOT . משתנה זה מציין אם המכשיר משתמש בתמונת recovery כתמונת boot . בעת שימוש ב-GKI, משתנה זה ריק ויש להעביר משאבי שחזור אל vendor_boot .

  • BOARD_USES_GENERIC_KERNEL_IMAGE . משתנה זה מציין שהלוח משתמש ב-GKI. משתנה זה אינו משפיע על sysprops או PRODUCT_PACKAGES .

    זהו מתג GKI ברמת הלוח; כל המשתנים המפורטים להלן מוגבלים על ידי משתנה זה.

  • BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT . משתנה זה שולט אם משאבי שחזור ramdisk בנויים ל- vendor_boot .

    • כאשר מוגדר כ- true , משאבי שחזור בנויים vendor-ramdisk/ בלבד ואינם בנויים recovery/root/ .

    • כשהם ריקים, משאבי השחזור בנויים recovery/root/ בלבד ואינם בנויים vendor-ramdisk/ .

  • BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT . משתנה זה שולט אם מפתחות GSI AVB בנויים ל- vendor_boot .

    • כאשר מוגדר כ- true , אם BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT :

      • מוגדר, מפתחות GSI AVB בנויים ל- $ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/avb .

      • לא מוגדר, מפתחות GSI AVB בנויים ל- $ANDROID_PRODUCT_OUT/vendor-ramdisk/avb .

    • כאשר ריק, אם BOARD_RECOVERY_AS_ROOT :

      • מוגדר, מפתחות GSI AVB בנויים ל- $ANDROID_PRODUCT_OUT/recovery/root/first_stage_ramdisk/avb .

      • לא מוגדר, מפתחות GSI AVB בנויים ל- $ANDROID_PRODUCT_OUT/ramdisk/avb .

  • BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE . משתנה זה שולט אם תמונת recovery מכילה גרעין או לא. מכשירים המופעלים עם Android 12 ומשתמשים במחיצת recovery A/B חייבים להגדיר את המשתנה הזה ל- true . מכשירים המופעלים עם Android 12 ומשתמשים ללא A/B חייבים להגדיר את המשתנה הזה ל- false כדי לשמור על תמונת השחזור עצמאית.

  • BOARD_COPY_BOOT_IMAGE_TO_TARGET_FILES . משתנה זה שולט אם $OUT/boot*.img מועתק ל- IMAGES/ תחת קבצי היעד.

    • aosp_arm64 חייב להגדיר את המשתנה הזה ל- true .

    • התקנים אחרים חייבים להשאיר משתנה זה ריק.

  • BOARD_INIT_BOOT_IMAGE_PARTITION_SIZE . משתנה זה שולט אם init_boot.img נוצר וקובע את הגודל. כאשר מוגדר, ה-ramdisk הגנרי מתווסף ל- init_boot.img במקום boot.img ודורש הגדרת המשתנים BOARD_AVB_INIT_BOOT* עבור vbmeta משורשרת.

שילובים מותרים

רכיב או משתנה משדרג מכשיר ללא מחיצת recovery משדרג מכשיר עם מחיצת recovery הפעל מכשיר ללא מחיצת recovery הפעל מכשיר עם מחיצת recovery A/B הפעל מכשיר עם מחיצת recovery שאינה A/B aosp_arm64
מכיל boot כן כן כן כן כן כן
מכיל init_boot (אנדרואיד 13) לא לא כן כן כן כן
מכיל vendor_boot אופציונאלי אופציונאלי כן כן כן לא
מכיל recovery לא כן לא כן כן לא
BOARD_USES_RECOVERY_AS_BOOT true ריק ריק ריק ריק ריק
BOARD_USES_GENERIC_KERNEL_IMAGE ריק ריק true true true true
PRODUCT_BUILD_RECOVERY_IMAGE ריק true או ריק ריק true או ריק true או ריק ריק
BOARD_RECOVERYIMAGE_PARTITION_SIZE ריק > 0 ריק > 0 > 0 ריק
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT ריק ריק true ריק ריק ריק
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT ריק ריק true true true ריק
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE ריק ריק ריק true ריק ריק
BOARD_COPY_BOOT_IMAGE_TO_TARGET_FILES ריק ריק ריק ריק ריק true

מכשירים עם מחיצת recovery ייעודית יכולים להגדיר PRODUCT_BUILD_RECOVERY_IMAGE למצב true או ריק. עבור מכשירים אלה, אם BOARD_RECOVERYIMAGE_PARTITION_SIZE מוגדר, נבנית תמונת recovery .

אפשר vbmeta משורשרת לאתחול

יש להפעיל את ה-Chained vbmeta עבור תמונות boot ו- init_boot . ציין את הדברים הבאים:

BOARD_AVB_BOOT_KEY_PATH := external/avb/test/data/testkey_rsa4096.pem
BOARD_AVB_BOOT_ALGORITHM := SHA256_RSA4096
BOARD_AVB_BOOT_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP)
BOARD_AVB_BOOT_ROLLBACK_INDEX_LOCATION := 2

BOARD_AVB_INIT_BOOT_KEY_PATH := external/avb/test/data/testkey_rsa2048.pem
BOARD_AVB_INIT_BOOT_ALGORITHM := SHA256_RSA2048
BOARD_AVB_INIT_BOOT_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP)
BOARD_AVB_INIT_BOOT_ROLLBACK_INDEX_LOCATION := 3

לדוגמא, עיין בשינוי זה .

מערכת כשורש

System-as-root אינו נתמך עבור מכשירים המשתמשים ב-GKI. במכשירים כאלה, BOARD_BUILD_SYSTEM_ROOT_IMAGE חייב להיות ריק. System-as-root גם אינו נתמך עבור מכשירים המשתמשים במחיצות דינמיות.

תצורות מוצר

התקנים המשתמשים ב-ramdisk הגנרי חייבים להתקין רשימה של קבצים המותרים להתקנה ב-ramdisk. כדי לעשות זאת, ציין את הדברים הבאים ב- device.mk :

$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)

הקובץ generic_ramdisk.mk מונע גם מקבצי make-אחרים להתקין בטעות קבצים אחרים ל-ramdisk (העבר קבצים כאלה ל- vendor_ramdisk במקום זאת).

הגדרת מכשירים

הוראות ההגדרה שונות בין מכשירים המופעלים עם אנדרואיד 13, משודרגים לאנדרואיד 12 והשקה עם אנדרואיד 12. אנדרואיד 13, מוגדרות בדומה לאופן שבו הן היו עם אנדרואיד 12

  • מכשירים המשדרגים לאנדרואיד 12:

    • יכול לשמר את הערך של BOARD_USES_RECOVERY_AS_BOOT . אם הם עושים זאת, הם משתמשים בתצורות מדור קודם ומשתני בנייה חדשים חייבים להיות ריקים. אם מכשירים כאלה:

      • הגדר את BOARD_USES_RECOVERY_AS_BOOT ל- true , הארכיטקטורה היא כפי שמוצג באיור 3 .

      • הגדר את BOARD_USES_RECOVERY_AS_BOOT לריק, הארכיטקטורה היא כפי שמוצג באיור 4 .

    • יכול להגדיר את BOARD_USES_RECOVERY_AS_BOOT לריק. אם הם עושים זאת, הם משתמשים בתצורות חדשות. אם מכשירים כאלה:

  • מכשירים המופעלים עם Android 12 חייבים להגדיר את BOARD_USES_RECOVERY_AS_BOOT להתרוקן ולהשתמש בתצורות חדשות. אם מכשירים כאלה:

מכיוון ש- aosp_arm64 בונה רק GKI (ולא vendor_boot או התאוששות), זה לא יעד שלם. עבור תצורות build aosp_arm64 , עיין ב- generic_arm64 .

אפשרות 1: אין מחיצת שחזור ייעודית

התקנים ללא מחיצת recovery מכילים את תמונת boot הגנרית במחיצת boot . ה-ramdisk vendor_boot מכיל את כל משאבי השחזור, כולל lib/modules (עם מודולי ליבת הספק). במכשירים כאלה, תצורת המוצר יורשת מ- generic_ramdisk.mk .

הגדרת ערכי BOARD

הגדר את הערכים הבאים:

BOARD_USES_RECOVERY_AS_BOOT :=
BOARD_USES_GENERIC_KERNEL_IMAGE := true
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT := true
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE :=
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT := true

ה-ramdisk vendor_boot יכול להכיל /init אל /system/bin/init סימלינק, ו- init_second_stage.recovery ב- /system/bin/init . עם זאת, מכיוון שה-ramdisk הגנרי משורשר אחרי ה-ramdisk vendor_boot , ה-Symlink /init מוחלף. כאשר המכשיר מאתחל לשחזור, יש צורך בקובץ הבינארי /system/bin/init כדי לתמוך בשלב השני של init. התוכן של vendor_boot + דיסקים גנריים ramdisk הוא כדלקמן:

  • /init (מ-ramdisk גנרי, בנוי מ- init_first_stage )
  • /system/bin/init (מ- vendor_ramdisk , בנוי מ- init_second_stage.recovery )

העברת קבצי fstab

העבר קבצי fstab כלשהם שהותקנו ל-ramdisk הגנרי אל vendor_ramdisk . לדוגמא, עיין בשינוי זה .

התקנת מודולים

אם תרצה, תוכל להתקין מודולים ספציפיים למכשיר ב- vendor_ramdisk (דלג על שלב זה אם אין לך מודולים ספציפיים למכשיר להתקין).

  • השתמש בגרסה vendor_ramdisk של המודול כאשר המודול מותקן ב- /first_stage_ramdisk . מודול זה אמור להיות זמין לאחר init מחליף את root ל- /first_stage_ramdisk , אך לפני init מחליף את ה-root ל- /system . לדוגמאות, ראה סכומי בדיקת מטא נתונים ודחיסת A/B וירטואלית .

  • השתמש בגרסת recovery של המודול כאשר המודול מותקן ב- / . מודול זה צריך להיות זמין לפני ש- init יחליף את השורש ל- /first_stage_ramdisk . לפרטים על התקנת מודולים ל / , ראה קונסולת שלב ראשון .

קונסולת שלב ראשון

מכיוון שמסוף השלב הראשון מתחיל לפני init מחליף root ל- /first_stage_ramdisk , עליך להתקין את גרסת recovery של המודולים. כברירת מחדל, שתי גרסאות המודול מותקנות ל- build/make/target/product/base_vendor.mk , כך שאם קובץ ה-makefile של המכשיר יורש מאותו קובץ, אין צורך להתקין במפורש את גרסת recovery .

כדי להתקין באופן מפורש את מודולי השחזור, השתמש בדברים הבאים.

PRODUCT_PACKAGES += \
    linker.recovery \
    shell_and_utilities_recovery \

זה מבטיח linker , sh ו- toybox יתקינו ב- $ANDROID_PRODUCT_OUT/recovery/root/system/bin , אשר לאחר מכן מותקן ב- /system/bin תחת vendor_ramdisk .

כדי להוסיף מודולים הדרושים לקונסולת השלב הראשון (לדוגמה, adbd), השתמש בדברים הבאים.

PRODUCT_PACKAGES += adbd.recovery

זה מבטיח שהמודולים שצוינו יותקנו ב- $ANDROID_PRODUCT_OUT/recovery/root/system/bin , אשר לאחר מכן מותקן ב- /system/bin תחת vendor_ramdisk .

סיכומי בדיקה של מטא נתונים

כדי לתמוך בסכימי בדיקת מטא נתונים במהלך ההרכבה בשלב ראשון, מכשירים שאינם תומכים ב-GKI מתקינים את גרסת ה-ramdisk של המודולים הבאים. כדי להוסיף תמיכה עבור GKI, העבר את המודולים אל $ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin :

PRODUCT_PACKAGES += \
    linker.vendor_ramdisk \
    resize2fs.vendor_ramdisk \
    tune2fs.vendor_ramdisk \

לדוגמא, עיין ברשימת שינויים זו .

דחיסת A/B וירטואלית

כדי לתמוך בדחיסת A/B וירטואלית, יש להתקין snapuserd ב- vendor_ramdisk . ההתקן אמור לרשת מ- virtual_ab_ota/compression.mk , שמתקין את גרסת vendor_ramdisk של snapuserd .

שינויים בתהליך האתחול

תהליך האתחול לשחזור או לאנדרואיד אינו משתנה, למעט החריג הבא:

  • Ramdisk build.prop עובר ל- /second_stage_resources כך שהשלב השני init יכול לקרוא את חותמת הזמן של הבנייה של האתחול.

מכיוון שמשאבים עוברים מ-ramdisk גנרי ל-ramdisk vendor_boot , התוצאה של שרשור ramdisk גנרי ל-ramdisk vendor_boot אינה משתנה.

הפיכת e2fsck לזמין

ה-makefiles של המכשיר יכולים לרשת מ:

  • virtual_ab_ota/launch_with_vendor_ramdisk.mk אם ההתקן תומך ב-A/B וירטואלי אך לא בדחיסה.

  • virtual_ab_ota/compression.mk אם המכשיר תומך בדחיסת A/B וירטואלית.

קבצי המייקאפ של המוצר מתקינים $ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin/e2fsck . בזמן ריצה, השלב הראשון init מחליף את root לתוך /first_stage_ramdisk ואז מבצע את /system/bin/e2fsck .

אפשרות 2a: מחיצת שחזור ייעודית ו-A/B

השתמש באפשרות זו עבור מכשירים עם מחיצות recovery A/B; כלומר, למכשיר יש מחיצת recovery_a ו- recovery_b partition . התקנים כאלה כוללים התקני A/B ו-Virtual A/B אשר מחיצת השחזור שלהם ניתנת לעדכון, עם התצורה הבאה:

AB_OTA_PARTITIONS += recovery

ה-ramdisk vendor_boot מכיל את סיביות הספק של מודולי ה-ramdisk וגרעין הספק, כולל את הדברים הבאים:

  • קבצי fstab הספציפיים למכשיר

  • lib/modules (כולל מודולי ליבת הספק)

ה-ramdisk recovery מכיל את כל משאבי השחזור. במכשירים כאלה, תצורת המוצר יורשת מ- generic_ramdisk.mk .

הגדרת ערכי BOARD

הגדר את הערכים הבאים עבור מכשירים עם מחיצת recovery A/B:

BOARD_USES_RECOVERY_AS_BOOT :=
BOARD_USES_GENERIC_KERNEL_IMAGE := true
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT :=
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE := true
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT := true

ה-ramdisk recovery יכול להכיל /init -> /system/bin/init symlink, ו- init_second_stage.recovery ב- /system/bin/init . עם זאת, מכיוון ש-ramdisk האתחול משורשר לאחר ה-ramdisk recovery , ה-Symlink /init מוחלף. כאשר המכשיר מאתחל למצב שחזור, יש צורך בקובץ הבינארי /system/bin/init כדי לתמוך בשלב השני של init.

כאשר המכשיר מאתחל recovery , התוכן של recovery + vendor_boot + תקליטורים גנריים הם כדלקמן:

  • /init (מ-ramdisk, בנוי מ- init_first_stage )
  • /system/bin/init (מ-ramdisk recovery , בנוי מ- init_second_stage.recovery , ומבוצע מ- /init )

כאשר המכשיר מאתחל באנדרואיד, התוכן של vendor_boot + דיסקים גנריים של ramdisks הוא כדלקמן:

  • /init (מ-ramdisk גנרי, בנוי מ- init_first_stage )

העברת קבצי fstab

העבר קבצי fstab כלשהם שהותקנו ל-ramdisk הגנרי אל vendor_ramdisk . לדוגמא, עיין בשינוי זה .

התקנת מודולים

אם תרצה, תוכל להתקין מודולים ספציפיים למכשיר ב- vendor_ramdisk (דלג על שלב זה אם אין לך מודולים ספציפיים למכשיר להתקין). Init לא מחליף שורש. גרסת המודולים vendor_ramdisk מותקנת בשורש של vendor_ramdisk . לדוגמאות להתקנת מודולים ב- vendor_ramdisk , ראה מסוף שלב ראשון , סכומי בדיקת מטא נתונים ודחיסת A/B וירטואלית .

קונסולת שלב ראשון

כדי להתקין את גרסת vendor_ramdisk של המודולים, השתמש בפעולות הבאות:

PRODUCT_PACKAGES += \
    linker.vendor_ramdisk \
    shell_and_utilities_vendor_ramdisk \

זה מבטיח linker , sh ו- toybox יתקינו ב- $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin , אשר לאחר מכן מותקן ב- /system/bin תחת ה- vendor_ramdisk .

כדי להוסיף מודולים הדרושים למסוף השלב הראשון (לדוגמה, adbd), הפעל את גרסת vendor_ramdisk של מודולים אלה על ידי העלאת תיקונים רלוונטיים ל-AOSP, ולאחר מכן השתמש באפשרויות הבאות,

PRODUCT_PACKAGES += adbd.vendor_ramdisk

זה מבטיח שהמודולים שצוינו יתקינו ב- $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin . אם ה-ramdisk vendor_boot נטען במצב שחזור, המודול זמין גם recovery . אם ה-ramdisk vendor_boot לא נטען במצב שחזור, ההתקן יכול להתקין גם adbd.recovery באופן אופציונלי.

סיכומי בדיקה של מטא נתונים

כדי לתמוך בסכימי בדיקת מטא נתונים במהלך ההרכבה בשלב ראשון, מכשירים שאינם תומכים ב-GKI מתקינים את גרסת ה-ramdisk של המודולים הבאים. כדי להוסיף תמיכה עבור GKI, העבר את המודולים ל- $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin :

PRODUCT_PACKAGES += \
    linker.vendor_ramdisk \
    resize2fs.vendor_ramdisk \
    tune2fs.vendor_ramdisk \

לדוגמא, עיין ברשימת שינויים זו .

דחיסת A/B וירטואלית

כדי לתמוך בדחיסת A/B וירטואלית, יש להתקין snapuserd ב- vendor_ramdisk . ההתקן אמור לרשת מ- virtual_ab_ota/compression.mk , שמתקין את גרסת vendor_ramdisk של snapuserd .

שינויים בתהליך האתחול

בעת אתחול לאנדרואיד, תהליך האתחול אינו משתנה. ה- vendor_boot + ramdisk גנרי דומה לתהליך האתחול הקיים, אלא ש- fstab נטען מ- vendor_boot . מכיוון שמערכת system/bin/recovery לא קיים, first_stage_init מטפל בזה כאתחול רגיל.

בעת אתחול למצב שחזור, תהליך האתחול משתנה. השחזור + vendor_boot + ramdisk גנרי דומה לתהליך השחזור הקיים, אך הליבה נטען מתמונת boot במקום מתמונת recovery . תהליך האתחול למצב שחזור הוא כדלקמן.

  1. טוען האתחול מתחיל, ואז עושה את הפעולות הבאות:

    1. דוחף שחזור + vendor_boot + ramdisk גנרי אל / . (אם ה-OEM משכפל מודולי ליבה ב-ramdisk לשחזור על ידי הוספתם ל- BOARD_RECOVERY_KERNEL_MODULES ), vendor_boot הוא אופציונלי.)
    2. מפעיל את הליבה ממחיצת boot .
  2. Kernel מעלה את ramdisk אל / ואז מבצע את /init מה-ramdisk הגנרי.

  3. השלב הראשון מתחיל, ואז עושה את הפעולות הבאות:

    1. מגדיר את IsRecoveryMode() == true ו- ForceNormalBoot() == false .
    2. טוען מודולי ליבת ספקים מ- /lib/modules .
    3. קורא ל- DoFirstStageMount() אך מדלג על הרכבה כי IsRecoveryMode() == true . (ההתקן לא משחרר ramdisk (מכיוון / עדיין זהה) אבל כן קורא SetInitAvbVersionInRecovery() .)
    4. מתחיל את השלב השני init מ- /system/bin/init מ-ramdisk recovery .

הפיכת e2fsck לזמין

קבצי המייקאפ של המכשיר יכולים לרשת מ:

  • virtual_ab_ota/launch_with_vendor_ramdisk.mk אם ההתקן תומך ב-A/B וירטואלי אך לא בדחיסה.

  • virtual_ab_ota/compression.mk אם המכשיר תומך בדחיסת A/B וירטואלית.

קבצי המייקאפ של המוצר מתקינים $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin/e2fsck . בזמן ריצה, השלב הראשון init מבצע את /system/bin/e2fsck .

אפשרות 2b: מחיצת שחזור ייעודית ולא A/B

השתמש באפשרות זו עבור מכשירים עם מחיצת recovery שאינה A/B; כלומר, למכשיר יש מחיצה בשם recovery ללא סיומת חריץ. מכשירים כאלה כוללים:

  • מכשירים שאינם A/B;
  • התקני A/B ו-Virtual A/B, אשר מחיצת השחזור שלהם אינה ניתנת לעדכון. (זה יוצא דופן.)

ה-ramdisk vendor_boot מכיל את סיביות הספק של מודולי ה-ramdisk וגרעין הספק, כולל את הדברים הבאים:

  • קבצי fstab הספציפיים למכשיר
  • lib/modules (כולל מודולי ליבת הספק)

תמונת recovery חייבת להיות עצמאית. הוא חייב להכיל את כל המשאבים הנדרשים כדי לאתחל את מצב השחזור, כולל:

  • תמונת הגרעין
  • תמונת DTBO
  • מודולי ליבה ב- lib/modules
  • init שלב ראשון כ-Symlink /init -> /system/bin/init
  • שלב שני init בינארי /system/bin/init
  • קבצי fstab הספציפיים למכשיר
  • כל שאר משאבי השחזור, כולל הבינארי recovery וכו'.
  • וכו '

במכשירים כאלה, תצורת המוצר יורשת מ- generic_ramdisk.mk .

הגדרת ערכי BOARD

הגדר את הערכים הבאים עבור התקנים שאינם A/B:

BOARD_USES_RECOVERY_AS_BOOT :=
BOARD_USES_GENERIC_KERNEL_IMAGE := true
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT :=
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE :=
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT := true

ה-ramdisk recovery חייב להכיל /init -> /system/bin/init symlink, ו- init_second_stage.recovery ב- /system/bin/init . כאשר המכשיר מאתחל למצב שחזור, הקובץ הבינארי /system/bin/init נחוץ כדי לתמוך הן בשלב הראשון והן בשלב השני.

כאשר ההתקן מאתחל recovery , התוכן של רדיסק recovery הוא כדלקמן:

  • /init -> /system/bin/init (מ-ramdisk recovery )
  • /system/bin/init (מ-ramdisk recovery , בנוי מ- init_second_stage.recovery , ומבוצע מ- /init )

כאשר המכשיר מאתחל באנדרואיד, התוכן של vendor_boot + דיסקים גנריים של ramdisks הוא כדלקמן:

  • /init (מ-ramdisk, בנוי מ- init_first_stage )

העברת קבצי fstab

העבר קבצי fstab כלשהם שהותקנו ל-ramdisk הגנרי אל vendor_ramdisk ו-ramdisk recovery . לדוגמא, עיין בשינוי זה .

התקנת מודולים

אם תרצה, תוכל להתקין מודולים ספציפיים להתקן ב- vendor_ramdisk ו-ramdisk recovery (דלג על שלב זה אם אין לך מודולים ספציפיים להתקן להתקין). init לא מחליף שורש. גרסת המודולים vendor_ramdisk מותקנת בשורש של vendor_ramdisk . גרסת recovery של המודולים מותקנת בשורש ה-ramdisk recovery . לדוגמאות על התקנת מודולים ל- vendor_ramdisk ו-ramdisk recovery , ראה מסוף שלב ראשון ומטא נתונים .

קונסולת שלב ראשון

כדי להתקין את גרסת vendor_ramdisk של המודולים, השתמש בפעולות הבאות:

PRODUCT_PACKAGES += \
    linker.vendor_ramdisk \
    shell_and_utilities_vendor_ramdisk \

זה מבטיח linker , sh ו- toybox יתקינו ב- $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin , אשר לאחר מכן מותקן ב- /system/bin תחת ה- vendor_ramdisk .

כדי להוסיף מודולים הדרושים למסוף השלב הראשון (לדוגמה, adbd), הפעל את גרסת vendor_ramdisk של מודולים אלה על ידי העלאת תיקונים רלוונטיים ל-AOSP, ולאחר מכן השתמש באפשרויות הבאות,

PRODUCT_PACKAGES += adbd.vendor_ramdisk

זה מבטיח שהמודולים שצוינו יתקינו ב- $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin .

כדי להתקין את גרסת recovery של המודולים, החלף את vendor_ramdisk recovery :

PRODUCT_PACKAGES += \
    linker.recovery \
    shell_and_utilities_recovery \
    adbd.recovery \

סיכומי בדיקה של מטא נתונים

כדי לתמוך בסכימי בדיקת מטא נתונים במהלך ההרכבה בשלב ראשון, מכשירים שאינם תומכים ב-GKI מתקינים את גרסת ה-ramdisk של המודולים הבאים. כדי להוסיף תמיכה עבור GKI, העבר את המודולים ל- $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin :

PRODUCT_PACKAGES += \
    linker.vendor_ramdisk \
    resize2fs.vendor_ramdisk \
    tune2fs.vendor_ramdisk \

כדי לתמוך בסכימי בדיקת מטא נתונים במהלך ההרכבה בשלב הראשון בשחזור, הפעל את גרסת השחזור של מודולים אלה והתקן אותם גם כן.

שינויים בתהליך האתחול

בעת אתחול לאנדרואיד, תהליך האתחול אינו משתנה. ה- vendor_boot + ramdisk גנרי דומה לתהליך האתחול הקיים, אלא ש- fstab נטען מ- vendor_boot . מכיוון שמערכת system/bin/recovery לא קיים, first_stage_init מטפל בזה כאתחול רגיל.

בעת אתחול למצב שחזור, תהליך האתחול אינו משתנה. ה-ramdisk לשחזור נטען באותו אופן כמו תהליך השחזור הקיים. הקרנל נטען מתמונת recovery . תהליך האתחול למצב שחזור הוא כדלקמן.

  1. טוען האתחול מתחיל ואז עושה את הפעולות הבאות:

    1. דוחף ramdisk לשחזור אל / .
    2. מפעיל את הליבה ממחיצת recovery .
  2. הקרנל מעלה את ramdisk אל / ואז מבצע את /init , שהוא קישור סימול ל- /system/bin/init מ-ramdisk recovery .

  3. השלב הראשון מתחיל, ואז עושה את הפעולות הבאות:

    1. מגדיר את IsRecoveryMode() == true ו- ForceNormalBoot() == false .
    2. טוען מודולי ליבת ספקים מ- /lib/modules .
    3. קורא ל- DoFirstStageMount() אך מדלג על הרכבה כי IsRecoveryMode() == true . (ההתקן לא משחרר ramdisk (מכיוון / עדיין זהה) אבל כן קורא SetInitAvbVersionInRecovery() .)
    4. מתחיל את השלב השני init מ- /system/bin/init מ-ramdisk recovery .

חותמות זמן של תמונת אתחול

הקוד הבא הוא קובץ חותמת זמן לדוגמה של תמונת boot .

####################################
# from generate-common-build-props
# These properties identify this partition image.
####################################
ro.product.bootimage.brand=Android
ro.product.bootimage.device=generic_arm64
ro.product.bootimage.manufacturer=unknown
ro.product.bootimage.model=AOSP on ARM64
ro.product.bootimage.name=aosp_arm64
ro.bootimage.build.date=Mon Nov 16 22:46:27 UTC 2020
ro.bootimage.build.date.utc=1605566787
ro.bootimage.build.fingerprint=Android/aosp_arm64/generic_arm64:S/MASTER/6976199:userdebug/test-keys
ro.bootimage.build.id=MASTER
ro.bootimage.build.tags=test-keys
ro.bootimage.build.type=userdebug
ro.bootimage.build.version.incremental=6976199
ro.bootimage.build.version.release=11
ro.bootimage.build.version.release_or_codename=S
ro.bootimage.build.version.sdk=30
# Auto-added by post_process_props.py
persist.sys.usb.config=none
# end of file
  • בזמן הבנייה, מתווסף קובץ system/etc/ramdisk/build.prop ל-ramdisk הגנרי. קובץ זה מכיל מידע על חותמת הזמן של ה-build.

  • בזמן ריצה, init השלב הראשון מעתיק קבצים מה-ramdisk ל- tmpfs לפני שחרור ה-ramdisk, כך שהשלב השני init יכול לקרוא את הקובץ הזה כדי להגדיר מאפייני חותמת זמן של תמונת boot .