بررسی‌کننده استفاده‌های ABI پیش‌ساخته

کتابخانه‌های مشترک Android گاه‌به‌گاه تکامل می‌یابند. به‌روز نگه داشتن باینری‌های ازپیش ساخته‌شده تلاش قابل‌توجهی می‌طلبد. در Android نسخه ۹ یا قدیمی‌تر، باینری‌های ازپیش‌ساخته‌شده‌ای که به کتابخانه‌های حذف‌شده یا ABIها وابسته هستند فقط در زمان اجرا پیوند داده نمی‌شوند. توسعه‌دهندگان باید گزارش‌ها را ردیابی کنند تا باینری‌های پیش‌ساخته قدیمی را پیدا کنند. در Android 10، بررسی‌کننده استفاده از ABI مبتنی بر نماد معرفی شده است. بررسی‌کننده می‌تواند باینری‌های پیش‌ساخته قدیمی را در زمان ساخت شناسایی کند، بنابراین توسعه‌دهندگان کتابخانه مشترک می‌توانند بدانند کدام باینری‌های پیش‌ساخته ممکن است با تغییر آن‌ها خراب شوند و کدام باینری‌های پیش‌ساخته باید دوباره ساخته شوند.

بررسی‌کننده استفاده‌های ABI براساس نماد

بررسی‌کننده استفاده‌های ABI مبتنی بر نماد، پیونددهنده پویای Android را در میزبان شبیه‌سازی می‌کند. بررسی‌کننده باینری ازپیش‌ساخته‌شده را با وابستگی‌های باینری ازپیش‌ساخته‌شده پیوند می‌دهد و بررسی می‌کند که آیا همه نمادهای تعریف‌نشده حل‌وفصل شده‌اند یا نه.

ابتدا، بررسی‌کننده معماری هدف باینری پیش‌ساخته را بررسی می‌کند. اگر باینری پیش‌ساخته معماری 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 را درطول فرایند ساخت Android پوشش می‌دهد.

برای اجرای جداگانه بررسی‌کننده برای زمان‌های چرخه سریع‌تر:

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>