एबीआई मॉनिटरिंग की सुविधा चालू करना

इस पेज पर, Android कर्नल ABI के वर्शन बनाने और ABI मॉनिटरिंग चलाने का तरीका बताया गया है. यह सुविधा, Android 16 और उसके बाद के वर्शन पर काम करती है. इससे पहले के वर्शन के लिए, ABI मॉनिटर के पिछले कर्नल वर्शन पर जाएं.

Kleaf के लिए रेफ़रंस दस्तावेज़ भी देखें: Support ABI monitoring (GKI) और Support ABI monitoring (Device).

कर्नल और उसके एबीआई को बनाना

जीकेआई सोर्स डाउनलोड करने के बाद, जीकेआई कर्नेल और एबीआई आर्टफ़ैक्ट बनाने के लिए, यह कमांड चलाएं:

tools/bazel run //common:kernel_aarch64_abi_dist

यह कमांड, मौजूदा ABI का प्रतिनिधित्व करती है और इसे $DIST_DIR/abi.stg में कॉपी करती है. साथ ही, यह बिल्ट कर्नल और मॉड्यूल को भी कॉपी करती है. $DIST_DIR डिफ़ॉल्ट रूप से out_abi/kernel_aarch64_abi_dist/dist पर सेट होता है.

कमांड के आखिर में, -- के बाद, ABI टूलिंग के लिए अतिरिक्त आर्ग्युमेंट तय किए जा सकते हैं. उदाहरण के लिए, एबीआई और बिल्ड आर्टफ़ैक्ट के डेस्टिनेशन को बदलने के लिए, --destdir विकल्प का इस्तेमाल किया जा सकता है:

tools/bazel run //common:kernel_aarch64_abi_dist -- --destdir=out/dist

बिल्ड और रेफ़रंस प्रज़ेंटेशन के बीच ABI के अंतर का विश्लेषण करना

//common:kernel_aarch64_abi_dist टारगेट, पिछली कमांड में लागू किया गया था. यह common/gki/aarch64/abi.stg पर मौजूद बिल्ड और रेफ़रंस प्रज़ेंटेशन के बीच मिले किसी भी एबीआई अंतर का विश्लेषण करता है और उसकी रिपोर्ट करता है. common/gki/aarch64/abi.stg को BUILD.bazel में तय किया गया है. इन अंतरों को बिल्ड के आखिर में प्रिंट किया जाता है. जैसा कि यहां दिए गए उदाहरण में दिखाया गया है:

INFO: From [stg] Comparing Kernel ABI @//common:kernel_aarch64_abi_diff:
INFO: ABI DIFFERENCES HAVE BEEN DETECTED!

प्रिंट की गई रिपोर्ट, $DIST_DIR/abi_stgdiff/abi.report.short पर मौजूद बिल्ड आर्टफ़ैक्ट से मिलती है. साथ ही, यह रिपोर्ट अन्य फ़ॉर्मैट में भी उपलब्ध होती है.

ऑटोमेशन को बिल्ड कमांड के एक्ज़िट कोड का इस्तेमाल करना चाहिए. अगर कोई अंतर मिलता है, तो यह कोड शून्य नहीं होता.

ध्यान दें कि डेवलपमेंट फ़ेज़ वाली ब्रांच, जैसे कि android-mainline, में कोई रेफ़रंस ABI नहीं होता. इसके बिना, //common:kernel_aarch64_abi_dist कोई अंतर नहीं ढूंढ पाएगा.

रेफ़रंस एबीआई के बारे में जानकारी अपडेट करना

अगर कर्नल एबीआई पर कोई बदलाव होता है, तो उसे रेफ़रंस एबीआई के तौर पर दिखाना ज़रूरी है. जैसे, सिंबल लिस्ट अपडेट. रेफ़रंस एबीआई, common/gki/aarch64/abi.stg में दिखता है और इसे BUILD.bazel में तय किया जाता है. इसके लिए, आपको यह कमांड चलानी होगी:

tools/bazel run //common:kernel_aarch64_abi_update

यह कमांड, एबीआई में अंतर का विश्लेषण करें चरण में मौजूद सभी कार्रवाइयां करती है. साथ ही, सोर्स में रेफ़रंस प्रज़ेंटेशन को भी अपडेट करती है. इसके बाद, अपडेट किए गए एबीआई को बदलाव वाले कमिट में ही अपलोड किया जा सकता है. कमिट मैसेज में, $DIST_DIR/abi_stgdiff/abi.report.short में मौजूद रिपोर्ट से एबीआई के अंतर शामिल करें.

एबीआई की निगरानी और डिवाइस टारगेट

एबीआई मॉनिटरिंग को सिर्फ़ मुख्य कर्नल बिल्ड टारगेट के लिए कॉन्फ़िगर किया जाना चाहिए. मिक्स किए गए बिल्ड कॉन्फ़िगरेशन (ऐसे कॉन्फ़िगरेशन जो base_kernel को तय करते हैं) सीधे तौर पर जीकेआई कर्नेल के साथ कंपाइल होते हैं. इन्हें डिवाइस के सिंबल की सूची को ट्रैक करने की सुविधा जोड़ने की ज़रूरत होती है. GKI बिल्ड का इस्तेमाल करके, एबीआई की परिभाषा को अपडेट किया जाना चाहिए.

Kleaf के लिए रेफ़रंस दस्तावेज़ भी देखें: एबीआई मॉनिटरिंग की सुविधा (डिवाइस).

एबीआई मॉनिटर, कर्नल के पिछले वर्शन (Android 15 और इससे पहले के वर्शन)

पिछले कर्नल वर्शन के लिए, ABI बनाने और मॉनिटर करने के निर्देश यहां दिए गए हैं.

Android 15 और 14

निर्देश ज़्यादातर Android 16 के जैसे ही हैं. हालांकि, रेफ़रंस ABI का प्रतिनिधित्व common/android/abi_gki_aarch64.stg और $DIST_DIR, out_abi/kernel_aarch64/dist पर डिफ़ॉल्ट होता है.

Android 13

Android 13 को Kleaf या लेगसी बिल्ड स्क्रिप्ट की मदद से बनाया जा सकता है.

Kleaf के लिए, निर्देश Android 14 के जैसे ही हैं. हालांकि, एबीआई फ़ॉर्मैट एक्सएमएल है और एबीआई का रेफ़रंस common/android/abi_gki_aarch64.xml है.

लेगसी बिल्ड स्क्रिप्ट के लिए, निर्देश Android 12 के जैसे ही हैं.

Android 12 और इससे पहले वाले वर्शन

एबीआई फ़ॉर्मैट एक्सएमएल है और एबीआई का रेफ़रंस इस तरह दिखाया जाता है common/android/abi_gki_aarch64.xml

ये कर्नल, Kleaf के बजाय build.sh का इस्तेमाल करते हैं. एबीआई मॉनिटरिंग के लिए, आपको build_abi.sh का इस्तेमाल करना चाहिए. यह build.sh की तरह ही, एनवायरमेंट वैरिएबल को स्वीकार करता है, ताकि बिल्ड को पसंद के मुताबिक बनाया जा सके. उदाहरण के लिए:

BUILD_CONFIG=common/build.config.gki.aarch64 build/build_abi.sh

इससे कर्नल बनता है और एबीआई को OUT_DIR सबडायरेक्ट्री में एक्सट्रैक्ट किया जाता है. यह डिफ़ॉल्ट रूप से out_abi होती है. यह Kleaf के //common:kernel_aarch64_abi_dist टारगेट के बराबर होती है. ज़्यादा जानकारी के लिए, कर्नल और एबीआई आर्टफ़ैक्ट बनाना लेख पढ़ें.

रेफ़रंस एबीआई का प्रतिनिधित्व android/abi_gki_aarch64.xml में सेव किया जाता है. इसे common/build.config.gki.aarch64 में ABI_DEFINITION वैरिएबल के ज़रिए तय किया जाता है.

अगर आपको कर्नल एबीआई के बारे में जानकारी अपडेट करनी है, तो --update और --print-report विकल्पों का इस्तेमाल करना सबसे आसान तरीका है:

BUILD_CONFIG=common/build.config.gki.aarch64 build/build_abi.sh --update --print-report

--print-report, फ़ाइल के मौजूदा वर्शन और नए जनरेट किए गए एबीआई के बीच के अंतर को प्रिंट करता है.

--update विकल्प, रेफ़रंस ABI के प्रज़ेंटेशन को ओवरराइट करता है. KMI_SYMBOL_LIST कॉन्फ़िगर किए गए डिवाइस के लिए BUILD_CONFIG का इस्तेमाल करते समय, यह सिंबल की सूची को भी अपडेट करता है.