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

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

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

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

जांच करने वाले टूल को चलाना

Android के बिल्ड प्रोसेस के दौरान, यह टूल ईएलएफ़ के पहले से बनाए गए सभी मॉड्यूल की जांच करता है.

टर्नअराउंड टाइम कम करने के लिए, जांच करने वाले टूल को अलग से चलाने के लिए:

m check-elf-files

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

गड़बड़ी ठीक करने वाला ऑटोमैटिक टूल, एबीआई की जांच से जुड़ी गड़बड़ियों को हल करने में मदद कर सकता है. गड़बड़ी ठीक करने वाले टूल को 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>