Kernel कॉन्फ़िगरेशन

Android kernel के कॉन्फ़िगरेशन के आधार के तौर पर, यहां दी गई कॉन्फ़िगरेशन सेटिंग का इस्तेमाल करें. सेटिंग को android-base, android-base-ARCH, और android-recommended के लिए .cfg फ़ाइलों में व्यवस्थित किया जाता है:

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

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

अपने डिवाइसों पर कर्नेल को मज़बूत बनाने के लिए, पहले से इस्तेमाल किए गए कंट्रोल के बारे में जानकारी के लिए, सिस्टम और कर्नेल की सुरक्षा देखें. ज़रूरी सेटिंग के बारे में जानकारी के लिए, Android के साथ काम करने से जुड़ी परिभाषा का दस्तावेज़ (सीडीडी) देखें.

kernel config जनरेट करना

जिन डिवाइसों में कम से कम 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 की सुविधाओं के साथ, नया कोर कंपाइल करने के लिए किया जा सकता है.

कर्नेल कॉन्फ़िगरेशन की अन्य ज़रूरी शर्तें

कुछ मामलों में, प्लैटफ़ॉर्म मैनेजर, Android डिपेंडेंसी को पूरा करने के लिए, कई कर्नेल की सुविधाओं में से किसी एक को चुन सकता है. ऊपर बताई गई, kernel config फ़्रैगमेंट फ़ाइलों में ऐसी डिपेंडेंसी नहीं दिखाई जा सकतीं, क्योंकि उन फ़ाइलों का फ़ॉर्मैट, लॉजिकल एक्सप्रेशन के साथ काम नहीं करता. Android 9 और इसके बाद के वर्शन में, Compatibility Test Suite (CTS) और Vendor Test Suite (VTS) यह पुष्टि करते हैं कि ये ज़रूरी शर्तें पूरी की गई हैं:

  • 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

इसके अलावा, Android 9 और उसके बाद के वर्शन में 4.9 कर्नेल के लिए, CONFIG_INET_UDP_DIAG विकल्प को y पर सेट करना ज़रूरी है.

यूएसबी होस्ट मोड के विकल्प चालू करना

यूएसबी होस्ट मोड के ऑडियो के लिए, ये विकल्प चालू करें:

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

यूएसबी होस्ट मोड एमआईडीआई के लिए, नीचे दिया गया विकल्प चालू करें:

CONFIG_SND_USB_MIDI=y

TSYNC के साथ Seccomp BPF

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

Android लाइव-लॉक डीमन

Android 10 में Android लाइव-लॉक डेमन (llkd) शामिल है. इसे कर्नेल डेडलॉक को ठीक करने और कम करने के लिए डिज़ाइन किया गया है. llkd का इस्तेमाल करने के बारे में जानकारी पाने के लिए, Android लाइव-लॉक डीमन देखें.

ARM64 पर vDSO32

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

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

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

सीधे तौर पर फिर से दावा कम करने के लिए, कर्नेल और ActivityManager को ट्यून करें

सीधे तौर पर मेमोरी वापस पाने की प्रोसेस तब शुरू होती है, जब कोई प्रोसेस या कर्नेल, सीधे तौर पर या किसी नए पेज में गड़बड़ी की वजह से, मेमोरी का कोई पेज ऐलोकेट करने की कोशिश करता है और कर्नेल ने उपलब्ध सभी खाली मेमोरी का इस्तेमाल कर लिया हो. इसके लिए, कर्नेल को पेज खाली करते समय, एलोकेशन को ब्लॉक करना पड़ता है. इसके लिए, अक्सर डिस्क I/O की ज़रूरत होती है, ताकि lowmemorykiller की किसी प्रोसेस को रोका जा सके या फ़ाइल के ज़रिए बैक अप लिए गए किसी पेज को फ़्लश किया जा सके. इसकी वजह से, किसी भी थ्रेड में अतिरिक्त I/O हो सकता है. इसमें यूज़र इंटरफ़ेस (यूआई) थ्रेड भी शामिल है.

सीधे तौर पर दावा करने से बचने के लिए, कर्नेल में ऐसे वॉटरमार्क होते हैं जो kswapd या बैकग्राउंड में दावा करने की सुविधा को ट्रिगर करते हैं. यह एक ऐसा थ्रेड है जो पेजों को खाली करने की कोशिश करता है, ताकि अगली बार कोई असली थ्रेड मिलने पर, वह तेज़ी से काम कर सके.

बैकग्राउंड में फिर से दावा करने की प्रोसेस शुरू करने के लिए, डिफ़ॉल्ट थ्रेशोल्ड बहुत कम होता है. यह थ्रेशोल्ड, 2 जीबी वाले डिवाइस पर दो एमबी और 512 एमबी वाले डिवाइस पर 636 केबी के बराबर होता है. बैकग्राउंड में मेमोरी खाली करने के दौरान, कोर सिर्फ़ कुछ मेगाबाइट मेमोरी खाली करता है. इसका मतलब है कि जो प्रोसेस कुछ मेगाबाइट से ज़्यादा को तुरंत ऐलोकेट करती है उस पर डायरेक्ट रीक्लेम तुरंत लागू हो जाएगा.

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

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

<!-- Device configuration setting the /proc/sys/vm/extra_free_kbytes tunable
in the kernel (if it exists). A high value increases 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 increases 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>

LowMemoryKiller को ट्यून करें

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

अगर फ़ाइल से बैक अप लिए गए पेजों के लिए ज़्यादा मेमोरी रिज़र्व की जा रही है, तो थ्रेशोल्ड कम किए जा सकते हैं. इससे, कैश मेमोरी बहुत कम होने की वजह से डिस्क थ्रैशिंग होने से पहले ही, बैकग्राउंड प्रोसेस बंद हो जाती हैं.

<!-- Device configuration setting the minfree tunable in the lowmemorykiller
in the kernel. A high value causes 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 keeps 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 causes 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
keeps 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>