توضح هذه الصفحة تفاصيل عملية إنشاء نواة مخصصة لأجهزة Android. ترشدك هذه التعليمات خلال عملية تحديد المصادر الصحيحة ، وبناء النواة ، وتضمين النتائج في صورة نظام مبنية من مشروع Android مفتوح المصدر (AOSP).
يمكنك الحصول على مصادر kernel أحدث باستخدام Repo ؛ قم ببنائها دون مزيد من التكوين عن طريق تشغيل build/build.sh
من جذر الخروج من المصدر.
تنزيل المصادر وأدوات البناء
بالنسبة إلى النوى الحديثة ، استخدم 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 للنواة المتاحة من خلال هذه الطريقة.
جهاز | مسار ثنائي في شجرة AOSP | فروع الريبو |
---|---|---|
بكسل 7 (النمر) Pixel 7 Pro (فهد) | device / google / pantah-kernel | android-gs-pantah-5.10-android13-qpr2 |
Pixel 6a (بلوجاي) | device / google / bluejay-kernel | android-gs-bluejay-5.10-android13-qpr2 |
Pixel 6 (أوريول) Pixel 6 Pro (غراب) | device / google / raviole-kernel | android-gs-raviole-5.10-android13-qpr2 |
Pixel 5a (باربيت) Pixel 5 (ذو زعنفة حمراء) Pixel 4a (5G) (برامبل) | device / google / redbull-kernel | android-msm-redbull-4.19-android13-qpr2 |
بكسل 4 أ (سمكة الشمس) | device / google / sunfish-kernel | android-msm-sunfish-4.14-android13-qpr2 |
Pixel 4 (لهب) Pixel 4 XL (مرجاني) | device / google / coral-kernel | android-msm-coral-4.14-android13.0.0-mod.apk |
Pixel 3a (سارجو) Pixel 3a XL (بونيتو) | device / google / bonito-kernel | android-msm-bonito-4.9-android12L |
Pixel 3 (أزرق أزرق) Pixel 3 XL (التظليل المتقاطع) | device / google / crosshatch-kernel | android-msm-crosshatch-4.9-android12 |
بكسل 2 (العين رمادية فاتحة اللون) Pixel 2 XL (تايمن) | device / google / wahoo-kernel | android-msm-wahoo-4.4-android10-qpr3 |
بكسل (سمكة ابوشراع) Pixel XL (مارلين) | device / google / marlin-kernel | android-msm-marlin-3.18-pie-qpr2.0.0-mod.apk |
هيكي 960 | الجهاز / لينارو / نواة هيكي | hikey-linaro-android-4.14.0 تحديث hikey-linaro-android-4.19.0 تحديث شائع android12-5.4 عام-android13-5.10 |
بيجل x15 | الجهاز / ti / beagle_x15-kernel | omap-beagle-x15-android-4.14.0 تحديث omap-beagle-x15-android-4.19.0 تحديث |
نواة Android المشتركة | غير متاح | عام-أندرويد-4.4 عام-android-4.9 عام-أندرويد 4.14.0 عام-أندرويد 4.19.0 مشترك-أندرويد-4.19-مستقر عام-android11-5.4 شائع android12-5.4 عام-android12-5.10 عام-android13-5.10 عام android13-5.15 عام android14-5.15 عام android14-6.1 مشترك-android-mainline |
بناء النواة
ثم قم ببناء النواة بهذا:
build/build.sh
يوجد ملف kernel الثنائي والوحدات النمطية والصورة المقابلة في دليل out/ BRANCH /dist
.
البناء بالبازل (كليف)
قدم Android 13 نواة البناء مع Bazel ، لتحل محل build/build.sh
.
لإنشاء GKI kernel لبنية aarch64 ، تحقق من فرع Android Common Kernel ليس قبل Android 13 ثم قم بتشغيل الأمر التالي:
tools/bazel build //common:kernel_aarch64_dist
لإنشاء توزيع ، قم بتشغيل:
tools/bazel run //common:kernel_aarch64_dist -- --dist_dir=$DIST_DIR
بعد ذلك ، تم وضع ملف kernel الثنائي والوحدات النمطية والصور المقابلة في الدليل $DIST_DIR
. إذا كان --dist_dir
غير محدد ، فراجع إخراج الأمر الخاص بموقع القطع الأثرية. للحصول على التفاصيل ، راجع الوثائق على AOSP .
بناء وحدات البائع للجهاز الظاهري
قدم Android 11 GKI ، الذي يفصل النواة إلى صورة kernel تحتفظ بها Google ووحدات صيانة البائعين ، والتي يتم إنشاؤها بشكل منفصل.
يوضح هذا المثال تكوين صورة kernel:
BUILD_CONFIG=common/build.config.gki.x86_64 build/build.sh
يوضح هذا المثال تكوين الوحدة (Cuttlefish and Emulator):
BUILD_CONFIG=common-modules/virtual-device/build.config.cuttlefish.x86_64 build/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 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 للأجهزة والنواة .
دعم Kleaf للأجهزة والنواة
يسرد الجدول التالي دعم Kleaf لنواة الأجهزة الفردية. بالنسبة للأجهزة غير المدرجة ، يرجى الاتصال بالشركة المصنعة للجهاز.
جهاز | فروع الريبو | دعم Kleaf | build/build.sh |
---|---|---|---|
نواة Android المشتركة db845c جهاز افتراضي (x86_64 ، arm64) جهاز افتراضي (i686 ، ذراع) روكبي 4 | عام-أندرويد-4.4 عام-android-4.9 عام-أندرويد 4.14.0 عام-أندرويد 4.19.0 مشترك-أندرويد-4.19-مستقر عام-android11-5.4 شائع android12-5.4 عام-android12-5.10 | ❌ | ✅ |
نواة Android المشتركة | عام-android13-5.10 عام android13-5.15 | ✅ | ✅ (رسمي) 1 |
نواة Android المشتركة | عام android14-5.15 عام android14-6.1 مشترك-android-mainline | ✅ | ❌ |
db845c | عام-android13-5.10 | ❌ | ✅ |
db845c | عام android13-5.15 | ✅ | ✅ (رسمي) 1 |
db845c | عام android14-5.15 عام android14-6.1 مشترك-android-mainline | ✅ | ❌ |
جهاز افتراضي (x86_64 ، arm64) | عام-android13-5.10 عام android13-5.15 | ✅ (رسمي) 1 | ⚠️ (لم تتم صيانته) 2 |
جهاز افتراضي (x86_64 ، arm64) | عام android14-5.15 عام android14-6.1 مشترك-android-mainline | ✅ | ❌ |
جهاز افتراضي (i686 ، ذراع) | عام-android13-5.10 عام android13-5.15 | ❌ | ✅ |
جهاز افتراضي (i686 ، ذراع) | عام android14-5.15 عام android14-6.1 مشترك-android-mainline | ✅ | ❌ |
روكبي 4 | عام-android13-5.10 عام android13-5.15 | ❌ | ✅ |
روكبي 4 | عام android14-5.15 عام android14-6.1 مشترك-android-mainline | ✅ | ❌ |
هيكي 960 | hikey-linaro-android-4.14.0 تحديث hikey-linaro-android-4.19.0 تحديث شائع android12-5.4 عام-android13-5.10 | ❌ | ✅ |
وحدة fips140 | عام-android12-5.10 عام-android13-5.10 عام android13-5.15 | ❌ | ✅ |
وحدة fips140 | عام android14-5.15 | ✅ | ❌ |
1 "الرسمية" تعني أن هذه هي الطريقة الرسمية لبناء النواة ، على الرغم من إمكانية استخدام الطريقة البديلة أيضًا لبناء النواة. 2 تعني كلمة "غير مقيدة" أن بناء النواة بهذه الطريقة يجب أن يعمل ، لكن طريقة البناء لا يتم اختبارها باستمرار. قد يتوقف عن البناء في المستقبل. استخدم الطريقة "الرسمية" للبناء بدلاً من ذلك. |
تشغيل النواة
هناك عدة طرق لتشغيل نواة مبنية بشكل مخصص. فيما يلي طرق معروفة مناسبة لسيناريوهات التطوير المختلفة.
التضمين في بناء صورة 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
باستخدام هذه الطريقة ، لا تومض النواة بالفعل ولن تستمر عبر إعادة التشغيل.
تخصيص بناء النواة
لتخصيص إصدارات kernel لإصدارات Kleaf ، راجع وثائق Kleaf .
بالنسبة 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 | دليل الإخراج الأساسي لتوزيع kernel. | 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 |
تهيئة نواة مخصصة للبنيات المحلية
إذا كنت بحاجة إلى تبديل خيار تكوين 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)
}
تحديد إصدارات النواة
يمكنك تحديد الإصدار الصحيح للبناء من مصدرين: شجرة AOSP وصورة النظام.
نسخة النواة من شجرة AOSP
تحتوي شجرة AOSP على إصدارات نواة تم إنشاؤها مسبقًا. يكشف سجل git عن الإصدار الصحيح كجزء من رسالة التنفيذ:
cd $AOSP/device/VENDOR/NAME
git log --max-count=1
إذا لم يكن إصدار kernel مدرجًا في سجل git ، احصل عليه من صورة النظام ، كما هو موضح أدناه.
إصدار Kernel من صورة النظام
لتحديد إصدار kernel المستخدم في صورة النظام ، قم بتشغيل الأمر التالي على ملف kernel:
file kernel
بالنسبة لملفات Image.lz4-dtb
، قم بتشغيل:
grep -a 'Linux version' Image.lz4-dtb
بناء صورة التمهيد
من الممكن بناء صورة تمهيد باستخدام بيئة بناء النواة.
إنشاء صورة تمهيد للأجهزة باستخدام init_boot
بالنسبة للأجهزة التي تحتوي على قسم init_boot
، يتم إنشاء صورة التمهيد مع kernel. لم يتم تضمين صورة 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 master ، فيمكنك بدلاً من ذلك تنزيل أداة الإنشاء 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
.