בניית גרעינים

דף זה מפרט את תהליך בניית הגרעינים המותאמים אישית עבור מכשירי אנדרואיד. הוראות אלו מדריכות אותך בתהליך בחירת המקורות הנכונים, בניית הליבה והטמעת התוצאות בתמונת מערכת שנבנתה מפרויקט הקוד הפתוח של Android (AOSP).

אתה יכול לרכוש מקורות קרנל עדכניים יותר באמצעות Repo ; בנה אותם ללא תצורה נוספת על ידי הפעלת build/build.sh מהשורש של הוצאת המקור שלך.

הורדת מקורות ובניית כלים

עבור גרעינים אחרונים, השתמש repo כדי להוריד את המקורות, שרשרת הכלים ובניית סקריפטים. חלק מהגרעינים (לדוגמה, הגרעינים של Pixel 3) דורשים מקורות ממספר מאגרי git, בעוד שאחרים (לדוגמה, הגרעינים הנפוצים) דורשים מקור בודד בלבד. שימוש בגישת repo מבטיח הגדרה נכונה של ספריית מקור.

הורד את המקורות לסניף המתאים:

mkdir android-kernel && cd android-kernel
repo init -u https://android.googlesource.com/kernel/manifest -b BRANCH
repo sync

לרשימה של ענפי ריפו ( BRANCH ) שניתן להשתמש בהם עם הפקודה הקודמת 'repo init', ראה ענפי ליבה ומערכות הבנייה שלהם .

לפרטים על הורדה וקומפילציה של ליבות עבור מכשירי Pixel, ראה בניית ליבות Pixel .

בניית הגרעין

בניין עם Bazel (Kleaf)

אנדרואיד 13 הציגה גרעיני בנייה עם Bazel .

כדי לבנות את ליבת GKI עבור ארכיטקטורת aarch64, בדוק סניף של Android Common Kernel לא לפני אנדרואיד 13 ולאחר מכן הפעל את הפקודה הבאה:

tools/bazel build //common:kernel_aarch64_dist

כדי ליצור הפצה, הרץ:

tools/bazel run //common:kernel_aarch64_dist -- --dist_dir=$DIST_DIR

לאחר מכן הליבה הבינארית, המודולים והתמונות המתאימות ממוקמות בספריית $DIST_DIR . אם --dist_dir לא צוין, ראה פלט של הפקודה עבור מיקום החפצים. לפרטים, עיין בתיעוד על AOSP .

בנייה עם build.sh (מורשת)

עבור סניפים ב-Android 12 או מתחת, או סניפים ללא Kleaf:

build/build.sh

הבינארי של הליבה, המודולים והתמונה המתאימה ממוקמים בספריית out/ BRANCH /dist .

בניית מודולי הספק עבור המכשיר הוירטואלי

אנדרואיד 13 הציגה גרעיני בנייה עם Bazel (Kleaf), והחליפה build.sh .

כדי לבנות את המודולים של virtual_device , הרץ:

tools/bazel build //common-modules/virtual-device:virtual_device_x86_64_dist

כדי ליצור הפצה, הרץ:

tools/bazel run //common-modules/virtual-device:virtual_device_x86_64_dist -- --dist_dir=$DIST_DIR

לפרטים נוספים על בניית גרעיני אנדרואיד עם Bazel, ראה. Kleaf - בניית גרעיני אנדרואיד עם Bazel .

לפרטים על תמיכת Kleaf עבור ארכיטקטורות בודדות, ראה תמיכת Kleaf עבור התקנים וקרנלים .

בניית מודולי הספק עבור המכשיר הוירטואלי באמצעות build.sh (מדור קודם)

באנדרואיד 12 דיונון ודגי זהב מתכנסים, כך שהם חולקים את אותו ליבה: virtual_device . כדי לבנות את המודולים של הקרנל הזה, השתמש בתצורת הבנייה הזו:

BUILD_CONFIG=common-modules/virtual-device/build.config.virtual_device.x86_64 build/build.sh

אנדרואיד 11 הציגה את GKI , שמפרידה את הליבה לתמונת ליבה המתנהלת על ידי Google ולמודולים מתוחזקים של ספקים, שנבנים בנפרד.

דוגמה זו מציגה תצורת תמונת ליבה:

BUILD_CONFIG=common/build.config.gki.x86_64 build/build.sh

דוגמה זו מציגה תצורת מודול (Cuttlefish ואמולטור):

BUILD_CONFIG=common-modules/virtual-device/build.config.cuttlefish.x86_64 build/build.sh

הפעלת הקרנל

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

הטמעה בבניית התמונה של אנדרואיד

העתק Image.lz4-dtb למיקום הבינארי של הליבה המתאים בתוך עץ AOSP ובנה מחדש את תמונת האתחול.

לחלופין, הגדר את המשתנה TARGET_PREBUILT_KERNEL תוך כדי שימוש make bootimage (או כל שורת פקודה אחרת של make שבונה תמונת אתחול). משתנה זה נתמך על ידי כל המכשירים כפי שהוא מוגדר דרך device/common/populate-new-device.sh . לדוגמה:

export TARGET_PREBUILT_KERNEL=DIST_DIR/Image.lz4-dtb

גרעינים מהבהבים ומאתחולים עם Fastboot

לרוב המכשירים העדכניים יש הרחבה של טוען אתחול כדי לייעל את תהליך היצירה והאתחול של תמונת אתחול.

כדי לאתחל את הליבה מבלי להבהב:

adb reboot bootloader
fastboot boot Image.lz4-dtb

באמצעות שיטה זו, הליבה למעשה לא מהבהבת, ולא תימשך במהלך אתחול מחדש.

הפעלת גרעינים על דיונון

אתה יכול להפעיל גרעינים בארכיטקטורה לבחירתך במכשירי Cuttlefish .

כדי לאתחל התקן Cuttlefish עם קבוצה מסוימת של חפצי ליבה , הפעל את פקודת cvd start עם חפצי ליבת היעד כפרמטרים. הפקודה הבאה לדוגמה משתמשת בחפצי ליבה עבור יעד arm64 ממניפסט הקרנל common-android14-6.1 .

cvd start \
    -kernel_path=/$PATH/$TO/common-android14-6.1/out/android14-6.1/dist/Image \
    -initramfs_path=/$PATH/$TO/common-android14-6.1/out/android14-6.1/dist/initramfs.img

למידע נוסף, ראה פיתוח גרעינים על דיונון .

התאמה אישית של בניית הליבה

כדי להתאים אישית את בניית הליבה עבור בנייה של Kleaf, ראה תיעוד של Kleaf .

התאמה אישית של בניית הליבה עם build.sh (מורשת)

עבור build/build.sh , תהליך הבנייה והתוצאה יכולים להיות מושפעים ממשתני סביבה. רובם אופציונליים וכל ענף ליבה צריך להגיע עם תצורת ברירת מחדל נכונה. אלה הנפוצים ביותר מופיעים כאן. לרשימה מלאה (ועדכנית), עיין בכתובת build/build.sh .

משתנה הסביבה תיאור דוגמא
BUILD_CONFIG בניית קובץ תצורה מהמקום שבו אתה מאתחל את סביבת הבנייה. יש להגדיר את המיקום ביחס לספריית השורש של Repo. ברירת המחדל היא build.config .
חובה עבור גרעינים נפוצים.
BUILD_CONFIG=common/build.config.gki.aarch64
CC לעקוף מהדר לשימוש. נופל בחזרה למהדר ברירת המחדל שהוגדר על ידי build.config . CC=clang
DIST_DIR ספריית פלט בסיס עבור הפצת הליבה. DIST_DIR=/path/to/my/dist
OUT_DIR ספריית פלט בסיס עבור בניית הליבה. OUT_DIR=/path/to/my/out
SKIP_DEFCONFIG דלג על make defconfig SKIP_DEFCONFIG=1
SKIP_MRPROPER דלג על make mrproper SKIP_MRPROPER=1

תצורת ליבה מותאמת אישית עבור בנייה מקומית

באנדרואיד 14 ומעלה, אתה יכול להשתמש בשברי defconfig כדי להתאים אישית תצורות ליבה. ראה תיעוד Kleaf על קטעי defconfig .

תצורת ליבה מותאמת אישית עבור בנייה מקומית עם הגדרות בנייה (מדור קודם)

באנדרואיד 13 ומטה, ראה את הדברים הבאים.

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

הגדר את המשתנה POST_DEFCONFIG_CMDS למשפט שמוערך מיד לאחר ביצוע השלב הרגיל make defconfig . מכיוון שקובצי build.config מקורם בסביבת ה-build, ניתן לקרוא לפונקציות המוגדרות ב- build.config כחלק מהפקודות שלאחר ה-defconfig.

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

POST_DEFCONFIG_CMDS="check_defconfig && update_debug_config"
function update_debug_config() {
    ${KERNEL_DIR}/scripts/config --file ${OUT_DIR}/.config \
         -d LTO \
         -d LTO_CLANG \
         -d CFI \
         -d CFI_PERMISSIVE \
         -d CFI_CLANG
    (cd ${OUT_DIR} && \
     make O=${OUT_DIR} $archsubarch CC=${CC} CROSS_COMPILE=${CROSS_COMPILE} olddefconfig)
}

זיהוי גרסאות ליבה

אתה יכול לזהות את הגרסה הנכונה לבנות משני מקורות: עץ AOSP ותמונת המערכת.

גרסת ליבה מעץ AOSP

עץ AOSP מכיל גרסאות ליבה מובנות מראש. יומן ה-git חושף את הגרסה הנכונה כחלק מהודעת ה-commit:

cd $AOSP/device/VENDOR/NAME
git log --max-count=1

אם גרסת הליבה אינה רשומה ביומן git, השג אותה מתמונת המערכת, כמתואר להלן.

גרסת ליבה מתמונת מערכת

כדי לקבוע את גרסת הליבה המשמשת בתמונת מערכת, הפעל את הפקודה הבאה כנגד קובץ הליבה:

file kernel

עבור קבצי Image.lz4-dtb , הפעל:

grep -a 'Linux version' Image.lz4-dtb

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

אפשר לבנות תמונת אתחול באמצעות סביבת בניית הקרנל.

בניית תמונת אתחול למכשירים עם init_boot

עבור מכשירים עם מחיצת init_boot , תמונת האתחול נבנית יחד עם הליבה. תמונת initramfs אינה מוטבעת בתמונת האתחול.

לדוגמה, עם Kleaf, אתה יכול לבנות את תמונת האתחול של GKI עם:

tools/bazel run //common:kernel_aarch64_dist -- --dist_dir=$DIST_DIR

עם build/build.sh (מורשת), אתה יכול לבנות את תמונת האתחול של GKI עם:

BUILD_CONFIG=common/build.config.gki.aarch64 build/build.sh

תמונת האתחול של GKI ממוקמת ב- $DIST_DIR .

בניית תמונת אתחול למכשירים ללא init_boot (מדור קודם)

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

tools/mkbootimg/unpack_bootimg.py --boot_img=boot-5.4-gz.img
mv $KERNEL_ROOT/out/ramdisk gki-ramdisk.lz4

תיקיית היעד היא הספרייה ברמה העליונה של עץ הליבה (ספריית העבודה הנוכחית).

אם אתה מפתח עם AOSP main, אתה יכול במקום זאת להוריד את חפץ הבנייה ramdisk-recovery.img מ-aosp_arm64 build ב- ci.android.com ולהשתמש בזה בתור הבינארי של ramdisk.

כאשר יש לך קובץ בינארי ramdisk והעתקת אותו ל- gki-ramdisk.lz4 בספריית השורש של בניית הליבה, אתה יכול ליצור תמונת אתחול על ידי ביצוע:

BUILD_BOOT_IMG=1 SKIP_VENDOR_BOOT=1 KERNEL_BINARY=Image GKI_RAMDISK_PREBUILT_BINARY=gki-ramdisk.lz4 BUILD_CONFIG=common/build.config.gki.aarch64 build/build.sh

אם אתה עובד עם ארכיטקטורה מבוססת x86, החלף Image ב- bzImage ואת aarch64 ב- x86_64 :

BUILD_BOOT_IMG=1 SKIP_VENDOR_BOOT=1 KERNEL_BINARY=bzImage GKI_RAMDISK_PREBUILT_BINARY=gki-ramdisk.lz4 BUILD_CONFIG=common/build.config.gki.x86_64 build/build.sh

הקובץ הזה ממוקם בספריית החפצים $KERNEL_ROOT/out/$KERNEL_VERSION/dist .

תמונת האתחול ממוקמת ב- out/<kernel branch>/dist/boot.img .