ফ্রেমওয়ার্কটি শর্তসাপেক্ষে কম্পাইল করার জন্য ব্যবহৃত সমস্ত বিল্ড ফ্ল্যাগ বর্ণনা করতে আপনাকে অবশ্যই HIDL ব্যবহার করতে হবে। প্রাসঙ্গিক বিল্ড ফ্ল্যাগগুলোকে একত্রিত করে একটিমাত্র .hal ফাইলে অন্তর্ভুক্ত করতে হবে। কনফিগারেশন আইটেম নির্দিষ্ট করার জন্য HIDL ব্যবহারের নিম্নলিখিত সুবিধাগুলো রয়েছে:
- সংস্করণযুক্ত (নতুন কনফিগারেশন আইটেম যোগ করার জন্য, বিক্রেতা/ওইএম-দের অবশ্যই স্পষ্টভাবে এইচএএল প্রসারিত করতে হবে)
- সু-নথিভুক্ত
- SELinux ব্যবহার করে অ্যাক্সেস নিয়ন্ত্রণ
- ভেন্ডর টেস্ট স্যুটের মাধ্যমে কনফিগারেশন আইটেমগুলোর যৌক্তিকতা যাচাই (রেঞ্জ চেক, আইটেমগুলোর মধ্যে পারস্পরিক নির্ভরশীলতা যাচাই, ইত্যাদি)।
- C++ এবং Java উভয় ক্ষেত্রেই স্বয়ংক্রিয়ভাবে তৈরি API
ফ্রেমওয়ার্ক দ্বারা ব্যবহৃত বিল্ড ফ্ল্যাগগুলি সনাক্ত করুন
প্রথমে ফ্রেমওয়ার্কটি শর্তসাপেক্ষে কম্পাইল করতে ব্যবহৃত বিল্ড কনফিগগুলো শনাক্ত করুন, তারপর সেটটিকে ছোট করার জন্য অপ্রচলিত কনফিগগুলো বাদ দিন। উদাহরণস্বরূপ, surfaceflinger জন্য নিম্নলিখিত বিল্ড ফ্ল্যাগ সেটটি শনাক্ত করা হয়েছে:
-
TARGET_USES_HWC2 -
TARGET_BOARD_PLATFORM -
TARGET_DISABLE_TRIPLE_BUFFERING -
TARGET_FORCE_HWC_FOR_VIRTUAL_DISPLAYS -
NUM_FRAMEBUFFER_SURFACE_BUFFERS -
TARGET_RUNNING_WITHOUT_SYNC_FRAMEWORK -
VSYNC_EVENT_PHASE_OFFSET_NS -
SF_VSYNC_EVENT_PHASE_OFFSET_NS -
PRESENT_TIME_OFFSET_FROM_VSYNC_NS -
MAX_VIRTUAL_DISPLAY_DIMENSION
একটি HAL ইন্টারফেস তৈরি করুন
একটি সাবসিস্টেমের বিল্ড কনফিগারেশন একটি HAL ইন্টারফেসের মাধ্যমে অ্যাক্সেস করা হয়, অন্যদিকে কনফিগারেশন ভ্যালু দেওয়ার ইন্টারফেসগুলো android.hardware.configstore (বর্তমানে ভার্সন 1.0) নামক HAL প্যাকেজে গ্রুপ করা থাকে। উদাহরণস্বরূপ, surfaceflinger এর জন্য একটি HAL ইন্টারফেস ফাইল তৈরি করতে, hardware/interfaces/configstore/1.0/ISurfaceFlingerConfigs.hal এ যান:
package android.hardware.configstore@1.0;
interface ISurfaceFlingerConfigs {
// TO-BE-FILLED-BELOW
};
.hal ফাইলটি তৈরি করার পর, নতুন .hal ফাইলটিকে Android.bp এবং Android.mk ফাইলগুলিতে যুক্ত করতে hardware/interfaces/update-makefiles.sh চালান।
বিল্ড ফ্ল্যাগের জন্য ফাংশন যোগ করুন
প্রতিটি বিল্ড ফ্ল্যাগের জন্য, ইন্টারফেসে একটি নতুন ফাংশন যোগ করুন। উদাহরণস্বরূপ, hardware/interfaces/configstore/1.0/ISurfaceFlingerConfigs.hal এ:
interface ISurfaceFlingerConfigs {
disableTripleBuffering() generates(OptionalBool ret);
forceHwcForVirtualDisplays() generates(OptionalBool ret);
enum NumBuffers: uint8_t {
USE_DEFAULT = 0,
TWO = 2,
THREE = 3,
};
numFramebufferSurfaceBuffers() generates(NumBuffers ret);
runWithoutSyncFramework() generates(OptionalBool ret);
vsyncEventPhaseOffsetNs generates (OptionalUInt64 ret);
presentTimeOffsetFromSyncNs generates (OptionalUInt64 ret);
maxVirtualDisplayDimension() generates(OptionalInt32 ret);
};
ফাংশন যোগ করার সময়:
- নাম ব্যবহারে সংক্ষিপ্ত হন। মেকফাইল ভেরিয়েবলের নাম ফাংশনের নামে রূপান্তর করা থেকে বিরত থাকুন এবং মনে রাখবেন যে
TARGET_ওBOARD_প্রিফিক্সগুলোর আর প্রয়োজন নেই। - মন্তব্য যোগ করুন। ডেভেলপারদের কনফিগারেশন আইটেমটির উদ্দেশ্য, এটি কীভাবে ফ্রেমওয়ার্কের আচরণ পরিবর্তন করে, বৈধ মান এবং অন্যান্য প্রাসঙ্গিক তথ্য বুঝতে সাহায্য করুন।
ফাংশনের রিটার্ন টাইপ Optional[Bool|String|Int32|UInt32|Int64|UInt64] হতে পারে। টাইপগুলো একই ডিরেক্টরিতে থাকা types.hal সংজ্ঞায়িত করা হয় এবং এগুলো প্রিমিটিভ ভ্যালুগুলোকে এমন একটি ফিল্ডের মধ্যে আবদ্ধ করে যা নির্দেশ করে যে ভ্যালুটি HAL দ্বারা নির্দিষ্ট করা হয়েছে কিনা; যদি তা না হয়, তবে ডিফল্ট ভ্যালুটি ব্যবহৃত হয়।
struct OptionalString {
bool specified;
string value;
};
প্রয়োজন অনুযায়ী, কনফিগারেশন আইটেমের ধরনকে সবচেয়ে ভালোভাবে উপস্থাপন করে এমন enum-টি সংজ্ঞায়িত করুন এবং সেই enum-টিকে রিটার্ন টাইপ হিসেবে ব্যবহার করুন। উপরের উদাহরণে, বৈধ মানের সংখ্যা সীমিত করার জন্য NumBuffers enum-টি সংজ্ঞায়িত করা হয়েছে। এই ধরনের কাস্টম ডেটা টাইপ সংজ্ঞায়িত করার সময়, মানটি HAL দ্বারা নির্দিষ্ট করা হয়েছে কি না তা বোঝানোর জন্য একটি ফিল্ড বা একটি enum ভ্যালু (উদাহরণস্বরূপ, USE_DEFAULT ) যোগ করুন।
HIDL-এ একটিমাত্র বিল্ড ফ্ল্যাগকে একটি একক ফাংশন বানানো বাধ্যতামূলক নয়। এর বিকল্প হিসেবে, মডিউলের মালিকরা ঘনিষ্ঠভাবে সম্পর্কিত বিল্ড ফ্ল্যাগগুলোকে একটি struct-এ একত্রিত করতে পারেন এবং এমন একটি ফাংশন রাখতে পারেন যা সেই struct-টি রিটার্ন করে (এর ফলে ফাংশন কলের সংখ্যা কমানো যায়)।
উদাহরণস্বরূপ, hardware/interfaces/configstore/1.0/ISurfaceFlingerConfigs.hal এ দুটি বিল্ড ফ্ল্যাগকে একটি একক struct-এ একত্রিত করার একটি বিকল্প হল:
interface ISurfaceFlingerConfigs {
// other functions here
struct SyncConfigs {
OptionalInt64 vsyncEventPhaseoffsetNs;
OptionalInt64 presentTimeoffsetFromSyncNs;
};
getSyncConfigs() generates (SyncConfigs ret);
// other functions here
};
একটি একক HAL ফাংশনের বিকল্পগুলি
সমস্ত বিল্ড ফ্ল্যাগের জন্য একটিমাত্র HAL ফাংশন ব্যবহার করার বিকল্প হিসেবে, HAL ইন্টারফেসটি getBoolean(string key) এবং getInteger(string key) এর মতো সহজ ফাংশনও প্রদান করে। প্রকৃত key=value জোড়াগুলো আলাদা ফাইলে সংরক্ষিত থাকে এবং HAL সার্ভিস সেই ফাইলগুলো পড়ে বা পার্স করে ভ্যালুগুলো সরবরাহ করে।
যদিও এই পদ্ধতিটি সংজ্ঞায়িত করা সহজ, এতে HIDL দ্বারা প্রদত্ত সুবিধাগুলো (বাধ্যতামূলক ভার্সনিং, ডকুমেন্টেশনের সহজলভ্যতা, অ্যাক্সেস কন্ট্রোল) অন্তর্ভুক্ত নেই এবং তাই এটি সুপারিশ করা হয় না।
একক এবং একাধিক ইন্টারফেস
কনফিগারেশন আইটেমগুলির জন্য HAL ইন্টারফেসের ডিজাইনে দুটি বিকল্প রয়েছে:
- একটি একক ইন্টারফেস যা সমস্ত কনফিগারেশন আইটেম অন্তর্ভুক্ত করে
- একাধিক ইন্টারফেস, যার প্রতিটি একগুচ্ছ সম্পর্কিত কনফিগারেশন আইটেমকে অন্তর্ভুক্ত করে।
একটিমাত্র ইন্টারফেস ব্যবহার করা সহজ, কিন্তু ফাইলটিতে যত বেশি কনফিগারেশন আইটেম যোগ করা হয়, ততই এটি রক্ষণাবেক্ষণ-অযোগ্য হয়ে উঠতে পারে। এছাড়াও, অ্যাক্সেস কন্ট্রোল সূক্ষ্ম নয়, তাই কোনো প্রসেসকে ইন্টারফেসে অ্যাক্সেস দেওয়া হলে সে সমস্ত কনফিগারেশন আইটেম পড়তে পারে (কনফিগারেশন আইটেমের কোনো আংশিক সেটে অ্যাক্সেস দেওয়া যায় না)। একইভাবে, অ্যাক্সেস না দেওয়া হলে কনফিগারেশন আইটেমগুলো পড়া যায় না।
এই সমস্যাগুলোর কারণে, অ্যান্ড্রয়েড সম্পর্কিত কনফিগারেশন আইটেমগুলোর একটি গ্রুপের জন্য একটিমাত্র HAL ইন্টারফেসের সাথে একাধিক ইন্টারফেস ব্যবহার করে। উদাহরণস্বরূপ, surfaceflinger -সম্পর্কিত কনফিগারেশন আইটেমগুলোর জন্য ISurfaceflingerConfigs এবং ব্লুটুথ-সম্পর্কিত কনফিগারেশন আইটেমগুলোর জন্য IBluetoothConfigs ।