توضح هذه الصفحة بالتفصيل عملية إنشاء النواة لأجهزة 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 build //common:kernel_aarch64_dist
لإنشاء توزيع، شغِّل:
tools/bazel run //common:kernel_aarch64_dist -- --dist_dir=$DIST_DIR
بعد ذلك، يقع النظام الثنائي للنواة والوحدات والصور المقابلة لها في
دليل $DIST_DIR
. في حال عدم تحديد السمة --dist_dir
، يمكنك الاطّلاع على الناتج.
للأمر الخاص بموقع الأدوات. للحصول على التفاصيل، يُرجى الرجوع إلى
مستندات حول بروتوكول AOSP
إنشاء باستخدام Build.sh (قديم)
للفروع التي تعمل بالإصدار 12 من نظام التشغيل Android أو الإصدارات الأقدم منه الفروع التي لا تحتوي على كليف:
build/build.sh
يكون ثنائي النواة (النواة) والوحدات والصورة المقابلة في
دليل out/BRANCH/dist
.
إنشاء وحدات المورد للجهاز الافتراضي
طرح Android 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
لمزيد من التفاصيل حول إنشاء نواة Android باستخدام Bazel، يُرجى الاطّلاع على. Kleaf: إنشاء نواة Android باستخدام Bazel
للحصول على تفاصيل حول إتاحة Kleaf للبُنى الأساسية الفردية، يُرجى الاطّلاع على التوافق مع Kleaf للأجهزة والنواة
إنشاء وحدات المورِّد للجهاز الافتراضي باستخدام Build.sh (الإصدار القديم)
في Android 12، يتلاقى الحبّار والسمك الذهبي، لذا يتشاركان
النواة نفسها: virtual_device
. لإنشاء وحدات تلك النواة، استخدم هذا الإصدار
التكوين:
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
يوضح هذا المثال تهيئة وحدة (سمك الحبّار والمحاكي):
BUILD_CONFIG=common-modules/virtual-device/build.config.cuttlefish.x86_64 build/build.sh
تشغيل النواة (kernel)
هناك العديد من الطرق لتشغيل نواة مخصصة. فيما يلي الطرق المعروفة المناسبة لسيناريوهات التطوير المختلفة.
التضمين في إصدار 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
نواة الفلاش والتشغيل مع Fastboot
تحتوي معظم الأجهزة الحديثة على إضافة برنامج الإقلاع لتسهيل عملية إنشاء صورة تشغيل وتشغيلها.
لتشغيل النواة بدون وميض:
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
لمزيد من المعلومات، يُرجى مراجعة تطوير حبات الحبوب على الحبار
تخصيص بنية النواة
لتخصيص إصدارات النواة لإصدارات 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 |
دليل الإخراج الأساسي لإصدار النواة (kernel) | OUT_DIR=/path/to/my/out |
SKIP_DEFCONFIG |
تخطّي make defconfig |
SKIP_DEFCONFIG=1 |
SKIP_MRPROPER |
تخطّي make mrproper |
SKIP_MRPROPER=1 |
ضبط نواة مخصصة للإصدارات المحلية
في الإصدار 14 من نظام Android والإصدارات الأحدث، يمكنك استخدام أجزاء طريقة defconfig. لتخصيص تهيئات النواة. الرؤية مستندات Kleaf حول أجزاء defconfig
ضبط نواة مخصصة للإصدارات المحلية باستخدام إعدادات الإصدار (قديم)
في نظام التشغيل Android 13 والإصدارات الأقدم، يمكنك الاطّلاع على ما يلي:
إذا كنت بحاجة إلى تبديل خيار تهيئة kernel بانتظام، على سبيل المثال، عند العمل على ميزة أو إذا كنت بحاجة إلى خيار الإعداد للتطوير يمكنك تحقيق هذه المرونة من خلال الحفاظ على تعديل أو نسخ إعدادات الإصدار
اضبط المتغير POST_DEFCONFIG_CMDS على عبارة تكون
يتم تقييمه مباشرةً بعد خطوة make defconfig
المعتادة
تم. استنادًا إلى مصدر ملفات build.config
في الإصدار
بيئة، يمكن استدعاء الدوال المحددة في build.config
كجزء من أوامر post-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، يمكنك الحصول عليه من النظام. كما هو موضح أدناه.
إصدار النواة من صورة النظام
لتحديد إصدار الكيرنل (النواة) المستخدم في صورة نظام، قم بتشغيل ما يلي الأمر ضد ملف الكيرنل (kernel):
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 -- --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 من إصدار Android المرتبط بها.
tools/mkbootimg/unpack_bootimg.py --boot_img=boot-5.4-gz.img
mv $KERNEL_ROOT/out/ramdisk gki-ramdisk.lz4
المجلد الهدف هو دليل المستوى الأعلى لشجرة نواة (النواة الحالية) دليل العمل).
إذا كنت تطوِّر باستخدام تطبيق 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
.