GKI के kernel में, एक्सपोर्ट किए गए सिर्फ़ उन सिंबल को सीमित करने की सुविधा है जिनकी ज़रूरत मॉड्यूल को होती है. इससे, उन सिंबल और टाइप की संख्या कम हो जाती है जिन्हें स्थिर बनाए रखने की ज़रूरत होती है. बाहर से कंपाइल किए गए मॉड्यूल के लिए, आपको इस्तेमाल किए गए सिंबल की सूची होनी चाहिए, ताकि GKI कर्नेल उन्हें एक्सपोर्ट कर सके. उदाहरण के लिए, Cuttlefish के लिए मॉड्यूल के इस्तेमाल किए गए सिंबल, android/abi_gki_aarch64_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 मॉड्यूल शामिल न करें.
इन मॉड्यूल को साइन इन नहीं करने के लिए कॉन्फ़िगर करें. ऐसा न करने पर, सिंबल की सूची खाली हो सकती है. ऐसा करने के लिए, अपने kernel कॉन्फ़िगरेशन फ़्रैगमेंट में यह लाइन जोड़ें:
# CONFIG_MODULE_SIG_ALL is not set
उदाहरण के लिए, common-modules/virtual-device/virtual_device_core.fragment देखें.
डिवाइस के कर्नेल बिल्ड में डिवाइस के सिंबल की सूची जोड़ना
डिवाइस BUILD.bazel
में तय किए गए kernel_build
टारगेट में एट्रिब्यूट kmi_symbol_list
जोड़ें. सिंबल की सूची का नाम //common:android/abi_gki_<arch>_<device>
फ़ॉर्मैट में होना चाहिए. common-modules/virtual-device/BUILD.baकोई देखें, उदाहरण के लिए:
kernel_build(
name = "virtual_device_aarch64",
base_kernel = "//common:kernel_aarch64",
kmi_symbol_list = "//common:android/abi_gki_aarch64_virtual_device",
...
module_outs = _VIRT_COMMON_MODULES + _VIRT_AARCH64_MODULES,
)
शुरुआती सिंबल की सूची बनाना और सबमिट करना
common/android/abi_gki_<arch>_<device>
पर, खाली सिंबल की सूची बनाएं. ऊपर दिए गए उदाहरण के लिए, कमांड यह होगा:
touch common/android/abi_gki_aarch64_virtual_device
इस फ़ाइल को GKI के बेस कर्नेल बिल्ड के additional_kmi_symbol_lists
में जोड़ें. उदाहरण के लिए, //common:android/abi_gki_aarch64_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 को सिंबल सूची का अपडेट भेजें
नए सिंबल को KMI का हिस्सा बनाने के लिए, Android Common Kernel के Gerrit में, सिंबल की सूची में हुए बदलाव के साथ पैच भेजें.
कमिट मैसेज में, जोड़े गए या हटाए गए सिंबल की सूची शामिल होनी चाहिए. सिंबल की छोटी सूची को अपडेट करने के लिए, इस सूची को मैन्युअल तरीके से लिखा जा सकता है. इसके अलावा, रेफ़रंस एबीआई के रेप्रज़ेंटेशन को अपडेट करने के बाद, $DIST_DIR/abi.report.short
रिपोर्ट का इस्तेमाल किया जा सकता है.
सिंबल की सूची को अपडेट करने से पहले, पहचान फ़ाइल के एबीआई को अपडेट करने की ज़रूरत नहीं होती. हालांकि, ऐसा करने से पहले से सबमिट करने के अतिरिक्त चरण हट सकते हैं और बदलाव को तेज़ी से सबमिट किया जा सकता है. किसी भी मामले में, सबमिट करने से पहले इसकी जांच की जाती है और ज़रूरत पड़ने पर इसे अपडेट किया जाता है.
पुराने वर्शन (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
अपडेट करने के लिए, यह KMI सिंबल की सूची सेट होना चाहिए और इस पर कर्सर ले जाना चाहिए.
डिवाइस के सिंबल की सूची अपडेट करने के बाद, आपको GKI बिल्ड (common/build.config.gki.aarch64
) में भी ये बदलाव दिखाने होंगे:
अपडेट की गई सिंबल की सूची को
common/android/abi_gki_aarch64_<device>
में कॉपी करें.देखें कि
common/build.config.gki.aarch64
मेंandroid/abi_gki_aarch64_<device>
,ADDITIONAL_KMI_SYMBOL_LISTS
में शामिल है या नहीं.