דף זה מפרט את תהליך בניית הגרעינים המותאמים אישית עבור מכשירי אנדרואיד. הוראות אלו מדריכות אותך בתהליך בחירת המקורות הנכונים, בניית הליבה והטמעת התוצאות בתמונת מערכת שנבנתה מפרויקט הקוד הפתוח של 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 . אנדרואיד 13 הציגה גרעינים לבנייה עם Bazel . כדי לבנות את ליבת GKI עבור ארכיטקטורת aarch64, בדוק ענף Android Common Kernel לא לפני Android 13 ולאחר מכן הפעל את הפקודה הבאה: כדי ליצור הפצה, הרץ: לאחר מכן הליבה הבינארית, המודולים והתמונות המתאימות ממוקמות בספריית עבור סניפים ב-Android 12 או מתחת, או סניפים ללא Kleaf: הבינארי של הליבה, המודולים והתמונה המתאימה ממוקמים בספריית אנדרואיד 13 הציגה גרעיני בנייה עם Bazel (Kleaf), והחליפה כדי לבנות את המודולים של כדי ליצור הפצה, הרץ: לפרטים נוספים על בניית גרעיני אנדרואיד עם Bazel, ראה. Kleaf - בניית גרעיני אנדרואיד עם Bazel . לפרטים על תמיכת Kleaf עבור ארכיטקטורות בודדות, ראה תמיכת Kleaf עבור התקנים וקרנלים . באנדרואיד 12 דיונון ודגי זהב מתכנסים, כך שהם חולקים את אותו ליבה: אנדרואיד 11 הציגה את GKI , שמפרידה את הליבה לתמונת ליבה המתנהלת על ידי גוגל ולמודולים מתוחזקים של ספקים, שנבנים בנפרד. דוגמה זו מציגה תצורת תמונת ליבה: דוגמה זו מציגה תצורת מודול (דיונון ואמולטור): ישנן מספר דרכים להפעיל ליבה מותאמת אישית. להלן דרכים ידועות המתאימות לתרחישי פיתוח שונים. העתק לחלופין, הגדר את המשתנה לרוב המכשירים העדכניים יש הרחבה של טוען אתחול כדי לייעל את תהליך היצירה והאתחול של תמונת אתחול. כדי לאתחל את הליבה מבלי להבהב: באמצעות שיטה זו, הליבה למעשה לא מהבהבת, ולא ממשיכה במהלך אתחול מחדש. אתה יכול להפעיל גרעינים בארכיטקטורה לבחירתך במכשירי Cuttlefish . כדי לאתחל התקן Cuttlefish עם קבוצה מסוימת של חפצי ליבה , הפעל את פקודת למידע נוסף, ראה פיתוח גרעינים על דיונון . כדי להתאים אישית את בניית הליבה עבור בנייה של Kleaf, ראה תיעוד של Kleaf . עבור באנדרואיד 14 ומעלה, אתה יכול להשתמש בשברי defconfig כדי להתאים אישית תצורות ליבה. ראה תיעוד Kleaf על שברי defconfig . באנדרואיד 13 ומטה, ראה את הדברים הבאים. אם אתה צריך להחליף אפשרות תצורת ליבה באופן קבוע, למשל, כאשר אתה עובד על תכונה, או אם אתה צריך אפשרות להגדיר למטרות פיתוח, אתה יכול להשיג את הגמישות הזו על ידי שמירה על שינוי מקומי או עותק של תצורת ה-build. הגדר את המשתנה POST_DEFCONFIG_CMDS למשפט שמוערך מיד לאחר ביצוע השלב הרגיל דוגמה נפוצה היא השבתת אופטימיזציה של זמן קישור (LTO) עבור ליבות צולבות במהלך הפיתוח. בעוד ש-LTO מועיל עבור גרעינים משוחררים, התקורה בזמן הבנייה יכולה להיות משמעותית. הקטע הבא שנוסף ל- אתה יכול לזהות את הגרסה הנכונה לבנות משני מקורות: עץ AOSP ותמונת המערכת. עץ AOSP מכיל גרסאות ליבה מובנות מראש. יומן ה-git חושף את הגרסה הנכונה כחלק מהודעת ה-commit: אם גרסת הליבה לא רשומה ביומן git, השג אותה מתמונת המערכת, כמתואר להלן. כדי לקבוע את גרסת הליבה המשמשת בתמונת מערכת, הפעל את הפקודה הבאה כנגד קובץ הליבה: עבור קבצי אפשר לבנות תמונת אתחול באמצעות סביבת בניית הקרנל. עבור מכשירים עם מחיצת לדוגמה, עם Kleaf, אתה יכול לבנות את תמונת האתחול של GKI עם: עם תמונת האתחול של GKI ממוקמת ב- $DIST_DIR . עבור התקנים ללא מחיצת תיקיית היעד היא הספרייה ברמה העליונה של עץ הליבה (ספריית העבודה הנוכחית). אם אתה מפתח עם AOSP main, אתה יכול במקום זאת להוריד את חפץ הבנייה כאשר יש לך קובץ בינארי ramdisk והעתקת אותו ל- אם אתה עובד עם ארכיטקטורה מבוססת x86, החלף הקובץ הזה ממוקם בספריית החפצים תמונת האתחול ממוקמת ב-
tools/bazel build //common:kernel_aarch64_dist
tools/bazel run //common:kernel_aarch64_dist -- --dist_dir=$DIST_DIR
$DIST_DIR
. אם --dist_dir
לא צוין, ראה פלט של הפקודה עבור מיקום החפצים. לפרטים, עיין בתיעוד על AOSP .build/build.sh
out/ BRANCH /dist
.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
virtual_device
. כדי לבנות את המודולים של הקרנל הזה, השתמש בתצורת הבנייה הזו:BUILD_CONFIG=common-modules/virtual-device/build.config.virtual_device.x86_64 build/build.sh
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
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
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
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
make defconfig
. מכיוון שקובצי build.config
מקורם בסביבת ה-build, ניתן לקרוא לפונקציות המוגדרות ב- build.config
כחלק מהפקודות שלאחר ה-defconfig.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)
}
cd $AOSP/device/VENDOR/NAME
git log --max-count=1
file kernel
Image.lz4-dtb
, הפעל:
grep -a 'Linux version' Image.lz4-dtb
init_boot
, תמונת האתחול נבנית יחד עם הליבה. תמונת initramfs
אינה מוטבעת בתמונת האתחול.
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
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
ramdisk-recovery.img
מ-aosp_arm64 build ב- ci.android.com ולהשתמש בזה בתור הבינארי של 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
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
.