توضح هذه الصفحة بالتفصيل عملية إنشاء النواة لأجهزة Android. هذه ترشدك خلال عملية اختيار الأدوات المصادر، وبناء النواة، وتضمين النتائج في صورة نظام تم إنشاؤه من مشروع مفتوح المصدر لنظام Android (AOSP).
يمكنك الحصول على مصادر أحدث النواة باستخدام
Repo؛ وتنشئها دون المزيد
من خلال تشغيل build/build.sh
من جذر
المصدر للدفع.
تنزيل المصادر وأدوات الإنشاء
مع النواة الأخيرة، يمكنك استخدام repo
.
تنزيل المصادر وسلسلة الأدوات وإنشاء النصوص البرمجية
تتطلّب بعض النواة (مثل نواة Pixel 3) مصادر من مصادر متعددة.
بينما تتطلب المستودعات الأخرى (على سبيل المثال، النواة الشائعة) مستودعًا واحدًا
المصدر. يضمن استخدام أسلوب 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
إنشاء النواة
Build with Bazel (Kleaf)
طرح Android 13 نواة تصميم باستخدام Bazel
لإنشاء توزيع لنواة GKI لبنية aarch64، اطلع على فرع Kernel مشترك في Android 13 على الأقل ثم قم بتشغيل الأمر التالي:
tools/bazel run //common:kernel_aarch64_dist [-- --destdir=$DIST_DIR]
بعد ذلك، يمكن العثور على ملف kernel الثنائي والوحدات والصور المقابلة في الدليل
$DIST_DIR
. إذا لم يتم تحديد --destdir
، اطّلِع على ناتج
الأمر لمعرفة موقع العناصر. للحصول على التفاصيل، يُرجى الرجوع إلى
مستندات حول بروتوكول AOSP
الإنشاء باستخدام build.sh (قديم)
للفروع التي تعمل بالإصدار 12 من نظام التشغيل Android أو الإصدارات الأقدم منه الفروع التي لا تحتوي على كليف:
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
. لإنشاء وحدات هذا 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 باستخدام مجموعة معيّنة من عناصر
kernel، شغِّل الأمر cvd create
مع عناصر 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
لمزيد من المعلومات، يُرجى مراجعة تطوير حبات الحبوب على الحبار
تخصيص إصدار kernel
لتخصيص إصدارات kernel لإصدارات 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 من Android والإصدارات الأحدث، يمكنك استخدام أجزاء من ملف defconfig لتخصيص إعدادات kernel. يُرجى الاطّلاع على مستندات Kleaf حول أجزاء ملف defconfig.
ضبط نواة مخصصة للإصدارات المحلية باستخدام إعدادات الإصدار (قديم)
في Android 13 والإصدارات الأقدم، يُرجى الاطّلاع على ما يلي:
إذا كنت بحاجة إلى تبديل خيار إعدادات kernel بانتظام، مثلاً، عند العمل على ميزة، أو إذا كنت بحاجة إلى ضبط خيار لأغراض التطوير ، يمكنك تحقيق هذه المرونة من خلال الاحتفاظ بتعديل محلي أو نسخة من إعدادات الإنشاء.
اضبط المتغيّر POST_DEFCONFIG_CMDS على تعبير يتم تقييمه مباشرةً بعد تنفيذ الخطوة make defconfig
المعتادة. عندما يتم نقل ملفات build.config
إلى بيئة الإنشاء
، يمكن استدعاء الدوال المحدّدة في 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)
}
تحديد إصدارات النواة (kernel)
يمكنك تحديد الإصدار الصحيح الذي تريد إنشاءه من مصدرَين: شجرة AOSP وصورة النظام.
إصدار النواة من شجرة AOSP
تحتوي شجرة AOSP على إصدارات نواة مسبقة الإنشاء. أطلِق العنان لقدراتك يكشف السجل عن النسخة الصحيحة كجزء من رسالة التنفيذ:
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 [-- --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
في الجذر
دليل إصدار النواة، يمكنك إنشاء صورة تمهيد عن طريق تنفيذ ما يلي:
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
.