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

קל לארגן דפים בעזרת אוספים אפשר לשמור ולסווג תוכן על סמך ההעדפות שלך.

דף זה מפרט את תהליך בניית הגרעינים המותאמים אישית עבור מכשירי אנדרואיד. הוראות אלו מדריכות אותך בתהליך בחירת המקורות הנכונים, בניית הליבה והטמעת התוצאות בתמונת מערכת שנבנתה מפרויקט הקוד הפתוח של 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 6a (bluejay) device/google/bluejay-kernel android-gs-bluejay-5.10-android13
Pixel 6 (oriole)
Pixel 6 Pro (עורב)
device/google/raviole-kernel android-gs-raviole-5.10-android13
Pixel 5a (ברבט) device/google/barbet-kernel android-msm-barbet-4.19-android13
Pixel 5 (אדום)
Pixel 4a (5G) (דשן)
device/google/redbull-kernel android-msm-redbull-4.19-android13
Pixel 4a (דג שמש) device/google/sunfish-kernel android-msm-sunfish-4.14-android13
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
ביגל 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
משותף-android-mainline

בניית הגרעין

ואז בנה את הליבה עם זה:

build/build.sh

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

בניין עם Bazel (Kleaf)

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

כדי לבנות את ליבת GKI עבור ארכיטקטורת aarch64, הרץ:

tools/bazel build //common:kernel_aarch64_dist

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

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

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

בניית מודולי GKI

אנדרואיד 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

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

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

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

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

tools/bazel build //common-modules:virtual_device_x86_64_dist

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

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

לפרטים נוספים על בניית גרעינים של Kleaf עם Bazel -, עיין בתיעוד על AOSP .

הפעלת הקרנל

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

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

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

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

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

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

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

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

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

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

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

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

אם אתה מפתח עם AOSP master, אתה יכול במקום זאת להוריד את חפץ הבנייה 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 .