इस पेज पर, Android कर्नल के ABI (ऐप्लिकेशन बाइनरी इंटरफ़ेस) के वर्शन बनाने और ABI मॉनिटरिंग चलाने का तरीका बताया गया है. यह Android 16 और उसके बाद के वर्शन पर लागू होता है. इससे पहले के वर्शन के लिए, ABI मॉनिटर के पिछले कर्नल वर्शन पर जाएं.
Kleaf के लिए रेफ़रंस दस्तावेज़ भी देखें: Support ABI monitoring (GKI) और Support ABI monitoring (Device).
कर्नेल और उसके एबीआई का प्रतिनिधित्व बनाना
जीकेआई सोर्स डाउनलोड करने के बाद, जीकेआई कर्नेल और ABI आर्टफ़ैक्ट बनाने के लिए यहां दिया गया निर्देश चलाएं:
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यह कमांड, एबीआई में अंतर का विश्लेषण करें चरण में मौजूद सभी कार्रवाइयां करती है. साथ ही, सोर्स में रेफ़रंस के तौर पर इस्तेमाल किए गए कोड को भी अपडेट करती है. इसके बाद, अपडेट किए गए ABI को बदलाव वाले कमिट में ही अपलोड किया जा सकता है. कमिट मैसेज में, रिपोर्ट में दिए गए ABI के अंतर को $DIST_DIR/abi_stgdiff/abi.report.short में शामिल करें.
एबीआई मॉनिटरिंग और डिवाइस टारगेट
एबीआई मॉनिटरिंग को सिर्फ़ कोर कर्नल बिल्ड टारगेट के लिए कॉन्फ़िगर किया जाना चाहिए. मिक्स किए गए बिल्ड कॉन्फ़िगरेशन (ऐसे कॉन्फ़िगरेशन जो base_kernel को तय करते हैं) सीधे तौर पर GKI कर्नल के साथ कंपाइल होते हैं. इन्हें डिवाइस सिंबल की सूची को ट्रैक करने की सुविधा जोड़ने की ज़रूरत होती है.
GKI बिल्ड का इस्तेमाल करके, एबीआई की परिभाषा को अपडेट किया जाना चाहिए.
Kleaf के लिए रेफ़रंस दस्तावेज़ भी देखें: एबीआई मॉनिटरिंग की सुविधा (डिवाइस).
ABI मॉनिटर, कर्नल के पिछले वर्शन (Android 15 और इससे पहले के वर्शन)
पिछले कर्नल वर्शन के लिए, एबीआइ बनाने और मॉनिटर करने के निर्देश यहां दिए गए हैं.
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 टारगेट के बराबर होती है. इसके बारे में जानने के लिए, कर्नल और एबीआई आर्टफ़ैक्ट बनाना लेख पढ़ें.
रेफ़रंस ABI का प्रतिनिधित्व, 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 का इस्तेमाल करते समय, यह सिंबल की सूची को भी अपडेट करता है.