32-বিট এবং 64-বিট আর্কিটেকচারের জন্য তৈরি করুন, 32-বিট এবং 64-বিট আর্কিটেকচারের জন্য তৈরি করুন

বিল্ড সিস্টেম একই বিল্ডে দুটি লক্ষ্য CPU আর্কিটেকচার, 32 বিট এবং 64 বিটের জন্য বাইনারি তৈরি করতে সহায়তা করে। এই দুই-টার্গেট বিল্ড একটি মাল্টিলিব বিল্ড হিসাবে পরিচিত।

বিল্ট-ইন স্ট্যাটিক লাইব্রেরি এবং শেয়ার্ড লাইব্রেরির জন্য, বিল্ড সিস্টেম উভয় আর্কিটেকচারের জন্য বাইনারি তৈরি করার নিয়ম সেট আপ করে। পণ্য কনফিগারেশন ( PRODUCT_PACKAGES ), নির্ভরতা গ্রাফ সহ, সিস্টেম ইমেজে কোন বাইনারি তৈরি এবং ইনস্টল করা হয়েছে তা নির্ধারণ করে।

এক্সিকিউটেবল এবং অ্যাপ্লিকেশানগুলির জন্য, বিল্ড সিস্টেমটি ডিফল্টরূপে শুধুমাত্র 64-বিট সংস্করণ তৈরি করে, তবে আপনি একটি গ্লোবাল BoardConfig.mk ভেরিয়েবল বা একটি মডিউল-স্কোপড ভেরিয়েবল দিয়ে এই সেটিংটি ওভাররাইড করতে পারেন।

একটি দ্বিতীয় CPU আর্কিটেকচার এবং ABI সনাক্ত করুন

BoardConfig.mk দ্বিতীয় CPU আর্কিটেকচার এবং অ্যাপ্লিকেশন বাইনারি ইন্টারফেস (ABI) কনফিগার করার জন্য নিম্নলিখিত ভেরিয়েবলগুলি অন্তর্ভুক্ত করে:

  • TARGET_2ND_ARCH
  • TARGET_2ND_ARCH_VARIANT
  • TARGET_2ND_CPU_VARIANT
  • TARGET_2ND_CPU_ABI
  • TARGET_2ND_CPU_ABI2

এই ভেরিয়েবল ব্যবহার করে এমন একটি মেকফাইলের উদাহরণের জন্য, দেখুন build/make/target/board/generic_arm64/BoardConfig.mk

একটি মাল্টিলিব বিল্ডে, PRODUCT_PACKAGES এ মডিউল নামগুলি 32-বিট এবং 64-বিট বাইনারি উভয়কেই কভার করে, যতক্ষণ না সেগুলি বিল্ড সিস্টেম দ্বারা সংজ্ঞায়িত করা হয়। নির্ভরতা দ্বারা অন্তর্ভুক্ত লাইব্রেরির জন্য, একটি 32-বিট বা 64-বিট লাইব্রেরি শুধুমাত্র তখনই ইনস্টল করা হয় যখন এটি অন্য 32-বিট বা 64-বিট লাইব্রেরি বা এক্সিকিউটেবলের প্রয়োজন হয়।

যাইহোক, make কমান্ড লাইনের মডিউল নাম শুধুমাত্র 64-বিট সংস্করণকে কভার করে। উদাহরণস্বরূপ, lunch aosp_arm64-eng চালানোর পরে, make libc । 32-বিট libc তৈরি করতে, আপনাকে make libc_32 চালাতে হবে।

Android.mk-এ মডিউল আর্কিটেকচার সংজ্ঞায়িত করুন

আপনি 32 বিট এবং 64 বিটের জন্য আপনার বিল্ড কনফিগার করতে LOCAL_MULTILIB ভেরিয়েবল ব্যবহার করতে পারেন এবং গ্লোবাল TARGET_PREFER_32_BIT ভেরিয়েবলকে ওভাররাইড করতে পারেন।

TARGET_PREFER_32_BIT ওভাররাইড করতে, LOCAL_MULTILIB নিম্নলিখিতগুলির একটিতে সেট করুন:

  • both 32 বিট এবং 64 বিট উভয়ই তৈরি করে।
  • 32 শুধুমাত্র 32 বিট তৈরি করে।
  • 64 শুধুমাত্র 64 বিট তৈরি করে।
  • first শুধুমাত্র প্রথম আর্কিটেকচারের জন্য তৈরি করে (32-বিট ডিভাইসে 32 বিট এবং 64-বিট ডিভাইসে 64 বিট)।

ডিফল্টরূপে, LOCAL_MULTILIB সেট করা হয় না এবং বিল্ড সিস্টেম সিদ্ধান্ত নেয় মডিউল ক্লাস এবং অন্যান্য LOCAL_ * ভেরিয়েবলের উপর ভিত্তি করে কোন আর্কিটেকচার তৈরি করতে হবে, যেমন LOCAL_MODULE_TARGET_ARCH এবং LOCAL_32_BIT_ONLY

আপনি যদি নির্দিষ্ট আর্কিটেকচারের জন্য আপনার মডিউল তৈরি করতে চান তবে নিম্নলিখিত ভেরিয়েবলগুলি ব্যবহার করুন:

  • LOCAL_MODULE_TARGET_ARCH - এই ভেরিয়েবলটিকে আর্কিটেকচারের তালিকায় সেট করুন, যেমন arm x86 arm64 । যদি নির্মাণ করা আর্কিটেকচারটি সেই তালিকায় থাকে, তাহলে বর্তমান মডিউলটি বিল্ড সিস্টেম দ্বারা অন্তর্ভুক্ত করা হয়েছে।

  • LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH - এই ভেরিয়েবলটি LOCAL_MODULE_TARGET_ARCH এর বিপরীত। নির্মাণ করা আর্কিটেকচার সেই তালিকায় not থাকলে, বর্তমান মডিউলটি বিল্ড সিস্টেম দ্বারা অন্তর্ভুক্ত করা হয়।

এই দুটি ভেরিয়েবলের ছোটখাট রূপ রয়েছে:

  • LOCAL_MODULE_TARGET_ARCH_WARN
  • LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH_WARN

তালিকাভুক্ত আর্কিটেকচারের কারণে বর্তমান মডিউলটি এড়িয়ে গেলে বিল্ড সিস্টেম সতর্ক করে।

একটি নির্দিষ্ট আর্কিটেকচারের জন্য বিল্ড পতাকা সেট আপ করতে, আর্কিটেকচার-নির্দিষ্ট LOCAL_ * ভেরিয়েবল ব্যবহার করুন যেখানে * একটি আর্কিটেকচার-নির্দিষ্ট প্রত্যয়, উদাহরণস্বরূপ:

  • LOCAL_SRC_FILES_arm, LOCAL_SRC_FILES_x86,
  • LOCAL_CFLAGS_arm, LOCAL_CFLAGS_arm64,
  • LOCAL_LDFLAGS_arm, LOCAL_LDFLAGS_arm64,

এই ভেরিয়েবলগুলি শুধুমাত্র তখনই প্রয়োগ করা হয় যদি সেই আর্কিটেকচারের জন্য একটি বাইনারি তৈরি করা হয়।

কখনও কখনও বাইনারি 32-বিট বা 64-বিটের জন্য তৈরি করা হচ্ছে কিনা তার উপর ভিত্তি করে পতাকা সেট আপ করা সহজ। একটি _32 বা _64 প্রত্যয় সহ LOCAL_ * ভেরিয়েবল ব্যবহার করুন, উদাহরণস্বরূপ:

  • LOCAL_SRC_FILES_32, LOCAL_SRC_FILES_64,
  • LOCAL_CFLAGS_32, LOCAL_CFLAGS_64,
  • LOCAL_LDFLAGS_32, LOCAL_LDFLAGS_64,

লাইব্রেরি ইনস্টলেশন পাথ সেট করুন

একটি নন-মাল্টিলিব বিল্ডের জন্য, আপনি LOCAL_MODULE_PATH ব্যবহার করতে পারেন ডিফল্ট অবস্থান ছাড়া অন্য কোনো স্থানে একটি লাইব্রেরি ইনস্টল করতে। উদাহরণস্বরূপ, LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw

যাইহোক, একটি মাল্টিলিব বিল্ডে, পরিবর্তে LOCAL_MODULE_RELATIVE_PATH ব্যবহার করুন:

LOCAL_MODULE_RELATIVE_PATH := hw

এই বিন্যাসের সাথে, 64-বিট এবং 32-বিট উভয় লাইব্রেরি সঠিক অবস্থানে ইনস্টল করা আছে।

আপনি যদি 32 বিট এবং 64 বিট উভয় হিসাবে একটি এক্সিকিউটেবল তৈরি করেন তবে ইনস্টল পাথটি আলাদা করতে নিম্নলিখিত ভেরিয়েবলগুলির মধ্যে একটি ব্যবহার করুন:

  • LOCAL_MODULE_STEM_32, LOCAL_MODULE_STEM_64 - ইনস্টল করা ফাইলের নাম নির্দিষ্ট করে।
  • LOCAL_MODULE_PATH_32, LOCAL_MODULE_PATH_64 - ইনস্টল পাথ নির্দিষ্ট করে।

উৎস ফাইলের জন্য মধ্যবর্তী ডিরেক্টরি প্রাপ্ত

একটি মাল্টিলিব বিল্ডে, আপনি যদি সুস্পষ্ট ভেরিয়েবল সহ $(local-intermediates-dir) (বা $(intermediates-dir-for) তে সোর্স ফাইল তৈরি করেন), এটি নির্ভরযোগ্যভাবে কাজ করে না। কারণ 32-বিট এবং 64-বিট বিল্ড উভয়ের জন্যই মধ্যবর্তী উৎপন্ন উৎসের প্রয়োজন হয়, কিন্তু $(local-intermediates-dir) দুটি মধ্যবর্তী ডিরেক্টরির মধ্যে একটিকে নির্দেশ করে।

বিল্ড সিস্টেম উৎস তৈরি করার জন্য একটি ডেডিকেটেড, মাল্টিলিব-বন্ধুত্বপূর্ণ, মধ্যবর্তী ডিরেক্টরি প্রদান করে। মধ্যবর্তী ডিরেক্টরির পাথ পুনরুদ্ধার করতে, $(local-generated-sources-dir) বা $(generated-sources-dir-for) ম্যাক্রো ব্যবহার করুন। এই ম্যাক্রোগুলির ব্যবহার $(local-intermediates-dir) এবং $(intermediates-dir-for) এর মত।

যদি একটি উৎস ফাইল এই ডেডিকেটেড ডিরেক্টরিতে তৈরি করা হয় এবং LOCAL_GENERATED_SOURCES দ্বারা বাছাই করা হয়, এটি একটি মাল্টিলিব বিল্ডে 32 বিট এবং 64 বিট উভয়ের জন্যই তৈরি করা হয়েছে।

পূর্বনির্মাণ বাইনারি লক্ষ্যগুলির সিস্টেম আর্কিটেকচার নির্দেশ করুন

একটি মাল্টিলিব বিল্ডে, আপনি TARGET_ARCH , বা TARGET_ARCH ব্যবহার করতে পারবেন না TARGET_2ND_ARCH এর সাথে মিলিত, পূর্বনির্মাণ বাইনারি লক্ষ্যগুলির সিস্টেম আর্কিটেকচার নির্দেশ করতে। পরিবর্তে, LOCAL_ * ভেরিয়েবল LOCAL_MODULE_TARGET_ARCH বা LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH ব্যবহার করুন।

এই ভেরিয়েবলগুলির সাথে, বিল্ড সিস্টেমটি 64-বিট মাল্টিলিব বিল্ডে কাজ করলেও সংশ্লিষ্ট 32-বিট প্রিবিল্ট বাইনারি বেছে নিতে পারে।

আপনি যদি প্রি-বিল্ট বাইনারির জন্য সোর্স পাথ গণনা করার জন্য নির্বাচিত আর্কিটেকচার ব্যবহার করতে চান, $(get-prebuilt-src-arch) কল করুন।

32-বিট এবং 64-বিট ওডেক্স ফাইল জেনারেশন নিশ্চিত করুন

64-বিট ডিভাইসের জন্য, ডিফল্টরূপে Google বুট ইমেজ এবং যেকোনো জাভা লাইব্রেরির জন্য 32-বিট এবং 64-বিট ODEX ফাইল তৈরি করে। APK-এর জন্য, ডিফল্টরূপে Google শুধুমাত্র প্রাথমিক 64-বিট আর্কিটেকচারের জন্য ODEX তৈরি করে। যদি একটি অ্যাপ 32-বিট এবং 64-বিট উভয় প্রক্রিয়ায় চালু করা হয়, তাহলে LOCAL_MULTILIB := both ব্যবহার করুন যাতে 32-বিট এবং 64-বিট উভয় ODEX ফাইল তৈরি হয়। অ্যাপটিতে যদি কোনো 32-বিট বা 64-বিট JNI লাইব্রেরি থাকে, তাহলে সেই পতাকাটি বিল্ড সিস্টেমকে তাদের অন্তর্ভুক্ত করতে বলে।