Android की शेयर की गई लाइब्रेरी समय-समय पर अपडेट होती रहती हैं. पहले से बनाए गए बाइनरी को अप-टू-डेट रखने के लिए, काफ़ी मेहनत करनी पड़ती है. Android 9 या इससे पहले के वर्शन में, पहले से बनी बाइनरी, हटाई गई लाइब्रेरी या एबीआइ पर निर्भर करती हैं. इसलिए, ये सिर्फ़ रन-टाइम पर लिंक नहीं हो पाती हैं. डेवलपर को लॉग ट्रैक करने होंगे, ताकि वे पहले से बने पुराने बाइनरी ढूंढ सकें. Android 10 में, सिंबल पर आधारित ABI के इस्तेमाल की जांच करने वाला टूल पेश किया गया है. चेकर, बिल्ड-टाइम पर पहले से बनाए गए पुराने बाइनरी का पता लगा सकता है. इससे शेयर की गई लाइब्रेरी के डेवलपर को यह पता चल सकता है कि उनके बदलाव से, पहले से बनाए गए कौनसे बाइनरी काम नहीं करेंगे और पहले से बनाए गए कौनसे बाइनरी को फिर से बनाना होगा.
सिंबल के आधार पर एबीआई के इस्तेमाल की जांच करने वाला टूल
सिंबल के आधार पर ABI के इस्तेमाल की जांच करने वाला टूल, होस्ट पर Android के डाइनैमिक लिंकर की नकल करता है. चेकर, पहले से बनाए गए बाइनरी को पहले से बनाए गए बाइनरी की डिपेंडेंसी से लिंक करता है. साथ ही, यह जांच करता है कि सभी अनडिफ़ाइंड सिंबल हल हो गए हैं या नहीं.
सबसे पहले, चेकर पहले से बनी बाइनरी के टारगेट आर्किटेक्चर की जांच करता है. अगर पहले से बना बाइनरी, ARM, AArch64, x86 या x86-64 आर्किटेक्चर को टारगेट नहीं करता है, तो चेकर, पहले से बने बाइनरी को छोड़ देता है.
दूसरा, प्रीबिल्ट बाइनरी की डिपेंडेंसी, LOCAL_SHARED_LIBRARIES
या shared_libs
में लिस्ट की जानी चाहिए. बिल्ड सिस्टम, मॉड्यूल के नामों को शेयर की गई लाइब्रेरी के मैचिंग वैरिएंट (यानी कि core
बनाम vendor
) में बदलता है.
तीसरा, चेकर DT_NEEDED
की एंट्री की तुलना LOCAL_SHARED_LIBRARIES
या shared_libs
से करता है. खास तौर पर, चेकर हर शेयर की गई लाइब्रेरी से DT_SONAME
एंट्री निकालता है. इसके बाद, इन DT_SONAME
की तुलना, पहले से बनाए गए बाइनरी में रिकॉर्ड की गई DT_NEEDED
एंट्री से करता है. अगर कोई वैल्यू मेल नहीं खाती है, तो गड़बड़ी का मैसेज दिखता है.
चौथे चरण में, चेकर पहले से बने बाइनरी में मौजूद ऐसे सिंबल को ठीक करता है जिनकी परिभाषा नहीं दी गई है. जिन सिंबल को तय नहीं किया गया है उन्हें किसी एक डिपेंडेंसी में तय किया जाना चाहिए. साथ ही, सिंबल बाइंडिंग GLOBAL
या WEAK
होनी चाहिए. अगर किसी ऐसे सिंबल का पता नहीं लगाया जा सकता है जिसके बारे में जानकारी नहीं है, तो गड़बड़ी का मैसेज दिखता है.
प्रीबिल्ट मॉड्यूल की प्रॉपर्टी
प्रीबिल्ट बाइनरी की डिपेंडेंसी, इनमें से किसी एक में तय की जानी चाहिए:
- Android.bp:
shared_libs: ["libc", "libdl", "libm"],
- Android.mk:
LOCAL_SHARED_LIBRARIES := libc libdl libm
अगर प्रीबिल्ट बाइनरी को इस तरह से डिज़ाइन किया गया है कि उसमें कुछ अनसुलझे अनडिफ़ाइंड सिंबल मौजूद हों, तो इनमें से कोई एक विकल्प चुनें:
- Android.bp:
allow_undefined_symbols: true,
- Android.mk:
LOCAL_ALLOW_UNDEFINED_SYMBOLS := true
अगर आपको पहले से बनी बाइनरी के लिए, ईएलएफ़ फ़ाइल की जांच को स्किप करना है, तो इनमें से कोई एक विकल्प चुनें:
- Android.bp:
check_elf_files: false,
- Android.mk:
LOCAL_CHECK_ELF_FILES := false
जांच करने वाले टूल को चलाना
यह चेकर, Android बिल्ड प्रोसेस के दौरान सभी ईएलएफ़ प्रीबिल्ट मॉड्यूल को कवर करता है.
अगर आपको चेकर को अकेले चलाना है, ताकि वह जल्दी काम कर सके, तो यह तरीका अपनाएं:
m check-elf-files
एबीआई से जुड़ी गड़बड़ी ठीक करने वाला टूल
अपने-आप ठीक होने वाली सुविधा की मदद से, ABI की जांच से जुड़ी गड़बड़ियों को ठीक किया जा सकता है. Android.bp / Android.mk को इनपुट के तौर पर इस्तेमाल करके, फ़िक्सर को चलाएं. इसके बाद, फ़िक्सर, सुझाए गए फ़िक्स को stdout पर प्रिंट करेगा. इसके अलावा, --in-place
विकल्प के साथ फ़िक्सर चलाकर, सुझाए गए फ़िक्स के साथ Android.bp / Android.mk को सीधे तौर पर अपडेट किया जा सकता है.
Android.bp के लिए,
m fix_android_bp_prebuilt
# Print the fixed Android.bp to stdout.
fix_android_bp_prebuilt <path-to-Android.bp>
# Update the Android.bp in place.
fix_android_bp_prebuilt --in-place <path-to-Android.bp>
Android.mk के लिए,
m fix_android_mk_prebuilt
# Print the fixed Android.mk to stdout.
fix_android_mk_prebuilt <path-to-Android.mk>
# Update the Android.mk in place.
fix_android_mk_prebuilt --in-place <path-to-Android.mk>