पहले से बने एबीआई के इस्तेमाल की जांच करने वाला ऐप्लिकेशन

Android की शेयर की गई लाइब्रेरी समय-समय पर बेहतर होती रहती हैं. पहले से बने बाइनरी को अप-टू-डेट रखने के लिए, काफ़ी मेहनत करनी पड़ती है. Android 9 या उससे पहले के वर्शन में, हटाई गई लाइब्रेरी या एबीआई पर निर्भर रहने वाली पहले से बनी बाइनरी, सिर्फ़ रन-टाइम पर लिंक नहीं हो पाती हैं. डेवलपर को पुरानी बिनेरी ढूंढने के लिए, लॉग को ट्रैक करना होगा. Android 10 में, सिंबल पर आधारित एबीआई के इस्तेमाल की जांच करने वाला टूल लॉन्च किया गया है. चेकर, बिल्ड के समय पहले से बने आउटडेट बाइनरी का पता लगा सकता है. इससे, शेयर की गई लाइब्रेरी के डेवलपर को यह पता चल सकता है कि उनके बदलाव से कौनसे पहले से बने बाइनरी काम नहीं कर सकते और कौनसे पहले से बने बाइनरी को फिर से बनाना होगा.

सिंबल के आधार पर एबीआई के इस्तेमाल की जांच करने वाला टूल

सिंबल पर आधारित एबीआई के इस्तेमाल की जांच करने वाला टूल, होस्ट पर 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

पहले से बनी बाइनरी को ELF फ़ाइल की जांच से बचने के लिए, इनमें से कोई एक विकल्प चुनें:

  • Android.bp: check_elf_files: false,
  • Android.mk: LOCAL_CHECK_ELF_FILES := false

जांच करने वाले टूल का इस्तेमाल करें

यह चेकर, Android बिल्ड प्रोसेस के दौरान पहले से बने सभी ELF मॉड्यूल को कवर करता है.

तेज़ी से डबिंग करने के लिए, चेकर को अकेले चलाने के लिए:

m check-elf-files

एबीआई की गड़बड़ी ठीक करने वाला टूल

अपने-आप ठीक करने की सुविधा, एबीआई की जांच से जुड़ी गड़बड़ियों को ठीक करने में मदद कर सकती है. बस, इनपुट के तौर पर Android.bp / Android.mk के साथ फ़िक्सर चलाएं. इसके बाद, फ़िक्सर सुझाई गई गड़बड़ी को स्टैंडर्ड आउटपुट में प्रिंट करेगा. इसके अलावा, --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>