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

דף זה מפרט את תהליך בניית הגרעינים המותאמים אישית עבור מכשירי אנדרואיד. הוראות אלו מדריכות אותך בתהליך בחירת המקורות הנכונים, בניית הליבה והטמעת התוצאות בתמונת מערכת שנבנתה מפרויקט הקוד הפתוח של 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 עבור גרעינים הזמינים בשיטה זו.

התקן נתיב בינארי בעץ AOSP סניפי ריפו
Pixel Fold (Felix) device/google/felix-kernel android-gs-felix-5.10-android13-qpr3-c
Pixel Tablet (tangorpro) device/google/tangorpro-kernel android-gs-tangorpro-5.10-android13-qpr3
Pixel 7 (פנתר)
Pixel 7 Pro (צ'יטה)
device/google/pantah-kernel android-gs-pantah-5.10-android13-qpr3
Pixel 6a (bluejay) device/google/bluejay-kernel android-gs-bluejay-5.10-android13-qpr3
Pixel 6 (oriole)
Pixel 6 Pro (עורב)
device/google/raviole-kernel android-gs-raviole-5.10-android13-qpr3
Pixel 5a (ברבט)
Pixel 5 (אדום)
Pixel 4a (5G) (דשן)
device/google/redbull-kernel android-msm-redbull-4.19-android13-qpr3
Pixel 4a (דג שמש) device/google/sunfish-kernel android-msm-sunfish-4.14-android13-qpr3
Pixel 4 (להבה)
Pixel 4 XL (אלמוגים)
device/google/coral-kernel android-msm-coral-4.14-android13
Pixel 3a (סרגו)
Pixel 3a XL (בוניטו)
device/google/bonito-kernel android-msm-bonito-4.9-android12L
Pixel 3 (קו כחול)
Pixel 3 XL (צולב)
device/google/crosshatch-kernel android-msm-crosshatch-4.9-android12
Pixel 2 (ווליי)
Pixel 2 XL (טיימן)
device/google/wahoo-kernel android-msm-wahoo-4.4-android10-qpr3
פיקסל (דג מפרש)
Pixel XL (מרלין)
device/google/marlin-kernel android-msm-marlin-3.18-pie-qpr2
Hikey960 device/linaro/hikey-kernel hikey-linaro-android-4.14
hikey-linaro-android-4.19
common-android12-5.4
common-android13-5.10
ביגל x15 device/ti/beagle_x15-kernel omap-beagle-x15-android-4.14
omap-beagle-x15-android-4.19
גרעין משותף של אנדרואיד לא common-android-4.4
common-android-4.9
common-android-4.14
common-android-4.19
common-android-4.19-stable
common-android11-5.4
common-android12-5.4
common-android12-5.10
common-android13-5.10
common-android13-5.15
common-android14-5.15
common-android14-6.1
משותף-android-mainline

בניית הגרעין

בניין עם 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

תמיכה ב-Kleaf עבור מכשירים וגרעינים

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

התקן סניפי ריפו תמיכת קליף תמיכה build/build.sh
גרעין משותף של אנדרואיד
db845c
מכשיר וירטואלי (x86_64, arm64)
מכשיר וירטואלי (i686, זרוע)
Rockpi4
common-android-4.4
common-android-4.9
common-android-4.14
common-android-4.19
common-android-4.19-stable
common-android11-5.4
common-android12-5.4
common-android12-5.10
גרעין משותף של אנדרואיד common-android13-5.10
common-android13-5.15
✅ (רשמי) 1
גרעין משותף של אנדרואיד common-android14-5.15
common-android14-6.1
common-android15-6.1
משותף-android-mainline
db845c common-android13-5.10
db845c common-android13-5.15 ✅ (רשמי) 1
db845c common-android14-5.15
common-android14-6.1
common-android15-6.1
common-android-mainline
מכשיר וירטואלי (x86_64, arm64) common-android13-5.10
common-android13-5.15
✅ (רשמי) 1 ⚠️ (לא מתוחזק) 2
מכשיר וירטואלי (x86_64, arm64) common-android14-5.15
common-android14-6.1
common-android15-6.1
common-android-mainline
מכשיר וירטואלי (i686, זרוע) common-android13-5.10
common-android13-5.15
מכשיר וירטואלי (i686, זרוע) common-android14-5.15
common-android14-6.1
common-android15-6.1
משותף-android-mainline
Rockpi4 common-android13-5.10
common-android13-5.15
Rockpi4 common-android14-5.15
common-android14-6.1
common-android15-6.1
משותף-android-mainline
Hikey960 hikey-linaro-android-4.14
hikey-linaro-android-4.19
common-android12-5.4
common-android13-5.10
מודול fips140 common-android12-5.10
common-android13-5.10
common-android13-5.15
מודול fips140 common-android14-5.15

1 "רשמית" פירושו שזו הדרך הרשמית לבנות את הליבה, למרות שהדרך החלופית עשויה לשמש גם לבניית הליבה.

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

הפעלת הקרנל

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

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

העתק 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 .