ב-Android 12, התמונה הגנרית של boot
נקראת
תמונת ליבה גנרית (GKI),
מכיל את ה-ramdisk הכללי ואת הליבה של GKI.
במכשירים שמושקים עם Android 13,
ramdisk יוסר מהתמונה של boot
וימוקם בinit_boot
נפרד.
תמונה. השינוי הזה משאיר את תמונת boot
עם רק
ליבת GKI.
כדי לשדרג מכשירים שממשיכים להשתמש ב-Android 12
או גרסאות ליבה ישנות יותר, ה-RAMdisk הגנרי נותר באותו מקום
אין דרישה לתמונה חדשה של init_boot
.
כדי לבנות רדיסק כללי, צריך להעביר משאבים ספציפיים לספק מחוץ לרדיסק.
כך ש-Radisk הגנרי מכיל רק את השלב הראשון init
ומאפיין
שמכיל פרטים של חותמת זמן.
במכשירים:
אין להשתמש במחיצת
recovery
ייעודית, כל ביטים של השחזור עוברים רדיסק כללי ל-Radisk שלvendor_boot
.כדאי להשתמש במחיצה ייעודית של
recovery
, ללא שינוי ב-ramdisk שלrecovery
. יש צורך כי ה-ramdiskrecovery
עומד בפני עצמו.
ארכיטקטורה
התרשימים הבאים ממחישים את הארכיטקטורה של מכשירים שפועלת בהם מערכת Android
12 ומעלה.
למכשיר שמושק עם Android 13 יש
תמונה אחת (init_boot
) שמכילה את הרדיסק הגנרי.
מכשירים שמשדרגים מ-Android 12 ל-Android
13 משתמשים באותה ארכיטקטורה שבה הם השתמשו
Android 12.
השקה עם Android 13, ללא שחזור ייעודי
איור 1. מכשירים שמושקים או משדרגים ל-Android 13, עם GKI, ללא שחזור ייעודי.
השקה עם Android 13, מכשיר ייעודי ושחזור A/B (ramdisk ייעודי)
איור 2. מכשירים שמושקים או משודרגים ל-Android 13, עם GKI, שחזור ייעודי ושחזור A/B.
אם במכשיר יש מחיצות recovery_a
ו-recovery_b
, צריך לעיין באיור הזה.
השקה עם Android 13, שחזור ייעודי ולא באמצעות A/B (ramdisk ייעודי)
איור 3. מכשירים שמושקים או משודרגים ל-Android 13, עם GKI, שחזור ייעודי וללא A/B.
צריך לעיין באיור הזה אם במכשיר יש מחיצה בשם recovery
ללא
הסיומת של משבצת הזמן.
השקה או שדרוג ל-Android 12, ללא שחזור ייעודי
איור 4. מכשירים שמושקים או משדרגים ל-Android 12, עם GKI, ללא שחזור ייעודי.
השקה או שדרוג ל-Android 12, שחזור ייעודי ושחזור A/B (ramdisk ייעודי)
איור 5. מכשירים שמושקים או משודרגים ל-Android 12, עם GKI, תמיכה ייעודית ושחזור A/B.
אם במכשיר יש מחיצות recovery_a
ו-recovery_b
, צריך לעיין באיור הזה.
הפעלה או שדרוג ל-Android 12, שחזור ייעודי ולא מבוסס-A/B (רדיסק ייעודי)
איור 6. מכשירים שמושקים או משודרגים ל-Android 12, עם GKI, שחזור ייעודי וללא A/B.
צריך לעיין באיור הזה אם במכשיר יש מחיצה בשם recovery
ללא
הסיומת של משבצת הזמן.
שדרוג ל-Android 12, שחזור כהפעלה (שחזור כ-ramdisk)
איור 7. מכשירים שמשדרגים ל-Android 12, ללא GKI, שחזור כהפעלה.
שדרוג ל-Android 12, שחזור ייעודי (ramdisk ייעודי)
איור 8. מכשירים שמשדרגים ל-Android 12, ללא GKI, שחזור ייעודי.
תוכן של תמונות הפעלה
תמונות האתחול של Android כוללות את הפרטים הבאים.
נוספה תמונה אחת (
init_boot
) למכשירים עם Android 13- גרסת כותרת V4
- תמונה גנרית של Ramdisk
תמונה גנרית אחת (
boot
)- גרסת כותרת V3 או
גרסה 4
boot_signature
להסמכת GKIboo.img (גרסה 4 בלבד). אישור GKIboot.img
לא חתום להפעלה מאומתת. יצרני ציוד מקורי עדיין צריכים לחתום עלboot.img
המובנה מראש באמצעות מודל ספציפי למכשיר. AVB מקש.cmdline
כללי (GENERIC_KERNEL_CMDLINE
)- ליבת GKI
- תמונה גנרית של Ramdisk
- כלול רק ב-
boot
תמונות מ-Android 12 ומוקדם יותר
- כלול רק ב-
- גרסת כותרת V3 או
גרסה 4
תמונת
vendor_boot
(לפרטים, ראו אתחול ספק) מחיצות)- כותרת
vendor_boot
cmdline
ספציפי למכשיר (BOARD_KERNEL_CMDLINE
)
- תמונה של
vendor_boot
ramdisklib/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
.
- תמונה של
recovery
ramdisk- מקורות מידע לשחזור החשבון
- עבור מחיצת שחזור שאינה A/B, התוכן של ה-ramdisk חייב להיות עצמאי; לראות תמונות שחזור. לדוגמה:
lib/modules
חייב להכיל את כל מודולי הליבה הנדרשים להפעלה מצב שחזור- ramdisk השחזור חייב להכיל
init
. - עבור מחיצת שחזור A/B, רדיסק השחזור מופיע בתחילת מחיצת השחזור
ראשי ו
vendor_boot
, ולכן הוא לא צריך להיות בנפרד. לדוגמה: lib/modules
עשוי להכיל רק מודולים של ליבה נוספים שנדרשים כדי מצב התאוששות מאתחול מלבד מודולים של ליבה (kernel) ב-ramdisk שלvendor_boot
.- ייתכן שהקישור הסמלי ב-
/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/
- ספריות ריקות כפולות לנקודות טעינה:
שילוב קובץ האימג' של האתחול
יצירת דגלים קובעים את האופן שבו 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
המשתנה הזה מציין שהלוח משתמש ג'קי. המשתנה הזה לא משפיע על מערכות יחסים או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
מכילה ליבה (kernel) או לא. מכשירים שמופעלים עם 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
נוצרת ומגדירה את הגודל. כאשר מוגדר, ה-Rramdisk הגנרי נוסף אלinit_boot.img
במקום אלboot.img
ומחייבBOARD_AVB_INIT_BOOT*
משתנים להגדרה vbmeta משורשרות.
שילובים מותרים
רכיב או משתנה | שדרוג המכשיר ללא מחיצת שחזור | שדרוג המכשיר עם מחיצת שחזור | הפעלת המכשיר ללא מחיצת שחזור | הפעלת המכשיר עם מחיצה לשחזור A/B | הפעלת המכשיר עם מחיצת שחזור ללא חיבור A/B | aosp_arm64 |
---|---|---|---|---|---|---|
מכיל את boot |
כן | כן | כן | כן | כן | כן |
מכיל init_boot (Android 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 בשרשרת להפעלה
צריך להפעיל 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
לדוגמה, אפשר להיעזר ב שינוי.
מערכת ברמה הבסיסית (root)
התכונה 'מערכת בתור הבסיס' לא נתמכת במכשירים שמשתמשים ב-GKI. במצב מופעל
מכשירים כאלה, BOARD_BUILD_SYSTEM_ROOT_IMAGE
חייב להיות ריק. מערכת ברמה הבסיסית (root)
אינה נתמכת גם במכשירים המשתמשים במחיצות דינמיות.
הגדרות מוצר
מכשירים שמשתמשים ב-ramdisk הכללי חייבים להתקין רשימה של קבצים
מותר להתקין ב-ramdisk. כדי לעשות זאת, צריך לציין את הקוד הבא:
device.mk
:
$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)
הקובץ generic_ramdisk.mk
גם מונע בטעות מלצרות קבצים מסוגים אחרים
להתקין קבצים אחרים ל-ramdisk (להעביר קבצים כאלה אל vendor_ramdisk
במקום זאת).
הגדרת מכשירים
הוראות ההגדרה משתנות בהתאם למכשיר שמופעל עם Android 13, ואנחנו משדרגים ל-Android 12 ונשיק אותו עם Android 12. ההגדרות של Android 13 דומות לאופן שבו הן היו ב-Android 12
מכשירים שמשדרגים ל-Android 12:
אפשר לשמור על הערך של
BOARD_USES_RECOVERY_AS_BOOT
. אם הוא עושה זאת, הם משתמשים בהגדרות מדור קודם, ומשתני build חדשים חייבים להיות ריקים. אם קיים מכשירים:אפשר להגדיר את
BOARD_USES_RECOVERY_AS_BOOT
כריק. אם הם עושים זאת, הם משתמשים לתצורות חדשות. אם מכשירים כאלה:
במכשירים עם Android 12 צריך להגדיר
BOARD_USES_RECOVERY_AS_BOOT
כדי לרוקן את קובצי ההגדרות האישיות ולהשתמש בהם. אם קיים מכשירים:
מכיוון ש-aosp_arm64
יוצר רק GKI (ולא vendor_boot
או שחזור),
אינו יעד מלא. למידע על aosp_arm64
הגדרות build, תוכלו לעיין במאמר בנושא
generic_arm64
.
אפשרות 1: ללא מחיצת שחזור ייעודית
מכשירים ללא מחיצת recovery
מכילים את התמונה הכללית של boot
במקטע
מחיצה boot
. ה-ramdisk של vendor_boot
מכיל את כל משאבי השחזור,
כולל lib/modules
(עם מודולים של ליבה (kernel) של ספק). במכשירים כאלה,
הגדרות מוצר עוברות בירושה מ-
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
. אבל, מכיוון
ורדיסק גנרי משורשר אחרי הרדיסק vendor_boot
, /init
הקישור הסימבולי מוחלף. כשהמכשיר מתחיל באתחול,
הקוד הבינארי של /system/bin/init
נדרש כדי לתמוך באתחול בשלב שני. תוכן העניינים
של vendor_boot
+ נתיבים גנריים הם ככה:
/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
עובר שורש ל-/first_stage_ramdisk
אבל לפניinit
עובר שורש/system
. למידע נוסף, עיינו בקטע סיכומי ביקורת (checksums) של מטא-נתונים דחיסת נתוני A/B וירטואליים.משתמשים בווריאנט
recovery
של המודול כשהמודול מותקן ב-/
. המודול הזה צריך להיות זמין לפני ש-init
יעבור לרמה הבסיסית (root)/first_stage_ramdisk
. לפרטים על התקנת מודולים ב-/
, ראו ראשית מסוף השלב.
מסוף השלב הראשון
כי המסוף של השלב הראשון מתחיל לפני ש-init
מועבר לרמה הבסיסית (root)
/first_stage_ramdisk
, עליך להתקין את גרסת recovery
של המודולים.
כברירת מחדל, שתי הווריאציות של המודול מותקנות על
build/make/target/product/base_vendor.mk
, כך שאם המכשיר יוצר קובץ בירושה
מהקובץ הזה אין צורך להתקין באופן מפורש את הווריאציה 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
.
סיכום ביקורת (checksum) של מטא-נתונים
כדי לתמוך במטא-נתונים
בדיקת סיכום (checksums)
במהלך הטעינה בשלב הראשון, מכשירים שלא תומכים ב-GKI מתקינים את הרדיסק
של המודולים הבאים. כדי להוסיף תמיכה ב-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
.
שינויים בתהליך האתחול
תהליך האתחול לצורך שחזור או ל-Android לא משתנה, עם החריג הבא:
- Ramdisk
build.prop
עובר אל/second_stage_resources
כך שיש שלב שני. הפונקציהinit
יכולה לקרוא את חותמת הזמן של ה-build של האתחול.
מכיוון שמשאבים עוברים מ-ramdisk כללי ל-Radisk של vendor_boot
, התוצאה היא
שרשור שרשורי הרדיסקים הכלליים ל-ramdisk של vendor_boot
לא משתנה.
הגדרת e2fsck
קובצי ה-Makefile במכשיר יכולים לרשת מ:
virtual_ab_ota/launch_with_vendor_ramdisk.mk
אם המכשיר תומך בצפייה וירטואלית A/B אבל לא דחיסה.virtual_ab_ota/compression.mk
אם המכשיר תומך ב-A/B וירטואלי דחיסה.
פרטי ההתקנה של קובצי cookie של המוצר
$ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin/e2fsck
בשעה
סביבת זמן הריצה, השלב הראשון init
עובר לרמה /first_stage_ramdisk
ואז
מבצעת את /system/bin/e2fsck
.
אפשרות 2א: מחיצה ייעודית לשחזור חשבון A/B
שימוש באפשרות הזו במכשירים עם מחיצות recovery
A/B. כלומר,
במכשיר יש recovery_a
ו-recovery_b partition
. מכשירים כאלה כוללים
מכשירי A/B ומכשירי A/B וירטואליים שבהם ניתן לעדכן את מחיצת השחזור, באמצעות
את התצורה הבאה:
AB_OTA_PARTITIONS += recovery
ה-ramdisk של vendor_boot
מכיל את הביטים של הספק של ה-ramdisk והספק
מודולי הליבה, כולל:
קובצי
fstab
ספציפיים למכשירlib/modules
(כולל מודולים של ליבה (kernel) של ספק)
ה-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
אתחול קבצים בינאריים וקישורים סימבוליים
שרת ה-RAM של recovery
יכול להכיל קישור סימבולי של /init -> /system/bin/init
, וגם
init_second_stage.recovery
ב/system/bin/init
. אבל מכיוון שהאתחול
ה-ramdisk משורשר אחרי הרדיסק recovery
, הקישור הסימבולי של /init
הוא
הוחלף. כשהמכשיר עובר למצב שחזור, /system/bin/init
הקוד הבינארי נדרש כדי לתמוך באתחול בשלב שני.
כשהמכשיר יבצע אתחול אל recovery
, התוכן של recovery
+
vendor_boot
+ דרכי הגעה גנריות הם:
/init
(מ-ramdisk, שנבנה מ-init_first_stage
)/system/bin/init
(מ-Radiskrecovery
, שנבנה מinit_second_stage.recovery
, ובוצעה מ-/init
)
כאשר מתבצעת אתחול של המכשיר ל-Android, התוכן של vendor_boot
+ גנרי
הערכים האלה הם:
/init
(מ-Ramdisk גנרי, שנבנה מ-init_first_stage
)
העברת קובצי fstab
יש להעביר את כל fstab
הקבצים שהותקנו ל-ramdisk הגנרי אל
vendor_ramdisk
. לדוגמה, אפשר להיעזר ב
שינוי.
התקנת מודולים
לחלופין, אפשר להתקין ב-vendor_ramdisk
מודולים ספציפיים למכשיר (לדלג על
אם אין לכם מודולים ספציפיים למכשיר להתקנה). Init
לא עובר לרמה הבסיסית (root). הווריאנט vendor_ramdisk
של המודולים מותקן
הרמה הבסיסית (root) של vendor_ramdisk
. לדוגמאות של התקנת מודולים
vendor_ramdisk
, ראו מסוף שלב ראשון, מטא-נתונים
סיכומי ביקורת (checksums) ו-Virtual 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
אם נפח האחסון (Radisk) vendor_boot
נטען במצב שחזור, המודול זמין גם ב-recovery
. אם
ramdisk של vendor_boot
לא נטען במצב שחזור. המכשיר יכול באופן אופציונלי.
להתקין גם את adbd.recovery
.
סיכום ביקורת (checksum) של מטא-נתונים
כדי לתמוך במטא-נתונים
בדיקת סיכום (checksums)
במהלך הטעינה בשלב הראשון, מכשירים שלא תומכים ב-GKI מתקינים את הרדיסק
של המודולים הבאים. כדי להוסיף תמיכה ב-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
.
שינויים בתהליך האתחול
במהלך הפעלה ל-Android, תהליך ההפעלה לא משתנה. הלחצן vendor_boot
+
אמצעים גנריים דומים לתהליך האתחול הקיים, חוץ מהבדל אחד: fstab
נטען מ-vendor_boot
. מכיוון ש-system/bin/recovery
לא קיים,
first_stage_init
מטפל בה כהפעלה רגילה.
תהליך ההפעלה משתנה במהלך האתחול במצב שחזור. מקש השחזור +
vendor_boot
+ ramdisk גנרי דומה לתהליך השחזור הקיים, אבל
הליבה נטענת מהתמונה boot
במקום מהתמונה recovery
.
תהליך ההפעלה של מצב שחזור הוא בהמשך.
תוכנת האתחול מופעלת ולאחר מכן מבצעת את הפעולות הבאות:
- דוחפת שחזור +
vendor_boot
+ ramdisk גנרי ל-/
. (אם ה-OEM (יצרן הציוד המקורי) משכפלת מודולים של ליבה לרדיסק שחזור על ידי הוספתםBOARD_RECOVERY_KERNEL_MODULES
), המאפייןvendor_boot
הוא אופציונלי.) - מריצה את הליבה מהמחיצה
boot
.
- דוחפת שחזור +
הליבה טוענת את ramdisk ל-
/
ולאחר מכן מבצעת את/init
מה-ramdisk הגנרי.השלב הראשון מתחיל ואז מבצע את הפעולות הבאות:
- הגדרה של
IsRecoveryMode() == true
ו-ForceNormalBoot() == false
. - טעינת מודולים של ליבה (kernel) של ספק מ-
/lib/modules
. - מתקשרת אל
DoFirstStageMount()
אבל מדלגת על הטעינה כיIsRecoveryMode() == true
. (במכשיר אין רפליקציות של RAM (כי/
) עדיין אותו הדבר), אבל למעשה קורא ל-SetInitAvbVersionInRecovery()
). - התחלת שלב שני מ-
/system/bin/init
מ-ramdisk שלrecovery
.
- הגדרה של
הגדרת e2fsck
קובצי ה-Makefile במכשיר יכולים לרשת מ:
virtual_ab_ota/launch_with_vendor_ramdisk.mk
אם המכשיר תומך בצפייה וירטואלית A/B אבל לא דחיסה.virtual_ab_ota/compression.mk
אם המכשיר תומך ב-A/B וירטואלי דחיסה.
פרטי ההתקנה של קובצי cookie של המוצר
$ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin/e2fsck
בשעה
זמן הריצה, השלב הראשון init
יריץ את /system/bin/e2fsck
.
אפשרות 2ב: מחיצת שחזור ייעודית ולא מסוג A/B
יש להשתמש באפשרות הזו במכשירים עם מחיצת recovery
שאינה A/B. כלומר,
במכשיר יש מחיצה בשם recovery
ללא סיומת של משבצת. מכשירים כאלה
כוללים:
- מכשירים שהם לא מסוג A/B;
- מכשירי A/B ומכשירי A/B וירטואליים שבהם מחיצת השחזור לא שייכת שאפשר לעדכן. (זה חריג).
ה-ramdisk של vendor_boot
מכיל את הביטים של הספק של ה-ramdisk והספק
מודולי הליבה, כולל:
- קובצי
fstab
ספציפיים למכשיר lib/modules
(כולל מודולים של ליבה (kernel) של ספק)
התמונה recovery
צריכה להיות בפני עצמה. היא חייבת להכיל
כל המשאבים הדרושים לאתחול מצב השחזור, כולל:
- תמונת הליבה
- התמונה של DTBO
- מודולים של ליבה ב-
lib/modules
- הפעלה בשלב ראשון כקישור סימבולי
/init -> /system/bin/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
אתחול קבצים בינאריים וקישורים סימבוליים
שרת ה-RAM של recovery
חייב להכיל קישור סימבולי של /init -> /system/bin/init
, וגם
init_second_stage.recovery
ב/system/bin/init
. כשהמכשיר באתחול
במצב השחזור, הקובץ הבינארי /system/bin/init
נדרש כדי לתמוך
שלב ראשון ושלב שני.
כשהמכשיר יבצע אתחול ב-recovery
, התוכן של ramdisk עם recovery
הוא
ככה:
/init -> /system/bin/init
(מ-Radiskrecovery
)/system/bin/init
(מ-Radiskrecovery
, שנבנה מinit_second_stage.recovery
, ובוצעה מ-/init
)
כאשר מתבצעת אתחול של המכשיר ל-Android, התוכן של vendor_boot
+ גנרי
הערכים האלה הם:
/init
(מ-ramdisk, שנבנה מ-init_first_stage
)
העברת קובצי fstab
יש להעביר את כל fstab
הקבצים שהותקנו ל-ramdisk הגנרי אל
vendor_ramdisk
ו-recovery
ramdisk. לדוגמה, אפשר להיעזר ב
שינוי.
התקנת מודולים
אפשר להתקין מודולים ספציפיים למכשיר ב-vendor_ramdisk
וגם
recovery
ramdisk (דילוג
אם אין לכם מודולים ספציפיים למכשיר להתקנה). init
לא עובר לרמה הבסיסית (root). הווריאנט vendor_ramdisk
של המודולים מותקן
הרמה הבסיסית (root) של vendor_ramdisk
. הווריאנט recovery
של המודולים מותקן
הרמה הבסיסית (root) של ramdisk recovery
. לדוגמאות של התקנת מודולים
ramdisk vendor_ramdisk
ו-recovery
, שבת
מסוף שלב ראשון ומטא-נתונים
בדיקת סיכום ביקורת (checksums).
מסוף השלב הראשון
כדי להתקין את הווריאנט 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 \
סיכום ביקורת (checksum) של מטא-נתונים
כדי לתמוך במטא-נתונים
בדיקת סיכום (checksums)
במהלך הטעינה בשלב הראשון, מכשירים שלא תומכים ב-GKI מתקינים את הרדיסק
של המודולים הבאים. כדי להוסיף תמיכה ב-GKI, צריך להעביר את המודולים אל
$ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resize2fs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
כדי לתמוך בסיכומי ביקורת של מטא-נתונים במהלך טעינה בשלב הראשון בשחזור, צריך להפעיל את גרסת השחזור של המודולים האלה ולהתקין גם אותם.
שינויים בתהליך האתחול
במהלך הפעלה ל-Android, תהליך ההפעלה לא משתנה. הלחצן vendor_boot
+
אמצעים גנריים דומים לתהליך האתחול הקיים, חוץ מהבדל אחד: fstab
נטען מ-vendor_boot
. מכיוון ש-system/bin/recovery
לא קיים,
first_stage_init
מטפל בה כהפעלה רגילה.
בתהליך האתחול במצב שחזור (recovery), תהליך ההפעלה לא משתנה. תהליך השחזור
ramdisk נטען באותו אופן כמו תהליך השחזור הקיים.
הליבה נטענת מהתמונה recovery
.
כך יתבצע תהליך האתחול של מצב השחזור.
תוכנת האתחול מופעלת ולאחר מכן מבצעת את הפעולות הבאות:
- דוחפת RAMdisk לשחזור אל
/
. - מריצה את הליבה מהמחיצה
recovery
.
- דוחפת RAMdisk לשחזור אל
הליבה טוענת את ramdisk ל-
/
ולאחר מכן מבצעת את/init
, שהוא קישור סימבולי אל/system/bin/init
מ-Radiskrecovery
.השלב הראשון מתחיל ואז מבצע את הפעולות הבאות:
- הגדרה של
IsRecoveryMode() == true
ו-ForceNormalBoot() == false
. - טעינת מודולים של ליבה (kernel) של ספק מ-
/lib/modules
. - מתקשרת אל
DoFirstStageMount()
אבל מדלגת על הטעינה כיIsRecoveryMode() == true
. (במכשיר אין רפליקציות של RAM (כי/
) עדיין אותו הדבר), אבל למעשה קורא ל-SetInitAvbVersionInRecovery()
). - התחלת שלב שני מ-
/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
בזמן ה-build, קובץ
system/etc/ramdisk/build.prop
מתווסף לקובץ הגנרי Ramdisk. הקובץ הזה מכיל חותמת זמן של פרטי ה-build.בזמן הריצה, שלב ראשון
init
עותקים מה-ramdisk ל-tmpfs
לפני שחרור של RAMdisk, שלבinit
יכול לקרוא קובץ זה כדי להגדיר מאפייני חותמת זמן של תמונהboot
.