بررسی‌کننده استفاده‌های 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

اجرای بررسی‌کننده

برای اجرای بررسی‌کننده، متغیر محیطی 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

پیش‌ساخته‌ها به‌طور خودکار درطول فرایند ساخت Android بررسی می‌شوند:

make