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

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

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

चेकर को चलाने के लिए, एनवायरमेंट वैरिएबल CHECK_ELF_FILES को true पर सेट करें और make check-elf-files को चलाएं:

CHECK_ELF_FILES=true make check-elf-files

चेकर को डिफ़ॉल्ट रूप से चालू करने के लिए, BoardConfig.mk में PRODUCT_CHECK_ELF_FILES जोड़ें:

PRODUCT_CHECK_ELF_FILES := true

Android के बिल्ड होने की प्रोसेस के दौरान, पहले से बने वर्शन की अपने-आप जांच की जाती है:

make