کتابخانههای اشتراکی اندروید هر از گاهی تکامل مییابند. بهروز نگه داشتن فایلهای باینری از پیش ساخته شده نیاز به تلاش قابل توجهی دارد. در اندروید ۹ یا قبل از آن، فایلهای باینری از پیش ساخته شده که به کتابخانهها یا ABIهای حذف شده وابسته هستند، فقط در زمان اجرا قادر به اتصال نیستند. توسعهدهندگان باید لاگها را ردیابی کنند تا فایلهای باینری از پیش ساخته شده قدیمی را پیدا کنند. در اندروید ۱۰، یک بررسیکننده استفاده از ABI مبتنی بر نماد معرفی شده است. این بررسیکننده میتواند فایلهای باینری از پیش ساخته شده قدیمی را در زمان ساخت تشخیص دهد، به طوری که توسعهدهندگان کتابخانه مشترک میتوانند بدانند کدام فایلهای باینری از پیش ساخته شده ممکن است با تغییر آنها خراب شوند و کدام فایلهای باینری از پیش ساخته شده باید دوباره ساخته شوند.
بررسیکنندهی کاربردهای ABI مبتنی بر نماد
بررسیکنندهی کاربردهای ABI مبتنی بر نماد، پیونددهندهی پویای اندروید را روی میزبان شبیهسازی میکند. این بررسیکننده، فایل باینری از پیش ساخته شده را با وابستگیهای فایل باینری از پیش ساخته شده پیوند میدهد و بررسی میکند که آیا تمام نمادهای تعریف نشده حل شدهاند یا خیر.
ابتدا، بررسیکننده معماری هدفِ باینریِ از پیش ساخته شده را بررسی میکند. اگر باینریِ از پیش ساخته شده معماری 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
برای اینکه فایل باینری از پیش ساخته شده، بررسی فایل ELF را رد کند، یکی از موارد زیر را مشخص کنید:
- Android.bp:
check_elf_files: false, - Android.mk:
LOCAL_CHECK_ELF_FILES := false
چکر را اجرا کنید
این بررسیکننده تمام ماژولهای از پیش ساخته شده ELF را در طول فرآیند ساخت اندروید پوشش میدهد.
برای اجرای چکر به تنهایی و افزایش زمان پاسخگویی:
m check-elf-filesرفع کننده خطای ABI
رفعکننده خودکار میتواند به رفع خطاهای بررسی ABI کمک کند. کافیست رفعکننده را با Android.bp / Android.mk به عنوان ورودی اجرا کنید، و رفعکننده، رفعکننده پیشنهاد شده را در stdout چاپ میکند. به صورت اختیاری، رفعکننده را با گزینه --in-place اجرا کنید تا مستقیماً Android.bp / Android.mk را با رفعکننده پیشنهاد شده بهروزرسانی کنید.
برای اندروید.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>