64-বিট বিল্ড বোঝা

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

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

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

পণ্য কনফিগারেশন

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

  • TARGET_2ND_ARCH
  • TARGET_2ND_ARCH_VARIANT
  • TARGET_2ND_CPU_VARIANT
  • TARGET_2ND_CPU_ABI
  • TARGET_2ND_CPU_ABI2

আপনি build/target/board/generic_arm64/BoardConfig.mk এ একটি উদাহরণ দেখতে পারেন।

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

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

Android.mk এ মডিউল সংজ্ঞা

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

নিম্নলিখিতগুলির একটিতে LOCAL_MULTILIB সেট করুন:

  • "both" 32 বিট এবং 64 বিট উভয়ই তৈরি করে।
  • "32" শুধুমাত্র 32 বিট তৈরি করে।
  • "64" শুধুমাত্র 64 বিট তৈরি করে।
  • "first" শুধুমাত্র প্রথম আর্কিটেকচারের জন্য তৈরি করে (32-বিট ডিভাইসে 32 বিট এবং 64-বিট ডিভাইসে 64 বিট)।
  • "" ডিফল্ট। বিল্ড সিস্টেম মডিউল ক্লাস এবং অন্যান্য 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 এর বিপরীত। নির্মাণ করা আর্কিটেকচার সেই তালিকায় না থাকলে, বর্তমান মডিউলটি বিল্ড সিস্টেম দ্বারা অন্তর্ভুক্ত করা হয়।

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

  • LOCAL_MODULE_TARGET_ARCH_WARN
  • LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH_WARN

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

একটি নির্দিষ্ট আর্কিটেকচারের জন্য বিল্ড পতাকা সেট আপ করতে, আর্কিটেকচার-নির্দিষ্ট LOCAL_ ভেরিয়েবল ব্যবহার করুন। একটি আর্কিটেকচার-নির্দিষ্ট LOCAL_ ভেরিয়েবল হল একটি সাধারণ 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_2ND_ARCH ) ব্যবহার করতে পারবেন না বিল্ড সিস্টেমকে জানাতে যে প্রি-বিল্ট বাইনারি টার্গেট কি আর্কিটেকচার। পরিবর্তে, LOCAL_ ভেরিয়েবল LOCAL_MODULE_TARGET_ARCH বা LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH ব্যবহার করুন।

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

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

ODEX ফাইল প্রজন্ম

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