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

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

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

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

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

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

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

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

הטבלה הבאה מפרטת BRANCH שמות גרעינים הזמינים באמצעות שיטה זו.

התקן נתיב בינארי בעץ AOSP ריפו סניפים
פיקסל 5a (ברבט) device/google/barbet-kernel android-msm-barbet-4.19-android12
פיקסל 5 (אדום)
Pixel 4a (5G) (bramble)
device/google/redbull-kernel android-msm-redbull-4.19-android12
פיקסל 4a (דג שמש) device/google/sunfish-kernel אנדרואיד-msm-sunfish-4.14-android12
פיקסל 4 (להבה)
פיקסל 4 XL (אלמוגים)
device/google/coral-kernel android-msm-coral-4.14-android12
פיקסל 3a (סרגו)
Pixel 3a XL (bonito)
מכשיר/google/bonito-kernel אנדרואיד-msm-bonito-4.9-android12
Pixel 3 (blueline)
Pixel 3 XL (crosshatch)
device/google/crosshatch-kernel אנדרואיד-msm-crosshatch-4.9-android12
פיקסל 2 (וולי)
Pixel 2 XL (taimen)
device/google/wahoo-kernel אנדרואיד-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
ביגל x15 device/ti/beagle_x15-kernel omap-beagle-x15-android-4.14
omap-beagle-x15-android-4.19
ליבה נפוצה של אנדרואיד N/A 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-android-mainline

בניית הגרעין

לאחר מכן בנה את הגרעין כך:

build/build.sh

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

בניית המודולים של GKI

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

דוגמה זו מציגה תצורה של תמונת גרעין:

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

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

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

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

BUILD_CONFIG=common-modules/virtual-device/build.config.virtual_device.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

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

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

כדי לאתחל את הגרעין מבלי להבהב:

adb reboot bootloader
fastboot boot Image.lz4-dtb

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

התאמה אישית של בניית הגרעין

תהליך הבנייה והתוצאה יכולים להיות מושפעים ממשתני סביבה. רובם אופציונליים וכל ענף גרעין צריך להגיע עם תצורת ברירת מחדל מתאימה. אלה הנפוצים ביותר מופיעים כאן. במשך יושלם (עַדכָּנִי) רשימה, מתייחס 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

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

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

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

דוגמה נפוצה היא השבתת אופטימיזציית זמן הקישור (LTO) לגרעיני crosshatch במהלך הפיתוח. למרות ש- 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

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

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

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

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

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

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

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 .