बिल्ड कर्नेल

यह पेज कस्टम बनाने की प्रक्रिया का विवरण देता है kernel के तौर पर भी उपलब्ध है. ये निर्देशों में आपको सही विकल्प चुनने की प्रक्रिया सोर्स, कर्नेल बनाना, और नतीजों को सिस्टम इमेज में एम्बेड करना जिसे Android ओपन सोर्स प्रोजेक्ट (AOSP) से बनाया गया है.

हाल ही के कर्नेल सोर्स का ऐक्सेस पाने के लिए, रिपो; उन्हें बिना किसी समस्या के तैयार किया जा सकता है को रूट से 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) की सूची देखने के लिए, जिसका इस्तेमाल पिछले नियम के साथ किया जा सकता है `repo init` कमांड, देखें Kernel ब्रांच और उनके बिल्ड सिस्टम.

Pixel डिवाइस के लिए कर्नेल डाउनलोड और कंपाइल करने के बारे में ज़्यादा जानकारी के लिए, यहां देखें Pixel कर्नेल बनाना.

कर्नेल बनाएं

बेज़ल (Kleaf) की मदद से बनाएं

Android 13 में, इमारत बनाने में इस्तेमाल होने वाले कर्नेल के साथ बेज़ल.

Aआर्क64 आर्किटेक्चर के लिए GKI कर्नेल बनाने का तरीका जानने के लिए, यह तरीका अपनाएं Android Common 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 पर दस्तावेज़.

बिल्ड.sh (लेगसी) के साथ बनाएं

Android 12 या इससे पहले के वर्शन वाले ब्रांच के लिए, या बिना क्लीफ़ के शाखाएं:

build/build.sh
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है

कर्नेल बाइनरी, मॉड्यूल, और संबंधित इमेज out/BRANCH/dist डायरेक्ट्री.

वर्चुअल डिवाइस के लिए वेंडर मॉड्यूल बनाएं

Android 13 में, इमारत बनाने में इस्तेमाल होने वाले कर्नेल के साथ build.sh की जगह बेज़ल (Kleaf).

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

Baze के साथ Android कर्नेल बनाने के बारे में ज़्यादा जानकारी के लिए, देखें. Kleaf - Bagel की मदद से Android Kernel बनाना.

अलग-अलग आर्किटेक्चर के लिए Kleaf समर्थन पर विवरण के लिए, देखें डिवाइसों और कर्नेल के लिए Kleaf सहायता.

बिल्ड.sh (लेगसी) की मदद से वर्चुअल डिवाइस के लिए वेंडर मॉड्यूल बनाएं

Android 12 में कटलफ़िश और गोल्डफ़िश की आपस में मुलाकात एक ही कर्नेल: virtual_device. उस कर्नेल के मॉड्यूल बनाने के लिए, इस बिल्ड का इस्तेमाल करें कॉन्फ़िगरेशन:

BUILD_CONFIG=common-modules/virtual-device/build.config.virtual_device.x86_64 build/build.sh

पेश किया गया Android 11 जीकेआई, यह कर्नेल को, Google की ओर से मैनेज किए जा रहे कर्नेल इमेज और वेंडर रखरखाव-मॉड्यूल में अलग करता है, जिन्हें अलग से बनाया जाता है.

इस उदाहरण में, कर्नेल इमेज कॉन्फ़िगरेशन दिखाया गया है:

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

कर्नेल चलाएं

पसंद के मुताबिक बनाए गए कर्नेल को चलाने के कई तरीके हैं. ये हैं ऐसे तरीके हैं जो अलग-अलग डेवलपमेंट स्थितियों के लिए सही हैं.

Android इमेज बिल्ड में एम्बेड करें

Image.lz4-dtb को संबंधित कर्नेल बाइनरी जगह पर कॉपी करें और बूट इमेज को फिर से बनाएं.

इसके अलावा, TARGET_PREBUILT_KERNEL की जानकारी भी दें make bootimage (या कोई दूसरा विकल्प) का इस्तेमाल करते समय वैरिएबल make कमांड लाइन बनाएं, जो बूट इमेज बनाती है). यह चर है सभी डिवाइस पर काम करता है, क्योंकि इसे इसके ज़रिए सेट अप किया जाता है device/common/populate-new-device.sh. उदाहरण के लिए:

export TARGET_PREBUILT_KERNEL=DIST_DIR/Image.lz4-dtb

फ़ास्टबूट के साथ फ़्लैश और बूट कर्नेल

हाल ही के डिवाइसों में बूटलोडर एक्सटेंशन होता है. इससे, बूट इमेज जनरेट करना और उसे चालू करना.

फ़्लैश किए बिना कर्नेल को चालू करने के लिए:

adb reboot bootloader
fastboot boot Image.lz4-dtb

इस तरीके का इस्तेमाल करने से, कर्नेल असल में फ़्लैश नहीं करता है और यह बना नहीं रहेगा एक साथ कई काम करती हैं.

कटलफ़िश पर कर्नेल रन करें

आप इस पर अपनी पसंद के आर्किटेक्चर में कर्नेल चला सकते हैं कटलफ़िश डिवाइस.

कर्नेल के एक खास सेट वाले कटलफ़िश डिवाइस को चालू करने के लिए आर्टफ़ैक्ट में, cvd start कमांड को टारगेट कर्नेल आर्टफ़ैक्ट के साथ इस तरह चलाएं पैरामीटर का इस्तेमाल करें. नीचे दिए गए उदाहरण कमांड, 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

ज़्यादा जानकारी के लिए, यह देखें कटलफ़िश पर कर्नेल बनाएं.

कर्नेल बिल्ड को पसंद के मुताबिक बनाएं

Kलीफ़ बिल्ड के लिए कर्नेल बिल्ड को पसंद के मुताबिक बनाने के लिए, देखें Kleaf दस्तावेज़.

बिल्ड.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 कर्नेल बिल्ड के लिए बेस आउटपुट डायरेक्ट्री. OUT_DIR=/path/to/my/out
SKIP_DEFCONFIG make defconfig छोड़ें SKIP_DEFCONFIG=1
SKIP_MRPROPER make mrproper छोड़ें SKIP_MRPROPER=1

लोकल बिल्ड के लिए कस्टम कर्नेल कॉन्फ़िगरेशन

Android 14 और उसके बाद के वर्शन में, defconfig फ़्रैगमेंट का इस्तेमाल किया जा सकता है का इस्तेमाल करके, कर्नेल कॉन्फ़िगरेशन को पसंद के मुताबिक बनाया जा सकता है. देखें defconfig फ़्रैगमेंट पर Kleaf दस्तावेज़.

स्थानीय बिल्ड के लिए बिल्ड कॉन्फ़िगरेशन (लेगसी) के साथ पसंद के मुताबिक कर्नेल कॉन्फ़िगरेशन

Android 13 और उससे पहले के वर्शन में, यहां दिया गया तरीका देखें.

अगर आपको कर्नेल कॉन्फ़िगरेशन विकल्प को नियमित रूप से स्विच करने की ज़रूरत पड़ती है, तो उदाहरण के लिए, या आपको डेवलपमेंट के लिए सेट किए जाने का विकल्प चाहिए, तो का पालन किया है, तो आप अपने स्थानीय स्तर पर बिल्ड कॉन्फ़िगरेशन में बदलाव किया जा सकता है या उसकी कॉपी बनाई जा सकती है.

चर POST_DEFCONFIG_CMDS को ऐसे कथन पर सेट करें जो सामान्य make defconfig चरण के ठीक बाद मूल्यांकन होगा हो गया. क्योंकि build.config फ़ाइलों का इस्तेमाल बिल्ड में किया जाता है एनवायरमेंट के हिसाब से, build.config में बताए गए फ़ंक्शन को का इस्तेमाल किया जा सकता है.

इसका एक सामान्य उदाहरण क्रॉसहैच के लिए लिंक टाइम ऑप्टिमाइज़ेशन (एलटीओ) को बंद करना है कर्नेल के तौर पर जोड़ा गया है. एलटीओ, रिलीज़ किए गए कर्नेल के लिए फ़ायदेमंद है. बिल्ड के समय ओवरहेड अहम हो सकता है. यह स्निपेट जोड़ा गया को लोकल build.config में सेट करने से, एलटीओ लगातार बंद हो जाता है. ऐसा तब होता है, जब 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 ट्री से मिला Kernel वर्शन

एओएसपी ट्री में पहले से बने कर्नेल वर्शन होते हैं. द गिट लॉग में तय किए गए मैसेज के हिस्से के तौर पर सही वर्शन दिखता है:

cd $AOSP/device/VENDOR/NAME
git log --max-count=1

अगर git लॉग में कर्नेल वर्शन शामिल नहीं है, तो इसे सिस्टम से पाएं जैसा कि नीचे बताया गया है.

सिस्टम इमेज से Kernel वर्शन

सिस्टम इमेज में इस्तेमाल किए गए kernel वर्शन का पता लगाने के लिए, नीचे दिया गया तरीका अपनाएं आदेश:

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 -- --dist_dir=$DIST_DIR

build/build.sh (लेगसी) की मदद से, जीकेआई बूट इमेज बनाने के लिए इनका इस्तेमाल किया जा सकता है:

BUILD_CONFIG=common/build.config.gki.aarch64 build/build.sh

जीकेआई की बूट इमेज $DIST_DIR में मौजूद है.

बिना init_boot (लेगसी) वाले डिवाइसों के लिए बूट इमेज बनाएं

बिना डिवाइस वाले डिवाइसों के लिए init_boot विभाजन, आपको एक रैमडिस्क बाइनरी की ज़रूरत है, जिसे आप जीकेआई बूट इमेज डाउनलोड करना और उसे अनपैक करना. इस ऐप्लिकेशन से जुड़ी Android रिलीज़ से ली गई, GKI (जीकेआई) की कोई भी बूट इमेज काम करेगी.

tools/mkbootimg/unpack_bootimg.py --boot_img=boot-5.4-gz.img
mv $KERNEL_ROOT/out/ramdisk gki-ramdisk.lz4

टारगेट फ़ोल्डर, कर्नेल ट्री (मौजूदा) की टॉप-लेवल की डायरेक्ट्री है जॉबिंग डायरेक्ट्री).

अगर आपको एओएसपी मुख्य के साथ डेवलप किया जा रहा है, तो आपके पास ramdisk-recovery.img में aosp_arm64 बिल्ड से आर्टफ़ैक्ट बनाया गया है ci.android.com पर जाकर, उसे अपने रैम डिस्क बाइनरी के तौर पर इस्तेमाल करें.

जब आपके पास 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 पर मौजूद है.