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 फ़्रैगमेंट में यह लाइन जोड़ें:
# 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.bazel देखें:
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
में शामिल है या नहीं.