کتابخانه های اشتراکی اندروید هر از چند گاهی تکامل می یابند. به روز نگه داشتن باینری های از پیش ساخته شده نیازمند تلاش های قابل توجهی است. در اندروید 9 یا نسخههای قبلی، باینریهای از پیش ساختهشده که به کتابخانههای حذف شده یا ABI وابسته هستند، فقط در زمان اجرا پیوند داده نمیشوند. توسعهدهندگان باید لاگها را ردیابی کنند تا باینریهای از پیش ساخته قدیمی را پیدا کنند. در اندروید 10، بررسی کننده استفاده های 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
چکر را اجرا کنید
برای اجرای جستجوگر، متغیر محیطی CHECK_ELF_FILES
را روی true
تنظیم کنید و make check-elf-files
را اجرا کنید:
CHECK_ELF_FILES=true make check-elf-files
برای فعال کردن جستجوگر به صورت پیشفرض، PRODUCT_CHECK_ELF_FILES
را به BoardConfig.mk
اضافه کنید:
PRODUCT_CHECK_ELF_FILES := true
پیش ساخته ها به طور خودکار در طول فرآیند ساخت اندروید بررسی می شوند:
make