পূর্বনির্মাণ ABI ব্যবহার পরীক্ষক

অ্যান্ড্রয়েড শেয়ার্ড লাইব্রেরিগুলো সময়ে সময়ে পরিবর্তিত হয়। প্রি-বিল্ট বাইনারিগুলোকে হালনাগাদ রাখতে যথেষ্ট পরিশ্রমের প্রয়োজন হয়। অ্যান্ড্রয়েড ৯ বা তার আগের সংস্করণগুলোতে, যে প্রি-বিল্ট বাইনারিগুলো বাদ দেওয়া লাইব্রেরি বা ABI-এর উপর নির্ভর করত, সেগুলো শুধুমাত্র রান-টাইমে লিঙ্ক হতে ব্যর্থ হতো। পুরোনো হয়ে যাওয়া প্রি-বিল্ট বাইনারিগুলো খুঁজে বের করার জন্য ডেভেলপারদের লগ ট্রেস করতে হতো। অ্যান্ড্রয়েড ১০-এ একটি সিম্বল-ভিত্তিক 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-এ প্রস্তাবিত সমাধানটি প্রিন্ট করবে। ঐচ্ছিকভাবে, প্রস্তাবিত সমাধানটি দিয়ে সরাসরি Android.bp / Android.mk আপডেট করতে --in-place অপশনটি সহ ফিক্সারটি চালান।

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>