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

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>