توضِّح هذه الصفحة بالتفصيل عملية إنشاء النواة المخصّصة لأجهزة 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 والوحدات التي يديرها المورّد، والتي يتم إنشاؤها بشكل منفصل.
يعرض هذا المثال إعدادات صورة نواة:
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 المستهدفة كمَعلمات. يستخدِم المثال التالي للأمر عناصر نظام التشغيل الأساسية لاستهداف 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.
تخصيص إصدار النواة
لتخصيص إصدارات kernel لإصدارات Kleaf، يُرجى الاطّلاع على مستندات Kleaf.
تخصيص عملية إنشاء النواة باستخدام build.sh (الإصدار القديم)
بالنسبة إلى build/build.sh
، يمكن أن تتأثر عملية الإنشاء والنتيجة
بمتغيّرات البيئة.
ومعظمها اختياري، ومن المفترض أن يتضمّن كل فرع من فروع النواة إعدادًا أساسيًا مناسبًا. في ما يلي الإعدادات الأكثر استخدامًا. للحصول على قائمة كاملة (ومحدَّثة)، يُرجى الرجوع إلى 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 |
الدليل الأساسي لإخراج تجميعة kernel | 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)
}
تحديد إصدارات النواة
يمكنك تحديد الإصدار الصحيح الذي تريد إنشاءه من مصدرَين: شجرة 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
إنشاء صورة تشغيل
من الممكن إنشاء صورة تمهيد باستخدام بيئة إنشاء النواة.
إنشاء صورة تشغيل للأجهزة التي تستخدم 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
،
ستحتاج إلى ملف ثنائي لشريحة ذاكرة الوصول العشوائي (RAM)، ويمكنك الحصول عليه من خلال
تنزيل صورة تمهيد 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.
عندما يكون لديك ملف ثنائي لشريحة ذاكرة الوصول العشوائي (RAM) ونسخته إلى gki-ramdisk.lz4
في الدليل root
لإصدار 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
.