पूर्वनिर्मित एबीआई उपयोग चेकर

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

प्रतीक-आधारित एबीआई चेकर का उपयोग करता है

प्रतीक-आधारित एबीआई उपयोग चेकर होस्ट पर एंड्रॉइड डायनेमिक लिंकर का अनुकरण करता है। चेकर प्रीबिल्ट बाइनरी को प्रीबिल्ट बाइनरी की निर्भरता से जोड़ता है और जांचता है कि सभी अपरिभाषित प्रतीकों का समाधान हो गया है या नहीं।

सबसे पहले, चेकर प्रीबिल्ट बाइनरी के लक्ष्य आर्किटेक्चर की जाँच करता है। यदि प्रीबिल्ट बाइनरी 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

चेकर चलाएँ

चेकर एंड्रॉइड बिल्ड प्रक्रिया के दौरान सभी ईएलएफ प्रीबिल्ट मॉड्यूल को कवर करता है।

तेज़ टर्नअराउंड समय के लिए चेकर को अकेले चलाने के लिए:

m check-elf-files

एबीआई त्रुटि फिक्सर

स्वचालित फिक्सर एबीआई जांच त्रुटियों को हल करने में मदद कर सकता है। बस फिक्सर को इनपुट के रूप में Android.bp / Android.mk के साथ चलाएं, और फिक्सर सुझाए गए फिक्स को stdout पर प्रिंट करेगा। वैकल्पिक रूप से, सुझाए गए फिक्स के साथ Android.bp / Android.mk को सीधे अपडेट करने के लिए फिक्सर को --in-place विकल्प के साथ चलाएं।

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>