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

प्रतीकों और प्रकारों की सतह को कम करने के लिए जिन्हें स्थिर बनाए रखने की आवश्यकता है, जीकेआई कर्नेल में निर्यात किए गए प्रतीकों को केवल उन तक सीमित करने की कार्यक्षमता है जो मॉड्यूल के लिए आवश्यक हैं। बाह्य रूप से संकलित मॉड्यूल के लिए, आपके पास उपयोग किए गए प्रतीकों की एक सूची होनी चाहिए ताकि उन्हें जीकेआई कर्नेल द्वारा निर्यात किया जा सके। उदाहरण के लिए, कटलफिश के लिए मॉड्यूल द्वारा उपयोग किए गए प्रतीकों को 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

    यह विकल्प अप्रयुक्त प्रतीकों को हटाने से रोकता है। प्रतीक हटाने की अनुमति केवल KMI स्थिरीकरण के दौरान विशिष्ट समय पर ही दी जाती है और KMI स्थिर हो जाने के बाद इसकी अनुमति नहीं दी जाती है।

    यह तब भी उपयोगी होता है जब आप कई अलग-अलग डिवाइसों के लिए एक ही प्रतीक सूची का उपयोग करते हैं। इस तरह यह डिवाइस A द्वारा उपयोग किए गए प्रतीकों को नहीं हटाएगा, लेकिन डिवाइस B को नहीं।

  • module_grouping

    यदि True या अनिर्दिष्ट है, तो प्रतीक सूची प्रतीक को संदर्भित करने वाले कर्नेल मॉड्यूल के आधार पर प्रतीकों को समूहित करेगी। अन्यथा प्रतीक सूची केवल सभी कर्नेल मॉड्यूल द्वारा उपयोग किए गए प्रतीकों की एक क्रमबद्ध सूची होगी।

उदाहरण के लिए सामान्य-मॉड्यूल/वर्चुअल-डिवाइस/BUILD.bazen देखें:

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,
)

क्लीफ़ में kernel_abi लक्ष्य पर संदर्भ दस्तावेज़ भी देखें।

प्रतीक निष्कर्षण के लिए इन-ट्री मॉड्यूल तैयार करें

प्रतीक निष्कर्षण के लिए इन-ट्री मॉड्यूल तैयार करने के लिए, kernel_build लक्ष्य के module_outs विशेषता में विक्रेता-विशिष्ट इन-ट्री मॉड्यूल को सूचीबद्ध करें। उदाहरण के लिए _VIRT_COMMON_MODULES और इसका उपयोग देखें। इस सूची में GKI मॉड्यूल शामिल न करें.

इन मॉड्यूल को अहस्ताक्षरित होने के लिए कॉन्फ़िगर करें, अन्यथा प्रतीक सूची खाली हो सकती है। ऐसा करने के लिए, इस पंक्ति को अपने कर्नेल कॉन्फ़िगरेशन फ़्रैगमेंट में जोड़ें:

# CONFIG_MODULE_SIG_ALL is not set

उदाहरण के लिए सामान्य-मॉड्यूल/वर्चुअल-डिवाइस/वर्चुअल_डिवाइस_कोर.फ़्रैगमेंट देखें।

डिवाइस कर्नेल बिल्ड में डिवाइस प्रतीक सूची जोड़ें

डिवाइस BUILD.bazel में परिभाषित kernel_build लक्ष्य में विशेषता kmi_symbol_list जोड़ें। प्रतीक सूची का नाम //common:android/abi_gki_<arch>_<device> के प्रारूप में होना चाहिए। उदाहरण के लिए, सामान्य-मॉड्यूल/वर्चुअल-डिवाइस/BUILD.bazen देखें:

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 फ़ाइल समूह में जोड़ा गया है, जिसे आम/BUILD.bazen में घोषित किया गया है।

नई प्रतीक सूची भरने और इसे एंड्रॉइड कॉमन कर्नेल रिपॉजिटरी में भेजने के लिए डिवाइस प्रतीक सूची को अपडेट करें

डिवाइस प्रतीक सूची अपडेट करें

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 का हिस्सा बनाने के लिए एंड्रॉइड कॉमन कर्नेल गेरिट पर प्रतीक सूची परिवर्तन के साथ एक पैच भेजें।

प्रतिबद्ध संदेश में जोड़े गए या हटाए गए प्रतीकों की एक सूची शामिल होनी चाहिए। आप या तो इस सूची को एक छोटे प्रतीक सूची अद्यतन के लिए मैन्युअल रूप से लिख सकते हैं या संदर्भ ABI प्रतिनिधित्व को अद्यतन करने के बाद $DIST_DIR/abi.report.short रिपोर्ट का उपयोग कर सकते हैं।

जबकि प्रतीक सूची भेजने से पहले संदर्भ एबीआई प्रतिनिधित्व को अपडेट करना आवश्यक नहीं है, यह अतिरिक्त प्रीसबमिट चरणों को समाप्त कर सकता है और परिवर्तन को तेजी से सबमिट करने के लिए तैयार कर सकता है। किसी भी स्थिति में, प्रीसबमिट के दौरान यदि आवश्यक हो तो इसकी जाँच और अद्यतन किया जाएगा।

पुराने संस्करण (एंड्रॉइड 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 ) में इन परिवर्तनों को प्रतिबिंबित करना होगा: