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

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