स्थिरता बनाए रखने के लिए, जिन सिंबल और टाइप को बनाए रखना ज़रूरी है उनकी संख्या कम करने के लिए, GKI कर्नल में एक्सपोर्ट किए गए सिंबल को सिर्फ़ उन सिंबल तक सीमित करने की क्षमता होती है जिनकी ज़रूरत मॉड्यूल को होती है. बाहर से कंपाइल किए गए मॉड्यूल के लिए, आपके पास इस्तेमाल किए गए सिंबल की सूची होनी चाहिए, ताकि GKI कर्नल उन्हें एक्सपोर्ट कर सके. उदाहरण के लिए, Cuttlefish के लिए मॉड्यूल इस्तेमाल किए गए सिंबल, gki/aarch64/symbols/virtual_device
में सेव किए जाते हैं.
सिंबल की सूची जनरेट करने के लिए कोई टारगेट जोड़ना
सिंबल वाली सूचियां, kernel_abi
टारगेट से जनरेट होती हैं. इस टारगेट को डिवाइस BUILD.bazel
में जोड़ें. इसके लिए, ये विकल्प इस्तेमाल करें:
name
यह
<kernel_build>_abi
फ़ॉर्मैट में होना चाहिए.kernel_build
इसमें डिवाइस
kernel_build
टारगेट का नाम होना चाहिए.
इन विकल्पों का भी इस्तेमाल किया जा सकता है:
kernel_modules
आउट-ऑफ़-ट्री मॉड्यूल के टारगेट की सूची. इन-ट्री मॉड्यूल को यहां शामिल नहीं किया जाना चाहिए. सिंबल निकालने के लिए, इन-ट्री मॉड्यूल तैयार करना लेख पढ़ें.
kmi_symbol_list_add_only
इस विकल्प से, इस्तेमाल न किए गए सिंबल को हटाने से रोका जाता है. सिंबल हटाने की अनुमति सिर्फ़ केएमआई स्थिर होने के दौरान कुछ समय के लिए होती है. केएमआई फ़्रीज़ होने के बाद, सिंबल हटाने की अनुमति नहीं होती.
यह सुविधा तब भी काम आती है, जब अलग-अलग डिवाइसों के लिए एक ही सिंबल लिस्ट का इस्तेमाल किया जाता है. इस तरह, डिवाइस A में इस्तेमाल किए गए उन सिंबल को नहीं हटाया जाएगा जो डिवाइस B में इस्तेमाल नहीं किए जाते.
module_grouping
अगर
True
या कोई अन्य विकल्प नहीं चुना जाता है, तो सिंबल की सूची में सिंबल को उन कर्नल मॉड्यूल के आधार पर ग्रुप किया जाता है जो सिंबल को रेफ़रंस करते हैं. इसके अलावा, सिंबल की सूची, सभी कर्नल मॉड्यूल के इस्तेमाल किए गए सिंबल की क्रम से लगाई गई सूची होती है.
उदाहरण के लिए, common-modules/virtual-device/BUILD.bazel
देखें:
kernel_abi(
name = "virtual_device_aarch64_abi",
kernel_build = ":virtual_device_aarch64",
kernel_modules = [":virtual_device_aarch64_external_modules"],
kmi_symbol_list_add_only = True,
)
Kleaf में kernel_abi
टारगेट के बारे में रेफ़रंस दस्तावेज़ भी देखें.
सिंबल निकालने के लिए, इन-ट्री मॉड्यूल तैयार करना
सिंबल निकालने के लिए, इन-ट्री मॉड्यूल तैयार करने के लिए, kernel_build
टारगेट के module_outs
एट्रिब्यूट में, वेंडर के हिसाब से इन-ट्री मॉड्यूल की सूची बनाएं. उदाहरण के लिए, _VIRT_COMMON_MODULES
और इसके इस्तेमाल का तरीका देखें. इस सूची में GKI मॉड्यूल शामिल न करें.
इन मॉड्यूल को unsigned के तौर पर कॉन्फ़िगर करें. ऐसा न करने पर, सिंबल की सूची खाली हो सकती है. इसके लिए, अपने कर्नल कॉन्फ़िगरेशन फ़्रैगमेंट में यह लाइन जोड़ें:
# CONFIG_MODULE_SIG_ALL is not set
उदाहरण के लिए, common-modules/virtual-device/virtual_device_core.fragment
देखें.
डिवाइस के कर्नल बिल्ड में डिवाइस के सिंबल की सूची जोड़ना
डिवाइस BUILD.bazel
में तय किए गए kernel_build
टारगेट में kmi_symbol_list
एट्रिब्यूट जोड़ें. सिंबल की सूची का नाम, //common:gki/<arch>/symbols/<device>
फ़ॉर्मैट में होना चाहिए.
उदाहरण के लिए, common-modules/virtual-device/BUILD.bazel
देखें:
kernel_build(
name = "virtual_device_aarch64",
base_kernel = "//common:kernel_aarch64",
kmi_symbol_list = "//common:gki/aarch64/symbols/virtual_device",
...
module_outs = _VIRT_COMMON_MODULES + _VIRT_AARCH64_MODULES,
)
सिंबल की शुरुआती सूची बनाना और सबमिट करना
common/gki/<arch>/symbols/<device>
पर खाली सिंबल की सूची बनाएं. ऊपर दिए गए उदाहरण के लिए, कमांड यह होगी:
touch common/gki/aarch64/symbols/virtual_device
इस फ़ाइल को, GKI के बेस कर्नल बिल्ड के additional_kmi_symbol_lists
में जोड़ें. उदाहरण के लिए, //common:gki/aarch64/symbols/virtual_device
को aarch64_additional_kmi_symbol_lists
फ़ाइल ग्रुप में जोड़ा गया है. इसे common/BUILD.bazel
में बताया गया है.
डिवाइस के सिंबल की सूची अपडेट करें, ताकि नई सिंबल सूची भरी जा सके. इसके बाद, इसे Android Common Kernel रिपॉज़िटरी को भेजें.
डिवाइस के सिंबल की सूची अपडेट करना
kernel_build
के module_outs
और kernel_abi
के kernel_modules
में मौजूद मॉड्यूल के इस्तेमाल किए गए सभी मुख्य कर्नल सिंबल, सिंबल की सूची में शामिल होने चाहिए. इसके लिए, _update_symbol_list
सफ़िक्स के साथ kernel_abi
टारगेट को चलाया जा सकता है. उदाहरण के लिए, यहां दिया गया निर्देश //common-modules/virtual-device:virtual_device_aarch64
के लिए सिंबल की सूची को अपडेट करता है:
tools/bazel run //common-modules/virtual-device:virtual_device_aarch64_abi_update_symbol_list
ACK को सिंबल लिस्ट अपडेट भेजें
सिंबल की सूची में बदलाव करने वाला पैच, Android Common Kernel gerrit को भेजें, ताकि नए सिंबल KMI का हिस्सा बन सकें.
कमिट मैसेज में, जोड़े गए या हटाए गए सिंबल की सूची शामिल होनी चाहिए. सिंबल की छोटी सूची को अपडेट करने के लिए, इस सूची को मैन्युअल तरीके से लिखा जा सकता है. इसके अलावा, रेफ़रंस ABI के बारे में जानकारी अपडेट करने के बाद, $DIST_DIR/abi_stgdiff/abi.report.short
रिपोर्ट का इस्तेमाल किया जा सकता है.
सिंबल की सूची का अपडेट भेजने से पहले, रेफ़रंस एबीआइ के प्रज़ेंटेशन को अपडेट करना ज़रूरी नहीं है. हालांकि, इससे सबमिट करने से पहले के अतिरिक्त चरणों को हटाया जा सकता है. साथ ही, बदलाव को तेज़ी से सबमिट किया जा सकता है. किसी भी मामले में, सबमिट करने से पहले इसकी जाँच की जाती है. अगर ज़रूरी हो, तो इसे अपडेट किया जाता है.
सिंबल की सूचियों के साथ काम करना (Android 13)
Android 13, Kleaf और लेगसी बिल्ड स्क्रिप्ट, दोनों के साथ काम करता है. इसलिए, सिंबल की सूचियों को मैनेज करने के लिए, ऊपर दिए गए सेक्शन में बताया गया तरीका या नीचे दिए गए सेक्शन में बताया गया तरीका इस्तेमाल किया जा सकता है.
सिंबल की सूचियों के साथ काम करना (Android 12 और इससे पहले के वर्शन)
build_abi.sh
टूल का इस्तेमाल इस तरह करें:
BUILD_CONFIG=path/to/build.config.device build/build_abi.sh --update-symbol-list
इस उदाहरण में, build.config.device
में ये कॉन्फ़िगरेशन विकल्प शामिल होने चाहिए:
vmlinux
यह
FILES
सूची का हिस्सा होना चाहिए. इसके लिए,build.config.aarch64
को शामिल किया जा सकता है.KMI_SYMBOL_LIST
इसे सेट करना ज़रूरी है. साथ ही, अपडेट करने के लिए इसे केएमआई सिंबल की सूची पर ले जाना होगा.
डिवाइस के सिंबल की सूची अपडेट करने के बाद, आपको इन बदलावों को GKI बिल्ड (common/build.config.gki.aarch64
) में भी दिखाना होगा:
अपडेट की गई सिंबल की सूची को
common/android/abi_gki_aarch64_<device>
में कॉपी करें.देखें कि
android/abi_gki_aarch64_<device>
,common/build.config.gki.aarch64
मेंADDITIONAL_KMI_SYMBOL_LISTS
में शामिल है या नहीं.