सिंबल की सूचियों के साथ काम करना

स्थिरता बनाए रखने के लिए, जिन सिंबल और टाइप को बनाए रखना ज़रूरी है उनकी संख्या कम करने के लिए, 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) में भी दिखाना होगा: