बिल्डिंग कर्नेल

यह पृष्ठ Android उपकरणों के लिए कस्टम कर्नेल बनाने की प्रक्रिया का विवरण देता है। ये निर्देश आपको 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 नामों को सूचीबद्ध करती है।

उपकरण AOSP ट्री में बाइनरी पथ रेपो शाखाएं
पिक्सेल 6 (ओरिओल)
पिक्सेल 6 प्रो (रेवेन)
डिवाइस/गूगल/रेविओल-कर्नेल android-gs-raviole-5.10-android12L
पिक्सेल 5a (बारबेट) डिवाइस/गूगल/बारबेट-कर्नेल android-msm-barbet-4.19-android12L
पिक्सेल 5 (रेडफिन)
Pixel 4a (5G) (ब्रम्बल)
डिवाइस/गूगल/रेडबुल-कर्नेल android-msm-redbull-4.19-android12L
पिक्सेल 4a (सनफिश) डिवाइस/गूगल/सनफिश-कर्नेल android-msm-sunfish-4.14-android12L
पिक्सेल 4 (लौ)
पिक्सेल 4 एक्सएल (कोरल)
डिवाइस/गूगल/कोरल-कर्नेल android-msm-coral-4.14-android12L
पिक्सेल 3ए (सरगो)
पिक्सेल 3ए एक्सएल (बोनिटो)
डिवाइस/गूगल/बोनिटो-कर्नेल android-msm-bonito-4.9-android12L
पिक्सेल 3 (ब्लूलाइन)
पिक्सेल 3 एक्सएल (क्रॉसहैच)
डिवाइस/गूगल/क्रॉसहैच-कर्नेल android-msm-crosshatch-4.9-android12
पिक्सेल 2 (वॉली)
पिक्सेल 2 एक्सएल (ताइमेन)
डिवाइस/गूगल/वाहू-कर्नेल android-msm-wahoo-4.4-android10-qpr3
पिक्सेल (सेलफिश)
पिक्सेल एक्सएल (मर्लिन)
डिवाइस/गूगल/मार्लिन-कर्नेल android-msm-marlin-3.18-पाई-qpr2
हाइकी960 डिवाइस/लिनारो/हाइकी-कर्नेल हाइकी-लिनारो-एंड्रॉइड-4.14
हाइकी-लिनारो-एंड्रॉइड-4.19
आम-एंड्रॉइड12-5.4
बीगल x15 डिवाइस/ती/बीगल_x15-कर्नेल ओमैप-बीगल-x15-एंड्रॉइड-4.14
ओमैप-बीगल-x15-एंड्रॉइड-4.19
एंड्रॉइड कॉमन कर्नेल एन/ए आम-एंड्रॉइड-4.4
आम-एंड्रॉइड-4.9
आम-एंड्रॉइड-4.14
आम-एंड्रॉइड-4.1 9
आम-एंड्रॉइड-4.19-स्थिर
आम-एंड्रॉइड11-5.4
आम-एंड्रॉइड12-5.4
आम-एंड्रॉइड12-5.10
आम-एंड्रॉइड-मेनलाइन

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

फिर इसके साथ कर्नेल बनाएं:

build/build.sh

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

GKI मॉड्यूल का निर्माण

Android 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

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

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

कर्नेल चलाना

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

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

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

बूट छवि बनाने और बूट करने की प्रक्रिया को सुव्यवस्थित करने के लिए अधिकांश हाल के उपकरणों में बूटलोडर एक्सटेंशन होता है।

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

adb reboot bootloader
fastboot boot Image.lz4-dtb

इस पद्धति का उपयोग करते हुए, कर्नेल वास्तव में फ्लैश नहीं होता है, और रिबूट के दौरान जारी नहीं रहेगा।

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

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

स्थानीय बिल्ड के लिए कस्टम कर्नेल कॉन्फ़िगरेशन

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

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

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

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 ट्री में पूर्वनिर्मित कर्नेल संस्करण होते हैं। गिट लॉग प्रतिबद्ध संदेश के हिस्से के रूप में सही संस्करण दिखाता है:

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

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

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

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

file kernel

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

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

बूट इमेज बनाना

कर्नेल बिल्ड वातावरण का उपयोग करके बूट छवि बनाना संभव है। ऐसा करने के लिए आपको एक रैमडिस्क बाइनरी की आवश्यकता होती है, जिसे आप GKI बूट छवि को डाउनलोड करके और इसे अनपैक करके प्राप्त कर सकते हैं। संबद्ध Android रिलीज़ से कोई भी GKI बूट छवि काम करेगी।

tools/mkbootimg/unpack_bootimg.py --boot_img=boot-5.4-gz.img
mv tools/mkbootimg/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 पर स्थित होती है।