বিল্ড সিস্টেমটি একই বিল্ডে দুটি টার্গেট সিপিইউ আর্কিটেকচার, ৩২-বিট এবং ৬৪-বিট, এর জন্য বাইনারি তৈরি করা সমর্থন করে। এই দ্বি-টার্গেট বিল্ডটি মাল্টিলিব বিল্ড নামে পরিচিত।
বিল্ট-ইন স্ট্যাটিক লাইব্রেরি এবং শেয়ার্ড লাইব্রেরির জন্য, বিল্ড সিস্টেম উভয় আর্কিটেকচারের বাইনারি তৈরির নিয়ম নির্ধারণ করে। প্রোডাক্ট কনফিগারেশন ( PRODUCT_PACKAGES ), ডিপেন্ডেন্সি গ্রাফের সাথে মিলে, নির্ধারণ করে কোন বাইনারিগুলো বিল্ড করে সিস্টেম ইমেজে ইনস্টল করা হবে।
এক্সিকিউটেবল এবং অ্যাপের ক্ষেত্রে, বিল্ড সিস্টেম ডিফল্টরূপে শুধুমাত্র ৬৪-বিট সংস্করণটি বিল্ড করে, কিন্তু আপনি একটি গ্লোবাল BoardConfig.mk ভেরিয়েবল অথবা একটি মডিউল-স্কোপড ভেরিয়েবল ব্যবহার করে এই সেটিংটি ওভাররাইড করতে পারেন।
দ্বিতীয় একটি সিপিইউ আর্কিটেকচার এবং এবিআই শনাক্ত করুন।
দ্বিতীয় সিপিইউ আর্কিটেকচার এবং অ্যাপ্লিকেশন বাইনারি ইন্টারফেস (এবিআই) কনফিগার করার জন্য BoardConfig.mk নিম্নলিখিত ভেরিয়েবলগুলো অন্তর্ভুক্ত রয়েছে:
-
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 এর মডিউল নামগুলো ৩২-বিট এবং ৬৪-বিট উভয় বাইনারিকেই অন্তর্ভুক্ত করে, যদি সেগুলো বিল্ড সিস্টেম দ্বারা সংজ্ঞায়িত থাকে। ডিপেন্ডেন্সির মাধ্যমে অন্তর্ভুক্ত লাইব্রেরিগুলোর ক্ষেত্রে, একটি ৩২-বিট বা ৬৪-বিট লাইব্রেরি তখনই ইনস্টল করা হয়, যখন অন্য কোনো ৩২-বিট বা ৬৪-বিট লাইব্রেরি বা এক্সিকিউটেবলের জন্য সেটির প্রয়োজন হয়।
তবে, make কমান্ড লাইনের মডিউলের নামগুলো শুধুমাত্র ৬৪-বিট সংস্করণকেই সমর্থন করে। উদাহরণস্বরূপ, lunch aosp_arm64-eng চালানোর পর, make libc শুধুমাত্র ৬৪-বিট libc বিল্ড করে। ৩২-বিট libc বিল্ড করার জন্য, আপনাকে make libc_32 চালাতে হবে।
Android.mk-তে মডিউল আর্কিটেকচার সংজ্ঞায়িত করুন
আপনি LOCAL_MULTILIB ভেরিয়েবল ব্যবহার করে আপনার বিল্ডকে ৩২-বিট ও ৬৪-বিটের জন্য কনফিগার করতে পারেন এবং গ্লোবাল TARGET_PREFER_32_BIT ভেরিয়েবলটিকে ওভাররাইড করতে পারেন।
TARGET_PREFER_32_BIT ওভাররাইড করতে, LOCAL_MULTILIB নিম্নলিখিতগুলির মধ্যে একটিতে সেট করুন:
-
bothবিল্ডেই ৩২-বিট এবং ৬৪-বিট উভয়ই রয়েছে। -
32বিল্ড শুধুমাত্র ৩২-বিটের। -
64বিল্ড শুধুমাত্র ৬৪ বিটের। -
firstবিল্ডগুলো শুধুমাত্র প্রথম আর্কিটেকচারের জন্য তৈরি করা হয় (৩২-বিট ডিভাইসে ৩২-বিট এবং ৬৪-বিট ডিভাইসে ৬৪-বিট)।
ডিফল্টরূপে, 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 সাফিক্স সহ 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
এই ফরম্যাটে ৬৪-বিট এবং ৩২-বিট উভয় লাইব্রেরিই সঠিক স্থানে ইনস্টল হয়।
যদি আপনি একটি এক্সিকিউটেবল ফাইল ৩২-বিট এবং ৬৪-বিট উভয় ফরম্যাটে তৈরি করেন, তাহলে ইনস্টল পাথ আলাদা করার জন্য নিম্নলিখিত ভেরিয়েবলগুলোর মধ্যে একটি ব্যবহার করুন:
-
LOCAL_MODULE_STEM_32, LOCAL_MODULE_STEM_64- ইনস্টল করা ফাইলের নাম নির্দিষ্ট করে। -
LOCAL_MODULE_PATH_32, LOCAL_MODULE_PATH_64- ইনস্টল করার পথ নির্দিষ্ট করে।
উৎস ফাইলগুলির জন্য মধ্যবর্তী ডিরেক্টরি সংগ্রহ করুন
একটি মাল্টিলিব বিল্ডে, যদি আপনি $(local-intermediates-dir) -এ (অথবা সুস্পষ্ট ভেরিয়েবল ব্যবহার করে $(intermediates-dir-for) এ সোর্স ফাইল জেনারেট করেন, তবে এটি নির্ভরযোগ্যভাবে কাজ করে না। এর কারণ হলো, জেনারেট করা ইন্টারমিডিয়েট সোর্সগুলো ৩২-বিট এবং ৬৪-বিট উভয় বিল্ডের জন্যই প্রয়োজন হয়, কিন্তু $(local-intermediates-dir) দুটি ইন্টারমিডিয়েট ডিরেক্টরির মধ্যে শুধুমাত্র একটিকে নির্দেশ করে।
বিল্ড সিস্টেম সোর্স জেনারেট করার জন্য একটি ডেডিকেটেড, মাল্টিলিব-ফ্রেন্ডলি, ইন্টারমিডিয়েট ডিরেক্টরি প্রদান করে। ইন্টারমিডিয়েট ডিরেক্টরির পাথ পেতে, $(local-generated-sources-dir) অথবা $(generated-sources-dir-for) ম্যাক্রো ব্যবহার করুন। এই ম্যাক্রোগুলোর ব্যবহার $(local-intermediates-dir) এবং $(intermediates-dir-for) -এর মতোই।
যদি এই নির্দিষ্ট ডিরেক্টরিতে একটি সোর্স ফাইল তৈরি করা হয় এবং LOCAL_GENERATED_SOURCES সেটি গ্রহণ করে, তাহলে একটি মাল্টিলিব বিল্ডে এটি ৩২-বিট এবং ৬৪-বিট উভয়ের জন্যই বিল্ড করা হয়।
পূর্ব-নির্মিত বাইনারি টার্গেটগুলির সিস্টেম আর্কিটেকচার নির্দেশ করুন।
একটি মাল্টিলিব বিল্ডে, প্রি-বিল্ট বাইনারি টার্গেটগুলোর সিস্টেম আর্কিটেকচার নির্দেশ করার জন্য আপনি TARGET_ARCH , অথবা TARGET_ARCH TARGET_2ND_ARCH ব্যবহার করতে পারবেন না। এর পরিবর্তে, LOCAL_MODULE_TARGET_ARCH অথবা LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH এই LOCAL_ * ভ্যারিয়েবলগুলো ব্যবহার করুন।
এই ভেরিয়েবলগুলোর সাহায্যে, বিল্ড সিস্টেম একটি ৬৪-বিট মাল্টিলিব বিল্ডে কাজ করার সময়েও সংশ্লিষ্ট ৩২-বিট প্রি-বিল্ট বাইনারিটি বেছে নিতে পারে।
যদি আপনি নির্বাচিত আর্কিটেকচার ব্যবহার করে প্রি-বিল্ট বাইনারির সোর্স পাথ গণনা করতে চান, তাহলে $(get-prebuilt-src-arch) কল করুন।
৩২-বিট এবং ৬৪-বিট ODEX ফাইল তৈরি নিশ্চিত করুন
৬৪-বিট ডিভাইসের জন্য, গুগল ডিফল্টভাবে বুট ইমেজ এবং যেকোনো জাভা লাইব্রেরির জন্য ৩২-বিট ও ৬৪-বিট উভয় ODEX ফাইল তৈরি করে। APK-এর জন্য, গুগল ডিফল্টভাবে শুধুমাত্র মূল ৬৪-বিট আর্কিটেকচারের জন্য ODEX তৈরি করে। যদি কোনো অ্যাপ ৩২-বিট এবং ৬৪-বিট উভয় প্রসেসে চালু করা হয়, তবে ৩২-বিট এবং ৬৪-বিট উভয় ODEX ফাইল তৈরি নিশ্চিত করতে LOCAL_MULTILIB := both ব্যবহার করুন। যদি অ্যাপটিতে কোনো ৩২-বিট বা ৬৪-বিট JNI লাইব্রেরি থাকে, তবে এই ফ্ল্যাগটি বিল্ড সিস্টেমকে সেগুলো অন্তর্ভুক্ত করতেও নির্দেশ দেয়।