प्रतीक सूचियों के साथ काम करें

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 में शामिल है या नहीं.

  • सिंबल सूची का अपडेट ACK पर भेजें.