यह पेज कस्टम बनाने की प्रक्रिया का विवरण देता है 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
पर मौजूद है.