প্রিবিল্ট ABI ব্যবহার চেকার

Android শেয়ার করা লাইব্রেরি মাঝে মাঝে পরিবর্তিত হয়। প্রিবিল্ট বাইনারি আপ-টু-ডেট রাখতে হলে অনেক পরিশ্রম করতে হয়। Android 9 বা এর আগের ভার্সনে, আগে থেকে তৈরি বাইনারি যা সরিয়ে দেওয়া লাইব্রেরি বা 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

ডিফল্ট হিসেবে চেকার চালু করতে, BoardConfig.mk-এ PRODUCT_CHECK_ELF_FILES যোগ করুন:

PRODUCT_CHECK_ELF_FILES := true

Android-এর বিল্ড প্রসেসের সময় প্রি-বিল্ট অটোমেটিক চেক করা হয়:

make