کتابخانه های اشتراکی اندروید هر از چند گاهی تکامل می یابند. به روز نگه داشتن باینری های از پیش ساخته شده نیازمند تلاش قابل توجهی است. در اندروید 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
چکر را اجرا کنید
چکر تمام ماژول های از پیش ساخته شده ELF را در طول فرآیند ساخت اندروید پوشش می دهد.
برای اجرای چکر به تنهایی برای زمان های برگشت سریعتر:
m check-elf-files
رفع کننده خطای ABI
ثابت کننده خودکار می تواند به رفع خطاهای بررسی ABI کمک کند. به سادگی رفع کننده را با 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>