कर्नेल विन्यास

एंड्रॉइड कर्नेल कॉन्फ़िगरेशन के लिए आधार के रूप में निम्नलिखित कॉन्फ़िगरेशन सेटिंग्स का उपयोग करें। android-base , android-base- ARCH , और android-recommended के लिए सेटिंग्स को .cfg फ़ाइलों में व्यवस्थित किया गया है:

  • android-base विकल्प मुख्य एंड्रॉइड सुविधाओं को सक्षम करते हैं और सभी उपकरणों द्वारा निर्दिष्ट अनुसार कॉन्फ़िगर किया जाना चाहिए।
  • android-base- ARCH विकल्प कोर एंड्रॉइड सुविधाओं को सक्षम करते हैं और आर्किटेक्चर ARCH के सभी उपकरणों द्वारा निर्दिष्ट अनुसार कॉन्फ़िगर किया जाना चाहिए। सभी आर्किटेक्चर में आर्किटेक्चर-विशिष्ट आवश्यक विकल्पों की संबंधित फ़ाइल नहीं होती है। यदि आपके आर्किटेक्चर में कोई फ़ाइल नहीं है, तो इसमें Android के लिए अतिरिक्त आर्किटेक्चर-विशिष्ट कर्नेल कॉन्फ़िगरेशन आवश्यकताएँ नहीं हैं।
  • android-recommended । ये विकल्प उन्नत एंड्रॉइड सुविधाओं को सक्षम करते हैं और उपकरणों के लिए वैकल्पिक हैं।

ये कॉन्फ़िगरेशन फ़ाइलें kernel/configs रेपो में स्थित हैं। कॉन्फ़िगरेशन फ़ाइलों के उस सेट का उपयोग करें जो आपके द्वारा उपयोग किए जा रहे कर्नेल के संस्करण से मेल खाता हो।

आपके डिवाइस पर कर्नेल को मजबूत करने के लिए पहले से किए गए नियंत्रणों के विवरण के लिए, सिस्टम और कर्नेल सुरक्षा देखें। आवश्यक सेटिंग्स के विवरण के लिए, एंड्रॉइड संगतता परिभाषा दस्तावेज़ (सीडीडी) देखें।

कर्नेल कॉन्फ़िगरेशन जनरेट करें

उन उपकरणों के लिए जिनके पास न्यूनतम defconfig प्रारूप है, विकल्पों को सक्षम करने के लिए कर्नेल ट्री में merge_config.sh स्क्रिप्ट का उपयोग करें:

ARCH=ARCH scripts/kconfig/merge_config.sh <...>/device_defconfig <...>/android-base.cfg <...>/android-base-ARCH.cfg <...>/android-recommended.cfg

यह एक .config फ़ाइल उत्पन्न करता है जिसका उपयोग आप एक नई defconfig फ़ाइल को सहेजने या सक्षम Android सुविधाओं के साथ एक नया कर्नेल संकलित करने के लिए कर सकते हैं।

अतिरिक्त कर्नेल कॉन्फ़िगरेशन आवश्यकताएँ

कुछ मामलों में, प्लेटफ़ॉर्म अनुरक्षक एंड्रॉइड निर्भरता को संतुष्ट करने के लिए कई कर्नेल सुविधाओं में से चुन सकता है। ऐसी निर्भरताएँ कर्नेल कॉन्फ़िगरेशन फ़्रैगमेंट फ़ाइलों (ऊपर वर्णित) में व्यक्त नहीं की जा सकतीं क्योंकि उन फ़ाइलों का प्रारूप तार्किक अभिव्यक्तियों का समर्थन नहीं करता है। एंड्रॉइड 9 और उच्चतर में, संगतता परीक्षण सूट (सीटीएस) और विक्रेता परीक्षण सूट (वीटीएस) सत्यापित करते हैं कि निम्नलिखित आवश्यकताएं पूरी होती हैं:

  • CONFIG_OF=y या CONFIG_ACPI=y
  • 4.4 और 4.9 कर्नेल में CONFIG_ANDROID_LOW_MEMORY_KILLER=y है या CONFIG_MEMCG=y और CONFIG_MEMCG_SWAP=y दोनों हैं
  • CONFIG_DEBUG_RODATA=y या CONFIG_STRICT_KERNEL_RWX=y
  • CONFIG_DEBUG_SET_MODULE_RONX=y या CONFIG_STRICT_MODULE_RWX=y
  • केवल ARM64 के लिए: CONFIG_ARM64_SW_TTBR0_PAN=y या CONFIG_ARM64_PAN=y

इसके अलावा, एंड्रॉइड 9 और उच्चतर में 4.9 कर्नेल के लिए CONFIG_INET_UDP_DIAG विकल्प को y पर सेट किया जाना चाहिए।

USB होस्ट मोड विकल्प सक्षम करें

USB होस्ट मोड ऑडियो के लिए, निम्नलिखित विकल्प सक्षम करें:

CONFIG_SND_USB=y
CONFIG_SND_USB_AUDIO=y
# CONFIG_USB_AUDIO is for a peripheral mode (gadget) driver

USB होस्ट मोड MIDI के लिए, निम्नलिखित विकल्प सक्षम करें:

CONFIG_SND_USB_MIDI=y

TSYNC के साथ Seccomp BPF

सिक्योर कंप्यूटिंग बर्कले पैकेट फ़िल्टर (सेककॉम्प बीपीएफ) एक कर्नेल सुरक्षा तकनीक है जो सैंडबॉक्स के निर्माण को सक्षम बनाती है जो उस संदर्भ को परिभाषित करती है जिसमें एक प्रक्रिया सिस्टम कॉल कर सकती है। थ्रेड सिंक्रोनाइज़ेशन (TSYNC) सुविधा मल्टीथ्रेडेड प्रोग्राम से Seccomp BPF के उपयोग को सक्षम बनाती है। यह क्षमता उन आर्किटेक्चर तक सीमित है जिनके पास Seccomp समर्थन अपस्ट्रीम (ARM, ARM64, x86, और x86_64) है।

एंड्रॉइड लाइव-लॉक डेमॉन

एंड्रॉइड 10 में एंड्रॉइड लाइव-लॉक डेमॉन ( llkd ) शामिल है, जिसे कर्नेल गतिरोध को पकड़ने और कम करने के लिए डिज़ाइन किया गया है। llkd का उपयोग करने के विवरण के लिए, एंड्रॉइड लाइव-लॉक डेमॉन देखें।

ARM64 पर vDSO32

वर्चुअल डायनेमिक शेयर्ड ऑब्जेक्ट (vDSO) सिस्टम कॉल का एक विकल्प है, जिसका उपयोग और सही ढंग से कॉन्फ़िगर किए जाने पर, चक्र लागत को कम किया जा सकता है। एंड्रॉइड 10 64-बिट कर्नेल पर vDSO32 के लिए समर्थन जोड़ता है (एंड्रॉइड पहले से ही 64-बिट कर्नेल पर vDSO64 और 32-बिट कर्नेल पर vDSO32 का समर्थन करता है)। ARM64 आर्किटेक्चर पर vDSO32 ( CONFIG_VDSO_COMPAT ) का उपयोग करने से बैटरी जीवन और अन्य प्रदर्शन सुधारों में 0.4 प्रतिशत की वृद्धि होती है।

लिनक्स समुदाय सक्रिय रूप से सभी आर्किटेक्चर में वीडीएसओ को एकीकृत करने पर काम कर रहा है। आप CONFIG_COMPAT के साथ vDSO32 और आर्म32 कंपाइलर ट्रिपलेट के साथ CONFIG_CROSS_COMPILE_COMPAT_VDSO को सक्षम करके अपने लिनक्स कर्नेल में vDSO सेट कर सकते हैं। Android कर्नेल टीम ने vDSO पैच श्रृंखला के पुराने संस्करणों को पिक्सेल उपकरणों में बैकपोर्ट किया है, ताकि आप पिक्सेल कर्नेल बिल्ड ( LINUX_FCC_CROSS_COMPILE_ARM32_PREBUILTS_BIN पथ, CROSS_COMPILE_ARM32 संदर्भ, और CONFIG_CROSS_COMPILE_ARM32 कॉन्फ़िगरेशन) में उदाहरण पा सकें।

कम रैम कॉन्फ़िगरेशन

प्रत्यक्ष पुनर्प्राप्ति को कम करने के लिए कर्नेल/एक्टिविटी मैनेजर को ट्यून करें

डायरेक्ट रिक्लेम तब होता है जब कोई प्रक्रिया या कर्नेल मेमोरी के एक पेज को आवंटित करने की कोशिश करता है (या तो सीधे या किसी नए पेज में खराबी के कारण) और कर्नेल ने सभी उपलब्ध मुफ्त मेमोरी का उपयोग किया है। इसके लिए कर्नेल को आवंटन को अवरुद्ध करने की आवश्यकता होती है जबकि यह एक पृष्ठ को मुक्त करता है। इसके बदले में अक्सर गंदे फ़ाइल-समर्थित पृष्ठ को बाहर निकालने के लिए डिस्क I/O की आवश्यकता होती है या किसी प्रक्रिया को रोकने के लिए lowmemorykiller प्रतीक्षा करनी पड़ती है। इसके परिणामस्वरूप यूआई थ्रेड सहित किसी भी थ्रेड में अतिरिक्त I/O हो सकता है।

प्रत्यक्ष पुनः दावा से बचने के लिए, कर्नेल में वॉटरमार्क होते हैं जो kswapd या पृष्ठभूमि पुनः दावा को ट्रिगर करते हैं। यह एक थ्रेड है जो पृष्ठों को मुक्त करने का प्रयास करता है ताकि अगली बार जब कोई वास्तविक थ्रेड आवंटित हो, तो यह जल्दी से सफल हो सके।

पृष्ठभूमि पुनर्प्राप्ति को ट्रिगर करने की डिफ़ॉल्ट सीमा काफी कम है, 2 जीबी डिवाइस पर लगभग 2 एमबी और 512 एमबी डिवाइस पर 636 केबी। कर्नेल पृष्ठभूमि पुनर्प्राप्ति में केवल कुछ मेगाबाइट मेमोरी पुनः प्राप्त करता है। इसका मतलब यह है कि कोई भी प्रक्रिया जो कुछ मेगाबाइट से अधिक तेजी से आवंटित करती है, वह तुरंत सीधे पुनः प्राप्त करने में सक्षम होगी।

कर्नेल ट्यून करने योग्य के लिए समर्थन Android-3.4 कर्नेल शाखा में पैच 92189d47f66c67e5fd92eafaa287e153197a454f ("अतिरिक्त मुफ़्त kbytes ट्यून करने योग्य जोड़ें") के रूप में जोड़ा गया है। इस पैच को डिवाइस के कर्नेल में चेरी-पिक करने से ActivityManager कर्नेल को तीन पूर्ण-स्क्रीन 32 बीपीपी बफ़र्स मेमोरी को मुक्त रखने का प्रयास करने के लिए कह सकता है।

इन थ्रेशोल्ड को config.xml फ्रेमवर्क के साथ कॉन्फ़िगर किया जा सकता है।

<!-- Device configuration setting the /proc/sys/vm/extra_free_kbytes tunable
in the kernel (if it exists). A high value will increase the amount of memory
that the kernel tries to keep free, reducing allocation time and causing the
lowmemorykiller to kill earlier. A low value allows more memory to be used by
processes but may cause more allocations to block waiting on disk I/O or
lowmemorykiller. Overrides the default value chosen by ActivityManager based
on screen size. 0 prevents keeping any extra memory over what the kernel keeps
by default. -1 keeps the default. -->
<integer name="config_extraFreeKbytesAbsolute">-1</integer>
<!-- Device configuration adjusting the /proc/sys/vm/extra_free_kbytes
tunable in the kernel (if it exists). 0 uses the default value chosen by
ActivityManager. A positive value will increase the amount of memory that the
kernel tries to keep free, reducing allocation time and causing the
lowmemorykiller to kill earlier. A negative value allows more memory to be
used by processes but may cause more allocations to block waiting on disk I/O
or lowmemorykiller. Directly added to the default value chosen by
ActivityManager based on screen size. -->
<integer name="config_extraFreeKbytesAdjust">0</integer>

लोमेमोरीकिलर को ट्यून करें

ActivityManager प्रत्येक प्राथमिकता स्तर बकेट में प्रक्रियाओं को चलाने के लिए आवश्यक फ़ाइल-समर्थित पेजों (कैश्ड पेज) के कामकाजी सेट की अपेक्षा से मेल खाने के लिए LowMemoryKiller की सीमा को कॉन्फ़िगर करता है। यदि किसी डिवाइस में कार्यशील सेट के लिए उच्च आवश्यकताएं हैं, उदाहरण के लिए यदि विक्रेता यूआई को अधिक मेमोरी की आवश्यकता है या यदि अधिक सेवाएं जोड़ी गई हैं, तो सीमाएँ बढ़ाई जा सकती हैं।

यदि फ़ाइल-समर्थित पृष्ठों के लिए बहुत अधिक मेमोरी आरक्षित की जा रही है, तो थ्रेसहोल्ड को कम किया जा सकता है, ताकि कैश बहुत छोटा होने के कारण डिस्क थ्रैशिंग होने से बहुत पहले पृष्ठभूमि प्रक्रियाएं समाप्त हो जाएं।

<!-- Device configuration setting the minfree tunable in the lowmemorykiller
in the kernel. A high value will cause the lowmemorykiller to fire earlier,
keeping more memory in the file cache and preventing I/O thrashing, but
allowing fewer processes to stay in memory. A low value will keep more
processes in memory but may cause thrashing if set too low. Overrides the
default value chosen by ActivityManager based on screen size and total memory
for the largest lowmemorykiller bucket, and scaled proportionally to the
smaller buckets. -1 keeps the default. -->
<integer name="config_lowMemoryKillerMinFreeKbytesAbsolute">-1</integer>
<!-- Device configuration adjusting the minfree tunable in the
lowmemorykiller in the kernel. A high value will cause the lowmemorykiller to
fire earlier, keeping more memory in the file cache and preventing I/O
thrashing, but allowing fewer processes to stay in memory. A low value will
keep more processes in memory but may cause thrashing if set too low. Directly
added to the default value chosen by ActivityManager based on screen
size and total memory for the largest lowmemorykiller bucket, and scaled
proportionally to the smaller buckets. 0 keeps the default. -->
<integer name="config_lowMemoryKillerMinFreeKbytesAdjust">0</integer>