यह पृष्ठ 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 नामों को सूचीबद्ध करती है।
उपकरण | एओएसपी पेड़ में बाइनरी पथ | रेपो शाखाएं |
---|---|---|
पिक्सेल 7 (पैंथर) पिक्सेल 7 प्रो (चीता) | डिवाइस/गूगल/पैंटाह-कर्नेल | android-gs-pantah-5.10-android13-qpr1 |
पिक्सेल 6a (ब्लूजय) | डिवाइस/गूगल/ब्लूजे-कर्नेल | android-gs-bluejay-5.10-android13-qpr1 |
पिक्सेल 6 (ओरियोल) पिक्सेल 6 प्रो (रेवेन) | डिवाइस/गूगल/रैवियोल-कर्नेल | android-gs-raviole-5.10-android13-qpr1 |
पिक्सेल 5a (बारबेट) पिक्सेल 5 (रेडफिन) Pixel 4a (5G) (ब्रैम्बल) | डिवाइस/गूगल/रेडबुल-कर्नेल | android-msm-redbull-4.19-android13-qpr1 |
पिक्सेल 4a (सनफ़िश) | डिवाइस/गूगल/सनफिश-कर्नेल | android-msm-sunfish-4.14-android13-qpr1 |
पिक्सेल 4 (लौ) पिक्सेल 4 एक्सएल (कोरल) | डिवाइस/गूगल/कोरल-कर्नेल | एंड्रॉइड-एमएसएम-कोरल-4.14-android13 |
पिक्सेल 3ए (सार्गो) पिक्सेल 3ए एक्सएल (बोनिटो) | डिवाइस/गूगल/बोनिटो-कर्नेल | android-msm-bonito-4.9-android12L |
पिक्सेल 3 (ब्लूलाइन) पिक्सेल 3 एक्सएल (क्रॉसहैच) | डिवाइस/गूगल/क्रॉसहैच-कर्नेल | एंड्रॉइड-एमएसएम-क्रॉसहैच-4.9-एंड्रॉइड12 |
पिक्सेल 2 (बटुए) पिक्सेल 2 एक्सएल (टैमेन) | डिवाइस/गूगल/वाहू-कर्नेल | android-msm-wahoo-4.4-android10-qpr3 |
पिक्सेल (सेलफ़िश) पिक्सेल एक्सएल (मार्लिन) | डिवाइस/गूगल/मार्लिन-कर्नेल | android-msm-marlin-3.18-pie-qpr2 |
हिकी960 | डिवाइस/लिनारो/हाइकी-कर्नेल | हाइकी-लिनारो-एंड्रॉइड-4.14 हाइकी-लिनारो-एंड्रॉइड-4.19 आम-android12-5.4 आम-android13-5.10 |
बीगल x15 | डिवाइस/टीआई/बीगल_x15-कर्नेल | ओमैप-बीगल-x15-एंड्रॉइड-4.14 ओमैप-बीगल-x15-एंड्रॉइड-4.19 |
एंड्रॉइड कॉमन कर्नेल | लागू नहीं | आम-एंड्रॉयड-4.4 आम-एंड्रॉयड-4.9 आम-एंड्रॉयड-4.14 आम-एंड्रॉयड-4.19 सामान्य-एंड्रॉइड-4.19-स्थिर आम-android11-5.4 आम-android12-5.4 आम-android12-5.10 आम-android13-5.10 आम-android13-5.15 आम-android14-5.15 आम-android14-6.1 आम-एंड्रॉयड-मेनलाइन |
कर्नेल का निर्माण
फिर इसके साथ कर्नेल बनाएं:
build/build.sh
कर्नेल बाइनरी, मॉड्यूल, और संबंधित छवि out/ BRANCH /dist
निर्देशिका में स्थित हैं।
बज़ेल (क्लीफ) के साथ भवन
Android 13 ने build/build.sh
की जगह Bazel के साथ बिल्डिंग कर्नेल पेश किया।
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 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
एंड्रॉइड 12 में कटलफिश और गोल्डफिश अभिसरण करते हैं, इसलिए वे एक ही कर्नेल साझा करते हैं: virtual_device
। उस कर्नेल के मॉड्यूल को बनाने के लिए, इस बिल्ड कॉन्फ़िगरेशन का उपयोग करें:
BUILD_CONFIG=common-modules/virtual-device/build.config.virtual_device.x86_64 build/build.sh
Android 13 ने Build.sh की जगह Bazel ( 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
Bazel के साथ Android गुठली बनाने के बारे में अधिक विवरण के लिए, देखें। क्लीफ - बाजेल के साथ एंड्रॉइड गुठली बनाना ।
अलग-अलग आर्किटेक्चर के लिए क्लीफ सपोर्ट के विवरण के लिए, उपकरणों और गुठली के लिए क्लीफ सपोर्ट देखें।
उपकरणों और गुठली के लिए क्लीफ समर्थन
निम्न तालिका व्यक्तिगत डिवाइस गुठली के लिए क्लीफ़ समर्थन को सूचीबद्ध करती है। असूचीबद्ध उपकरणों के लिए, कृपया उपकरण निर्माता से संपर्क करें।
उपकरण | रेपो शाखाएं | कलीफ समर्थन | build/build.sh सपोर्ट |
---|---|---|---|
एंड्रॉइड कॉमन कर्नेल db845c वर्चुअल डिवाइस (x86_64, arm64) वर्चुअल डिवाइस (i686, आर्म) रॉकपी4 | आम-एंड्रॉयड-4.4 आम-एंड्रॉयड-4.9 आम-एंड्रॉयड-4.14 आम-एंड्रॉयड-4.19 सामान्य-एंड्रॉइड-4.19-स्थिर आम-android11-5.4 आम-android12-5.4 आम-android12-5.10 | ❌ | ✅ |
एंड्रॉइड कॉमन कर्नेल | आम-android13-5.10 आम-android13-5.15 | ✅ | ✅ (आधिकारिक) 1 |
एंड्रॉइड कॉमन कर्नेल | आम-android14-5.15 आम-android14-6.1 आम-एंड्रॉयड-मेनलाइन | ✅ | ❌ |
db845c | आम-android13-5.10 | ❌ | ✅ |
db845c | आम-android13-5.15 | ✅ | ✅ (आधिकारिक) 1 |
db845c | आम-android14-5.15 आम-android14-6.1 आम-एंड्रॉयड-मेनलाइन | ✅ | ❌ |
वर्चुअल डिवाइस (x86_64, arm64) | आम-android13-5.10 आम-android13-5.15 | ✅ (आधिकारिक) 1 | ⚠️ (अव्यवस्थित) 2 |
वर्चुअल डिवाइस (x86_64, arm64) | आम-android14-5.15 आम-android14-6.1 आम-एंड्रॉयड-मेनलाइन | ✅ | ❌ |
वर्चुअल डिवाइस (i686, आर्म) | आम-android13-5.10 आम-android13-5.15 | ❌ | ✅ |
वर्चुअल डिवाइस (i686, आर्म) | आम-android14-5.15 आम-android14-6.1 आम-एंड्रॉयड-मेनलाइन | ✅ | ❌ |
रॉकपी4 | आम-android13-5.10 आम-android13-5.15 | ❌ | ✅ |
रॉकपी4 | आम-android14-5.15 आम-android14-6.1 आम-एंड्रॉयड-मेनलाइन | ✅ | ❌ |
हिकी960 | हाइकी-लिनारो-एंड्रॉइड-4.14 हाइकी-लिनारो-एंड्रॉइड-4.19 आम-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
को 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
इस पद्धति का उपयोग करते हुए, कर्नेल वास्तव में फ्लैश नहीं होता है, और रिबूट के दौरान नहीं रहेगा।
कर्नेल बिल्ड को अनुकूलित करना
क्लीफ़ बिल्ड के लिए कर्नेल बिल्ड को अनुकूलित करने के लिए, क्लीफ़ दस्तावेज़ीकरण देखें।
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 |
स्थानीय बिल्ड के लिए कस्टम कर्नेल कॉन्फ़िग
यदि आपको कर्नेल कॉन्फ़िगरेशन विकल्प को नियमित रूप से स्विच करने की आवश्यकता है, उदाहरण के लिए, किसी सुविधा पर काम करते समय, या यदि आपको विकास उद्देश्यों के लिए सेट करने के लिए एक विकल्प की आवश्यकता है, तो आप उस लचीलेपन को स्थानीय संशोधन या बिल्ड कॉन्फ़िगरेशन की प्रतिलिपि बनाकर प्राप्त कर सकते हैं।
वेरिएबल POST_DEFCONFIG_CMDS को एक स्टेटमेंट पर सेट करें जिसका मूल्यांकन सामान्य make defconfig
चरण के ठीक बाद किया जाता है। जैसा कि build.config
फ़ाइलें बिल्ड वातावरण में स्रोत हैं, build.config
में परिभाषित फ़ंक्शंस को पोस्ट-defconfig कमांड के भाग के रूप में कहा जा सकता है।
एक सामान्य उदाहरण विकास के दौरान क्रॉसहैच कर्नेल के लिए लिंक टाइम ऑप्टिमाइज़ेशन (LTO) को अक्षम करना है। जबकि एलटीओ जारी की गई गुठली के लिए फायदेमंद है, निर्माण के समय ओवरहेड महत्वपूर्ण हो सकता है। स्थानीय 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 ट्री और सिस्टम इमेज।
AOSP ट्री से कर्नेल संस्करण
AOSP ट्री में पूर्वनिर्मित कर्नेल संस्करण होते हैं। गिट लॉग प्रतिबद्ध संदेश के हिस्से के रूप में सही संस्करण का खुलासा करता है:
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 बूट छवि को डाउनलोड करके और इसे अनपैक करके प्राप्त कर सकते हैं। संबद्ध Android रिलीज़ से कोई भी GKI बूट छवि काम करेगी।
tools/mkbootimg/unpack_bootimg.py --boot_img=boot-5.4-gz.img
mv $KERNEL_ROOT/out/ramdisk gki-ramdisk.lz4
लक्ष्य फ़ोल्डर कर्नेल ट्री (वर्तमान कार्यशील निर्देशिका) की शीर्ष-स्तरीय निर्देशिका है।
यदि आप AOSP मास्टर के साथ विकास कर रहे हैं, तो आप इसके बजाय ramdisk-recovery.img
बिल्ड आर्टिफैक्ट को ci.android.com पर aosp_arm64 बिल्ड से डाउनलोड कर सकते हैं और इसे अपने रैमडिस्क बाइनरी के रूप में उपयोग कर सकते हैं।
जब आपके पास रैमडिस्क बाइनरी होती है और इसे कर्नेल बिल्ड की रूट डायरेक्टरी में 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
पर अवस्थित है।