প্রিবিল্ট 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

চেকার চালান

Android বিল্ড প্রসেস চলাকালীন চেকার সব 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>