توضِّح هذه الصفحة بالتفصيل عملية إنشاء النواة المخصّصة لأجهزة Android. ترشدك هذه التعليمات خلال عملية اختيار المصادر المناسبة وإنشاء النواة وتضمين النتائج في صورة نظام تم إنشاؤها من مشروع Android Open Source Project (AOSP).
يمكنك الحصول على أحدث مصادر النواة باستخدام
Repo، وإنشاءها بدون أي تعديلات إضافية
من خلال تشغيل build/build.sh
من جذر عملية تسجيل
المصدر.
تنزيل المصادر وأدوات الإنشاء
بالنسبة إلى الإصدارات الحديثة من نواة Linux، استخدِم 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`، يُرجى الاطّلاع على فروع نواة Linux وأنظمة الإنشاء الخاصة بها.
للاطّلاع على تفاصيل حول تنزيل نواة نظام التشغيل وتجميعها لأجهزة Pixel، يُرجى الاطّلاع على مقالة إنشاء نواة نظام التشغيل لأجهزة Pixel.
بناء النواة
الإنشاء باستخدام Bazel (Kleaf)
طرح الإصدار 13 من Android أداة إنشاء نواة باستخدام Bazel.
لإنشاء إصدار من نواة GKI لبنية aarch64، يمكنك الاطّلاع على فرع "النواة المشتركة لنظام التشغيل Android" الذي لا يرجع تاريخه إلى ما قبل Android 13، ثم تنفيذ الأمر التالي:
tools/bazel run //common:kernel_aarch64_dist [-- --destdir=$DIST_DIR]
بعد ذلك، يمكن العثور على ملف kernel الثنائي والوحدات والصور المقابلة في الدليل
$DIST_DIR
. إذا لم يتم تحديد --destdir
، اطّلِع على ناتج
الأمر لمعرفة موقع العناصر. لمعرفة التفاصيل، يمكنك الاطّلاع على المستندات الخاصة ببروتوكول AOSP.
الإنشاء باستخدام build.sh (قديم)
بالنسبة إلى الفروع التي تعمل بالإصدار 12 من نظام التشغيل Android أو الإصدارات الأقدم، أو الفروع التي لا تتضمّن Kleaf:
build/build.sh
يمكنك العثور على البرنامج الثنائي للنواة والوحدات والصورة المقابلة في دليل out/BRANCH/dist
.
إنشاء وحدات المورّد للجهاز الافتراضي
أتاح الإصدار 13 من Android إنشاء نواة باستخدام
Bazel (Kleaf)، بدلاً من build.sh
.
لإنشاء توزيع لمكوّنات virtual_device
، شغِّل:
tools/bazel run //common-modules/virtual-device:virtual_device_x86_64_dist [-- --destdir=$DIST_DIR]
لمزيد من التفاصيل حول إنشاء نواة Android باستخدام Bazel، يُرجى الاطّلاع على. Kleaf: إنشاء نواة Android باستخدام Bazel
لمعرفة تفاصيل عن توافق Kleaf مع المعماريات الفردية، يُرجى الاطّلاع على توافق Kleaf مع الأجهزة والنواة.
إنشاء وحدات المورّد للجهاز الافتراضي باستخدام build.sh (الإصدار القديم)
في Android 12، تم دمج Cuttlefish وGoldfish، لذا يتشاركان
النواة نفسها: virtual_device
. لإنشاء وحدات هذا kernel، استخدِم إعدادات الإنشاء التالية:
BUILD_CONFIG=common-modules/virtual-device/build.config.virtual_device.x86_64 build/build.sh
طرح نظام التشغيل Android 11 GKI، الذي يفصل بين النواة وصورة النواة التي تديرها Google والوحدات التي يديرها المورّد، والتي يتم إنشاؤها بشكل منفصل.
يوضح هذا المثال إعدادات صورة kernel:
BUILD_CONFIG=common/build.config.gki.x86_64 build/build.sh
يعرض هذا المثال إعدادات وحدة (Cuttlefish وEmulator):
BUILD_CONFIG=common-modules/virtual-device/build.config.cuttlefish.x86_64 build/build.sh
تشغيل النواة
هناك عدة طرق لتشغيل نواة مُنشأة مخصّصة. في ما يلي طرق معروفة مناسبة لسيناريوهات التطوير المختلفة.
تضمين الرمز في إصدار صورة Android
انسخ Image.lz4-dtb
إلى موقع ملف kernel الثنائي المعني
ضمن شجرة 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.
لتشغيل جهاز Cuttlefish باستخدام مجموعة معيّنة من عناصر
kernel، شغِّل الأمر cvd create
مع عناصر kernel المستهدفة كمَعلمات. يستخدم المثال التالي عناصر kernel لهدف arm64 من بيان النواة common-android14-6.1
.
cvd create \
-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
، يمكن أن تتأثر عملية التصميم والنتائج
بمتغيرات البيئة.
معظمها اختيارية ويجب أن يأتي كل فرع من فروع kernel بإعدادات تلقائية مناسبة. في ما يلي الإعدادات الأكثر استخدامًا. للحصول على قائمة كاملة (ومحدَّثة)، يُرجى الرجوع إلى build/build.sh
.
متغيّر البيئة | الوصف | مثال |
---|---|---|
BUILD_CONFIG |
إنشاء ملف إعداد يمكنك من خلاله إعداد بيئة الإصدار.
يجب تحديد الموقع الجغرافي بالنسبة إلى دليل ملف الإصدار
الأساسي. الإعداد التلقائي هو 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 |
إعدادات مخصّصة للنواة لعمليات الإنشاء على الجهاز
في Android 14 والإصدارات الأحدث، يمكنك استخدام أجزاء defconfig لتخصيص إعدادات kernel. يُرجى الاطّلاع على مستندات Kleaf حول أجزاء defconfig.
ضبط نواة مخصصة للإصدارات المحلية باستخدام إعدادات الإصدار (قديم)
في نظام التشغيل Android 13 والإصدارات الأقدم، يمكنك الاطّلاع على ما يلي:
إذا كنت بحاجة إلى تبديل خيار إعدادات kernel بانتظام، مثلاً، عند العمل على ميزة، أو إذا كنت بحاجة إلى ضبط خيار لأغراض التطوير ، يمكنك تحقيق هذه المرونة من خلال الاحتفاظ بتعديل محلي أو نسخة من إعدادات الإنشاء.
اضبط المتغيّر POST_DEFCONFIG_CMDS على تعبير يتم تقييمه مباشرةً بعد تنفيذ الخطوة make defconfig
المعتادة. عند نقل ملفات build.config
إلى بيئة الإنشاء
، يمكن استدعاء الدوال المحدّدة في build.config
كجزء من أوامر ما بعد ملف defconfig.
ومن الأمثلة الشائعة على ذلك إيقاف ميزة تحسين وقت الربط (LTO) لبرامج التشغيل أثناء التطوير. على الرغم من أنّ ميزة LTO مفيدة لأنظمة التشغيل الأساسية التي تم إصدارها،
يمكن أن تكون النفقات العامة في وقت الإنشاء كبيرة. يؤدي المقتطف التالي الذي تمت إضافته
إلى build.config
المحلي إلى إيقاف ميزة "التوفّر عند الطلب" بشكل دائم عند
استخدام 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 عن النسخة الصحيحة كجزء من رسالة الإتمام:
cd $AOSP/device/VENDOR/NAME
git log --max-count=1
إذا لم يكن إصدار kernel مُدرَجًا في سجلّ git، يمكنك الحصول عليه من ملف system image، كما هو موضّح أدناه.
إصدار النواة من صورة النظام
لتحديد إصدار النواة المستخدَم في صورة نظام، نفِّذ الأمر التالي على ملف النواة:
file kernel
بالنسبة إلى ملفات Image.lz4-dtb
، يمكنك تنفيذ ما يلي:
grep -a 'Linux version' Image.lz4-dtb
إنشاء صورة تشغيل
يمكن إنشاء صورة تمهيد باستخدام بيئة إصدار النواة (kernel).
إنشاء صورة لبدء التشغيل للأجهزة التي تستخدم init_boot
بالنسبة إلى الأجهزة التي تحتوي على
قسم init_boot
،
يتم إنشاء صورة التمهيد مع النواة. لم يتم تضمين صورة initramfs
في صورة التمهيد.
على سبيل المثال، باستخدام Kleaf، يمكنك إنشاء صورة التمهيد لـ GKI باستخدام:
tools/bazel run //common:kernel_aarch64_dist [-- --destdir=$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 من إصدار Android المرتبط.
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 على
ci.android.com واستخدامه كملف ثنائي لنظام التشغيل ramdisk.
عندما يكون لديك برنامج ثنائي RAMdisk ونسخته إلى gki-ramdisk.lz4
في الدليل الجذري من إصدار kernel، يمكنك إنشاء نسخة تشغيل من خلال تنفيذ ما يلي:
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
.