جستجوگر استفاده از ABI از پیش ساخته شده است

کتابخانه های اشتراکی اندروید هر از چند گاهی تکامل می یابند. به روز نگه داشتن باینری های از پیش ساخته شده نیازمند تلاش قابل توجهی است. در اندروید 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>