HAL ইন্টারফেস তৈরি করুন

শর্তসাপেক্ষে ফ্রেমওয়ার্ক কম্পাইল করার জন্য ব্যবহৃত সমস্ত বিল্ড পতাকা বর্ণনা করতে আপনাকে অবশ্যই 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 ইন্টারফেসের মাধ্যমে অ্যাক্সেস করা হয়, যখন কনফিগারেশন মান দেওয়ার জন্য ইন্টারফেসগুলিকে HAL প্যাকেজ android.hardware.configstore (বর্তমানে 1.0 সংস্করণে) গোষ্ঠীভুক্ত করা হয়। উদাহরণস্বরূপ, hardware/interfaces/configstore/1.0/ISurfaceFlingerConfigs.halsurfaceflinger এর জন্য একটি HAL ইন্টারফেস ফাইল তৈরি করতে:

package android.hardware.configstore@1.0;

interface ISurfaceFlingerConfigs {
    // TO-BE-FILLED-BELOW
};

.hal ফাইলটি তৈরি করার পরে, Android.bp এবং Android.mk ফাইলগুলিতে নতুন .hal ফাইল যোগ করতে 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-এ একটি একক বিল্ড পতাকা একটি একক ফাংশন হওয়ার জন্য এটি বাধ্যতামূলক নয়। মডিউল মালিকরা বিকল্পভাবে একটি স্ট্রাকটে ঘনিষ্ঠভাবে সম্পর্কিত বিল্ড ফ্ল্যাগগুলিকে একত্রিত করতে পারে এবং একটি ফাংশন থাকতে পারে যা সেই স্ট্রাকটটি ফেরত দেয় (এটি করলে ফাংশন কলের সংখ্যা হ্রাস করতে পারে)।

উদাহরণস্বরূপ, hardware/interfaces/configstore/1.0/ISurfaceFlingerConfigs.hal এ দুটি বিল্ড ফ্ল্যাগকে একক কাঠামোতে একত্রিত করার একটি বিকল্প হল:

 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