توضّح هذه الصفحة بالتفصيل عملية إنشاء نِوى مخصّصة لأجهزة Android. وترشدك هذه التعليمات خلال عملية اختيار المصادر المناسبة وإنشاء النواة وتضمين النتائج في صورة نظام تم إنشاؤها من مشروع Android مفتوح المصدر (AOSP).
تنزيل المصادر وأدوات الإنشاء
بالنسبة إلى النوى الحديثة، استخدِم repo
لتنزيل المصادر وسلسلة الأدوات والنصوص البرمجية للإنشاء.
تتطلّب بعض النوى (مثل نِوى Pixel 3) مصادر من مستودعات git
متعددة، بينما لا تتطلّب النوى الأخرى (مثل النوى الشائعة) سوى مصدر واحد. يضمن استخدام طريقة repo إعداد دليل مصدر صحيح
نزِّل مصادر الفرع المناسب:
mkdir android-kernel && cd android-kernel
repo init -u https://android.googlesource.com/kernel/manifest -b BRANCH
repo sync
للاطّلاع على قائمة بفروع repo (BRANCH) التي يمكن استخدامها مع الأمر `repo init` السابق، يُرجى الاطّلاع على فروع النواة وأنظمة الإنشاء الخاصة بها.
لمعرفة تفاصيل حول تنزيل النوى وتجميعها لأجهزة Pixel، يُرجى الاطّلاع على مقالة إنشاء نِوى Pixel.
إنشاء النواة
الإنشاء باستخدام Bazel (Kleaf)
في Android 13، تم تقديم ميزة إنشاء النوى باستخدام Bazel.
لإنشاء حزمة توزيع لنواة GKI لبنية aarch64، عليك سحب فرع من Android Common Kernel لا يكون أقدم من Android 13 و ثم شغِّل الأمر التالي:
tools/bazel run //common:kernel_aarch64_dist [-- --destdir=$DIST_DIR]
بعد ذلك، يتم وضع الملف الثنائي للنواة والوحدات والصور المقابلة في الدليل $DIST_DIR. إذا لم يتم تحديد --destdir، اطّلِع على ناتج الأمر لمعرفة موقع العناصر. لمزيد من التفاصيل، يُرجى الرجوع إلى
المستندات على AOSP.
الإنشاء باستخدام build.sh (الإصدار القديم)
بالنسبة إلى الفروع التي تعمل بالإصدار Android 12 والإصدارات الأقدم، أو الفروع التي لا تتضمّن Kleaf:
build/build.sh
يتم وضع الملف الثنائي للنواة والوحدات والصورة المقابلة في الدليل
out/BRANCH/dist.
إنشاء وحدات المورِّد للجهاز الافتراضي
في Android 13، تم تقديم ميزة إنشاء النوى باستخدام
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. لإنشاء وحدات هذه النواة، استخدِم إعداد الإنشاء هذا:
BUILD_CONFIG=common-modules/virtual-device/build.config.virtual_device.x86_64 build/build.sh
في Android 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
تشغيل النواة
هناك طرق متعددة لتشغيل نواة تم إنشاؤها بشكل مخصّص. في ما يلي الطرق المعروفة والمناسبة لسيناريوهات التطوير المختلفة.
التضمين في عملية إنشاء صورة Android
انسخ 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
تثبيت ذاكرة ROM ونوى التشغيل باستخدام Fastboot
تحتوي معظم الأجهزة الحديثة على إضافة لبرنامج إقلاع لتسهيل عملية إنشاء صورة التشغيل وتشغيلها.
لتشغيل النواة بدون تثبيتها:
adb reboot bootloaderfastboot boot Image.lz4-dtb
باستخدام هذه الطريقة، لا يتم تثبيت النواة فعليًا، ولن تظل بعد إعادة التشغيل.
تشغيل النوى على Cuttlefish
يمكنك تشغيل النوى بالبنية التي تختارها على أجهزة Cuttlefish.
لتشغيل جهاز Cuttlefish باستخدام مجموعة معيّنة من عناصر النواة، شغِّل الأمر cvd create مع عناصر النواة المستهدَفة كمعلَمات. يستخدم مثال الأمر التالي عناصر النواة لهدف 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
لمزيد من المعلومات، يُرجى الاطّلاع على مقالة تطوير النوى على Cuttlefish.
تخصيص عملية إنشاء النواة
لتخصيص عمليات إنشاء النواة لعمليات إنشاء Kleaf، يُرجى الاطّلاع على مستندات Kleaf.
تخصيص عملية إنشاء النواة باستخدام build.sh (الإصدار القديم)
بالنسبة إلى build/build.sh، يمكن أن تتأثر عملية الإنشاء والنتيجة
بالمتغيّرات البيئية.
معظم هذه المتغيّرات اختيارية، ويجب أن يتضمّن كل فرع من فروع النواة إعدادًا تلقائيًا مناسبًا
في ما يلي المتغيّرات الأكثر استخدامًا. للاطّلاع على قائمة كاملة (ومحدّثة)، يُرجى الرجوع إلى build/build.sh.
| متغيّر البيئة | الوصف | مثال |
|---|---|---|
BUILD_CONFIG |
ملف إعداد الإنشاء الذي تبدأ منه بيئة الإنشاء.
يجب تحديد الموقع بالنسبة إلى دليل جذر Repo
directory. الإعداد التلقائي هو 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 لتخصيص إعدادات النواة. يُرجى الاطّلاع على مستندات Kleaf حول أجزاء defconfig.
إعداد النواة المخصّص لعمليات الإنشاء المحلية باستخدام إعدادات الإنشاء (الإصدار القديم)
في Android 13 والإصدارات الأقدم، يُرجى الاطّلاع على ما يلي.
إذا كنت بحاجة إلى تبديل خيار إعداد النواة بانتظام، مثلاً، عند العمل على ميزة، أو إذا كنت بحاجة إلى ضبط خيار لأغراض التطوير، يمكنك تحقيق هذه المرونة من خلال الاحتفاظ بتعديل محلي أو نسخة من إعداد الإنشاء.
اضبط المتغيّر 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 عن الإصدار الصحيح كجزء من رسالة الالتزام:
cd $AOSP/device/VENDOR/NAMEgit 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 [-- --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
المجلد المستهدَف هو دليل المستوى الأعلى لشجرة النواة (دليل العمل الحالي ).
إذا كنت تطوّر باستخدام أحدث فرع من إصدار مشروع Android المفتوح المصدر (AOSP)، يمكنك بدلاً من ذلك تنزيل
ramdisk-recovery.img إصدار من إصدار aosp_arm64 على
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.