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