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

অ্যান্ড্রয়েড শেয়ার করা লাইব্রেরি সময়ে সময়ে বিকশিত হয়। প্রি-বিল্ট বাইনারি আপ-টু-ডেট রাখার জন্য যথেষ্ট প্রচেষ্টা প্রয়োজন। অ্যান্ড্রয়েড 9 বা তার আগে, পূর্বনির্মাণ করা বাইনারিগুলি যা সরানো লাইব্রেরি বা ABI-এর উপর নির্ভর করে শুধুমাত্র রান-টাইমে লিঙ্ক করতে ব্যর্থ হয়। ডেভেলপারদের সেকেলে প্রি-বিল্ট বাইনারি খুঁজে বের করতে লগ ট্রেস করতে হবে। অ্যান্ড্রয়েড 10-এ, একটি প্রতীক-ভিত্তিক 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 । যদি একটি অনির্ধারিত প্রতীক সমাধান করা না যায়, একটি ত্রুটি বার্তা নির্গত হয়।

মডিউল বৈশিষ্ট্য prebuilts

পূর্বনির্মাণ বাইনারি নির্ভরতা অবশ্যই নিম্নলিখিতগুলির মধ্যে একটিতে নির্দিষ্ট করা উচিত:

  • 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>