באנדרואיד 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
ייעודית, אין צורך בשינוי ב-ramdiskrecovery
מכיוון ש-ramdiskrecovery
הוא עצמאי.
ארכיטקטורה
התרשימים הבאים ממחישים את הארכיטקטורה עבור מכשירים עם אנדרואיד 12 ומעלה. למכשיר המושק עם אנדרואיד 13 יש תמונת init_boot
חדשה המכילה את ה-ramdisk הגנרי. מכשירים המשדרגים מאנדרואיד 12 לאנדרואיד 13 משתמשים באותה ארכיטקטורה כפי שעשו עם אנדרואיד 12.
הפעל עם אנדרואיד 13, ללא שחזור ייעודי
איור 1. מכשירים מושקים או משדרגים לאנדרואיד 13, עם GKI, ללא שחזור ייעודי
השקה עם אנדרואיד 13, ייעודי ושחזור A/B (ramdisk ייעודי)
איור 2. מכשירים מושקים או משדרגים לאנדרואיד 13, עם GKI, ייעודי ושחזור A/B
עיין באיור זה אם למכשיר יש מחיצות recovery_a
ו- recovery_b
.
השקה עם אנדרואיד 13, שחזור ייעודי ולא A/B (ramdisk ייעודי)
איור 3. מכשירים מושקים או משדרגים לאנדרואיד 13, עם GKI, שחזור ייעודי ולא A/B
עיין באיור זה אם למכשיר יש מחיצה בשם recovery
ללא סיומת חריץ.
הפעל או שדרג לאנדרואיד 12, ללא שחזור ייעודי
איור 4. מכשירים מושקים או משדרגים לאנדרואיד 12, עם GKI, ללא שחזור ייעודי
הפעל או שדרג לאנדרואיד 12, ייעודי ושחזור A/B (ramdisk ייעודי)
איור 5. מכשירים מושקים או משדרגים לאנדרואיד 12, עם GKI, ייעודי ושחזור A/B
עיין באיור זה אם למכשיר יש מחיצות recovery_a
ו- recovery_b
.
הפעל או שדרג לאנדרואיד 12, שחזור ייעודי ולא A/B (ramdisk ייעודי)
איור 6. מכשירים מושקים או משדרגים לאנדרואיד 12, עם GKI, שחזור ייעודי ולא A/B
עיין באיור זה אם למכשיר יש מחיצה בשם recovery
ללא סיומת חריץ.
שדרוג לאנדרואיד 12, התאוששות כאתחול (שחזור כ-ramdisk)
איור 7. התקנים המשדרגים לאנדרואיד 12, ללא GKI, התאוששות בעת האתחול
שדרג לאנדרואיד 12, שחזור ייעודי (ramdisk ייעודי)
איור 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 ואילך
- כלול רק בתמונות
- גרסת כותרת V3 או V4
תמונת
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
הבינארי בשלב הראשון בתמונת האתחול.
- גרסת כותרת V2
תוכן תמונת 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
לריק. אם הם עושים זאת, הם משתמשים בתצורות חדשות. אם מכשירים כאלה:
מכשירים המופעלים עם 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
Init בינאריים וסימלינקים
ה-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
Init בינאריים וסימלינקים
ה-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
(מ-ramdiskrecovery
, בנוי מ-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
. תהליך האתחול למצב שחזור הוא כדלקמן.
טוען האתחול מתחיל, ואז עושה את הפעולות הבאות:
- דוחף שחזור +
vendor_boot
+ ramdisk גנרי אל/
. (אם ה-OEM משכפל מודולי ליבה ב-ramdisk לשחזור על ידי הוספתם ל-BOARD_RECOVERY_KERNEL_MODULES
),vendor_boot
הוא אופציונלי.) - מפעיל את הליבה ממחיצת
boot
.
- דוחף שחזור +
Kernel מעלה את ramdisk אל
/
ואז מבצע את/init
מה-ramdisk הגנרי.השלב הראשון מתחיל, ואז עושה את הפעולות הבאות:
- מגדיר את
IsRecoveryMode() == true
ו-ForceNormalBoot() == false
. - טוען מודולי ליבת ספקים מ-
/lib/modules
. - קורא ל-
DoFirstStageMount()
אך מדלג על הרכבה כיIsRecoveryMode() == true
. (ההתקן לא משחרר ramdisk (מכיוון/
עדיין זהה) אבל כן קוראSetInitAvbVersionInRecovery()
.) - מתחיל את השלב השני init מ-
/system/bin/init
מ-ramdiskrecovery
.
- מגדיר את
הפיכת 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
Init בינאריים וסימלינקים
ה-ramdisk recovery
חייב להכיל /init -> /system/bin/init
symlink, ו- init_second_stage.recovery
ב- /system/bin/init
. כאשר המכשיר מאתחל למצב שחזור, הקובץ הבינארי /system/bin/init
נחוץ כדי לתמוך הן בשלב הראשון והן בשלב השני.
כאשר ההתקן מאתחל recovery
, התוכן של רדיסק recovery
הוא כדלקמן:
-
/init -> /system/bin/init
(מ-ramdiskrecovery
) -
/system/bin/init
(מ-ramdiskrecovery
, בנוי מ-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
. תהליך האתחול למצב שחזור הוא כדלקמן.
טוען האתחול מתחיל ואז עושה את הפעולות הבאות:
- דוחף ramdisk לשחזור אל
/
. - מפעיל את הליבה ממחיצת
recovery
.
- דוחף ramdisk לשחזור אל
הקרנל מעלה את ramdisk אל
/
ואז מבצע את/init
, שהוא קישור סימול ל-/system/bin/init
מ-ramdiskrecovery
.השלב הראשון מתחיל, ואז עושה את הפעולות הבאות:
- מגדיר את
IsRecoveryMode() == true
ו-ForceNormalBoot() == false
. - טוען מודולי ליבת ספקים מ-
/lib/modules
. - קורא ל-
DoFirstStageMount()
אך מדלג על הרכבה כיIsRecoveryMode() == true
. (ההתקן לא משחרר ramdisk (מכיוון/
עדיין זהה) אבל כן קוראSetInitAvbVersionInRecovery()
.) - מתחיל את השלב השני init מ-
/system/bin/init
מ-ramdiskrecovery
.
- מגדיר את
חותמות זמן של תמונת אתחול
הקוד הבא הוא קובץ חותמת זמן לדוגמה של תמונת 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
.