गुठली का निर्माण

यह पृष्ठ Android उपकरणों के लिए कस्टम कर्नेल बनाने की प्रक्रिया का विवरण देता है। ये निर्देश आपको सही स्रोतों का चयन करने, कर्नेल का निर्माण करने और परिणामों को एंड्रॉइड ओपन सोर्स प्रोजेक्ट (एओएसपी) से निर्मित सिस्टम छवि में एम्बेड करने की प्रक्रिया में मार्गदर्शन करते हैं।

आप रेपो का उपयोग करके नवीनतम कर्नेल स्रोत प्राप्त कर सकते हैं; अपने स्रोत चेकआउट के रूट से build/build.sh चलाकर बिना किसी अतिरिक्त कॉन्फ़िगरेशन के उन्हें बनाएं।

स्रोत डाउनलोड करना और टूल बनाना

हाल के कर्नेल के लिए, स्रोतों, टूलचेन को डाउनलोड करने और स्क्रिप्ट बनाने के लिए repo उपयोग करें। कुछ कर्नेल (उदाहरण के लिए, पिक्सेल 3 कर्नेल) को एकाधिक गिट रिपॉजिटरी से स्रोतों की आवश्यकता होती है, जबकि अन्य (उदाहरण के लिए, सामान्य कर्नेल) को केवल एक ही स्रोत की आवश्यकता होती है। repo दृष्टिकोण का उपयोग एक सही स्रोत निर्देशिका सेटअप सुनिश्चित करता है।

उपयुक्त शाखा के लिए स्रोत डाउनलोड करें:

mkdir android-kernel && cd android-kernel
repo init -u https://android.googlesource.com/kernel/manifest -b BRANCH
repo sync

रेपो शाखाओं ( BRANCH ) की सूची के लिए जिसका उपयोग पिछले `रेपो इनिट` कमांड के साथ किया जा सकता है, कर्नेल शाखाएं और उनके बिल्ड सिस्टम देखें।

पिक्सेल उपकरणों के लिए कर्नेल डाउनलोड करने और संकलित करने के विवरण के लिए, पिक्सेल कर्नेल बनाना देखें।

कर्नेल का निर्माण

बाज़ेल (क्लीफ) के साथ बिल्डिंग

एंड्रॉइड 13 ने बेज़ेल के साथ बिल्डिंग कर्नेल पेश किया।

Aarch64 आर्किटेक्चर के लिए GKI कर्नेल बनाने के लिए, Android 13 से पहले की Android कॉमन कर्नेल शाखा की जाँच करें और फिर निम्न कमांड चलाएँ:

tools/bazel build //common:kernel_aarch64_dist

वितरण बनाने के लिए, चलाएँ:

tools/bazel run //common:kernel_aarch64_dist -- --dist_dir=$DIST_DIR

इसके बाद कर्नेल बाइनरी, मॉड्यूल और संबंधित छवियां $DIST_DIR निर्देशिका में स्थित होती हैं। यदि --dist_dir अनिर्दिष्ट है, तो कलाकृतियों के स्थान के लिए कमांड का आउटपुट देखें। विवरण के लिए, AOSP पर दस्तावेज़ देखें।

बिल्ड.श (विरासत) के साथ बिल्डिंग

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

build/build.sh

कर्नेल बाइनरी, मॉड्यूल और संबंधित छवि out/ BRANCH /dist डायरेक्टरी में स्थित हैं।

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

एंड्रॉइड 13 ने 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

बेज़ेल के साथ एंड्रॉइड कर्नेल बनाने के बारे में अधिक जानकारी के लिए देखें। क्लीफ़ - बेज़ेल के साथ एंड्रॉइड कर्नेल का निर्माण

व्यक्तिगत आर्किटेक्चर के लिए क्लीफ़ समर्थन के विवरण के लिए, डिवाइस और कर्नेल के लिए क्लीफ़ समर्थन देखें।

बिल्ड.श (विरासत) के साथ वर्चुअल डिवाइस के लिए विक्रेता मॉड्यूल का निर्माण

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

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

एंड्रॉइड 11 ने GKI पेश किया, जो कर्नेल को 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

कर्नेल चलाना

कस्टम-निर्मित कर्नेल को चलाने के कई तरीके हैं। विभिन्न विकास परिदृश्यों के लिए उपयुक्त निम्नलिखित ज्ञात तरीके हैं।

एंड्रॉइड छवि निर्माण में एम्बेड करना

Image.lz4-dtb AOSP ट्री के भीतर संबंधित कर्नेल बाइनरी स्थान पर कॉपी करें और बूट छवि का पुनर्निर्माण करें।

वैकल्पिक रूप से, make bootimage (या किसी अन्य make कमांड लाइन जो बूट इमेज बनाता है) का उपयोग करते समय TARGET_PREBUILT_KERNEL वैरिएबल को परिभाषित करें। यह वेरिएबल सभी डिवाइसों द्वारा समर्थित है क्योंकि इसे 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 कर्नेल मेनिफेस्ट से आर्म64 लक्ष्य के लिए कर्नेल कलाकृतियों का उपयोग करता है।

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

अधिक जानकारी के लिए, कटलफिश पर गुठली विकसित करें देखें।

कर्नेल बिल्ड को अनुकूलित करना

क्लीफ़ बिल्ड के लिए कर्नेल बिल्ड को अनुकूलित करने के लिए, क्लीफ़ दस्तावेज़ देखें।

बिल्ड.श (विरासत) के साथ कर्नेल बिल्ड को अनुकूलित करना

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 फ़्रैगमेंट पर क्लीफ़ दस्तावेज़ देखें।

बिल्ड कॉन्फिग के साथ स्थानीय बिल्ड के लिए कस्टम कर्नेल कॉन्फिग (विरासत)

Android 13 और उससे नीचे के संस्करण में, निम्नलिखित देखें।

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

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

एक सामान्य उदाहरण विकास के दौरान क्रॉसहैच कर्नेल के लिए लिंक टाइम ऑप्टिमाइज़ेशन (एलटीओ) को अक्षम करना है। जबकि एलटीओ रिलीज़ किए गए कर्नेल के लिए फायदेमंद है, निर्माण के समय ओवरहेड महत्वपूर्ण हो सकता है। स्थानीय build.config में जोड़ा गया निम्न स्निपेट build/build.sh उपयोग करते समय LTO को लगातार अक्षम करता है।

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

यदि कर्नेल संस्करण गिट लॉग में सूचीबद्ध नहीं है, तो इसे नीचे बताए अनुसार सिस्टम छवि से प्राप्त करें।

सिस्टम छवि से कर्नेल संस्करण

सिस्टम छवि में उपयोग किए गए कर्नेल संस्करण को निर्धारित करने के लिए, कर्नेल फ़ाइल के विरुद्ध निम्नलिखित कमांड चलाएँ:

file kernel

Image.lz4-dtb फ़ाइलों के लिए, चलाएँ:

grep -a 'Linux version' Image.lz4-dtb

एक बूट छवि का निर्माण

कर्नेल बिल्ड वातावरण का उपयोग करके बूट छवि बनाना संभव है।

init_boot के साथ उपकरणों के लिए एक बूट छवि बनाना

init_boot विभाजन वाले उपकरणों के लिए, बूट छवि कर्नेल के साथ बनाई गई है। initramfs छवि बूट छवि में एम्बेडेड नहीं है।

उदाहरण के लिए, क्लीफ़ के साथ, आप 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 विभाजन के बिना उपकरणों के लिए, आपको एक रैमडिस्क बाइनरी की आवश्यकता है, जिसे आप GKI बूट छवि डाउनलोड करके और इसे अनपैक करके प्राप्त कर सकते हैं। संबंधित एंड्रॉइड रिलीज़ से कोई भी GKI बूट छवि काम करेगी।

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

लक्ष्य फ़ोल्डर कर्नेल ट्री (वर्तमान कार्यशील निर्देशिका) की शीर्ष-स्तरीय निर्देशिका है।

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

जब आपके पास रैमडिस्क बाइनरी है और इसे कर्नेल बिल्ड की रूट डायरेक्टरी में 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 पर स्थित है।