এইচএল ইন্টারফেস সংজ্ঞা ভাষা বা এইচআইডিএল (উচ্চারণ "আড়াল-এল") একটি ইন্টারফেস বর্ণনার ভাষা (আইডিএল) যা এইচএএল এবং এর ব্যবহারকারীদের মধ্যে ইন্টারফেস নির্দিষ্ট করতে পারে। এটি ইন্টারফেস এবং প্যাকেজগুলিতে সংগ্রহ করা প্রকার এবং পদ্ধতি কলগুলি নির্দিষ্ট করে। আরও বিস্তৃতভাবে, এইচআইডিএল কোডবেসের মধ্যে যোগাযোগের জন্য একটি ব্যবস্থা যা স্বাধীনভাবে সংকলন করা যেতে পারে।
এইচআইডিএল আন্তঃ-প্রক্রিয়া যোগাযোগের জন্য ব্যবহার করার উদ্দেশ্যে করা হয়েছে (আইপিসি)। প্রক্রিয়াগুলির মধ্যে যোগাযোগকে বাইন্ডারাইজড হিসাবে উল্লেখ করা হয়। যে লাইব্রেরিগুলিকে অবশ্যই কোনও প্রক্রিয়াটির সাথে লিঙ্ক করা উচিত, তাদের জন্য পাসথ্রু মোডও পাওয়া যায় (জাভাতে সমর্থিত নয়)।
এইচআইডিএল ডেটা স্ট্রাকচার এবং পদ্ধতি স্বাক্ষরগুলি নির্দিষ্ট করে, প্যাকেজগুলিতে সংগ্রহ করা ইন্টারফেসে (শ্রেণীর অনুরূপ) সংগঠিত। এইচআইডিএল এর বাক্য গঠনটি সি -+ এবং জাভা প্রোগ্রামারদের সাথে পরিচিত দেখাবে, যদিও বিভিন্ন কীওয়ার্ডের সেট রয়েছে। এইচআইডিএল জাভা-স্টাইল টীকাও ব্যবহার করে।
এইচআইডিএল ডিজাইন
এইচআইডিএলের লক্ষ্য হ'ল এইচএলএস পুনর্নির্মাণ না করে ফ্রেমওয়ার্কটি প্রতিস্থাপন করা যেতে পারে। এইচএএলগুলি বিক্রেতারা বা এসওসি প্রস্তুতকারকদের দ্বারা নির্মিত হবে এবং ডিভাইসে একটি /vendor
পার্টিশন স্থাপন করবে, ফ্রেমওয়ার্কটি তার নিজস্ব পার্টিশনে সক্ষম করে, এইচএএলগুলি পুনরায় সংশোধন না করে একটি ওটিএ দ্বারা প্রতিস্থাপন করা হবে।
এইচআইডিএল ডিজাইন নিম্নলিখিত উদ্বেগগুলিতে ভারসাম্য বজায় রেখেছে:
- আন্তঃব্যবহার্যতা । বিভিন্ন আর্কিটেকচার, টুলচেন এবং কনফিগারেশন তৈরির প্রক্রিয়াগুলির মধ্যে নির্ভরযোগ্যভাবে ইন্টারঅ্যাপেবল ইন্টারফেস তৈরি করুন। এইচআইডিএল ইন্টারফেসগুলি সংস্করণযুক্ত এবং সেগুলি প্রকাশের পরে পরিবর্তন করা যায় না।
- দক্ষতা । এইচআইডিএল কপির কার্যক্রমের সংখ্যা হ্রাস করার চেষ্টা করে। এইচআইডিএল-সংজ্ঞায়িত ডেটা সি ++ স্ট্যান্ডার্ড লেআউট ডেটা স্ট্রাকচারগুলিতে সি ++ কোডে সরবরাহ করা হয় যা আনপ্যাকিং ছাড়াই ব্যবহার করা যায়। এইচআইডিএল ভাগ করা মেমরি ইন্টারফেসও সরবরাহ করে এবং, আরপিসি অন্তর্নিহিতভাবে কিছুটা ধীরে ধীরে হওয়ায়, এইচআইডিএল একটি আরপিসি কল ব্যবহার না করে ডেটা স্থানান্তর করার দুটি উপায় সমর্থন করে: শেয়ার্ড মেমোরি এবং একটি দ্রুত বার্তা সারি (এফএমকিউ)।
- স্বজ্ঞাত । HIDL এড়াতে কাঁটা শুধুমাত্র ব্যবহার করে মেমরি মালিকানার বিষয়
in
আরপিসি (দেখুন জন্য পরামিতি অ্যান্ড্রয়েড ইন্টারফেস সংজ্ঞা ভাষা (AIDL) ); পদ্ধতিগুলি থেকে দক্ষতার সাথে ফিরে আসা যায় না এমন মানগুলি কলব্যাক ফাংশনগুলির মাধ্যমে ফিরে আসে। এইচআইডিএল থেকে স্থানান্তর করার জন্য বা এইচআইডিএল থেকে ডেটা গ্রহণের জন্য এইচআইডিএল-তে ডেটা পাঠানো কোনওভাবেই তথ্যের মালিকানা পরিবর্তন করে না — মালিকানা সর্বদা কলিংয়ের সাথে থাকে। তথ্যের জন্য কেবল কথিত ফাংশনটির সময়কালের জন্য অবিরত থাকা দরকার এবং ডাকা ফাংশন রিটার্নের সাথে সাথেই তা ধ্বংস হয়ে যেতে পারে।
পাসথ্রু মোড ব্যবহার করা
অ্যান্ড্রয়েড ও এর পূর্ববর্তী সংস্করণগুলিতে চলমান ডিভাইসগুলিকে আপডেট করার জন্য, আপনি একটি নতুন এইচআইডিএল ইন্টারফেসে প্রচলিত (এবং উত্তরাধিকার) এইচএল উভয়ই মোড়ানো করতে পারেন যা বাইন্ডারাইজড এবং একই-প্রক্রিয়া (পাসথ্রু) মোডগুলিতে এইচএএল পরিবেশন করে। এই মোড়ক HAL এবং অ্যান্ড্রয়েড উভয় কাঠামোর জন্য স্বচ্ছ।
পাসথ্রু মোডটি কেবল সি ++ ক্লায়েন্ট এবং বাস্তবায়নের জন্য উপলব্ধ। অ্যান্ড্রয়েডের পূর্ববর্তী সংস্করণগুলিতে চালিত ডিভাইসের জাভাতে HAL লেখা নেই, তাই জাভা এইচএলগুলি সহজাতভাবে বাইন্ডাইজড।
পাসথ্রু শিরোনাম ফাইল
যখন একটি .hal
ফাইলটি সংকলিত হয়, তখন hidl-gen
বাইন্ডার যোগাযোগের জন্য ব্যবহৃত শিরোনাম ছাড়াও একটি অতিরিক্ত BsFoo.h
হেডার ফাইল BsFoo.h
উত্পাদন করে; এই dlopen
এড হতে ফাংশনগুলি সংজ্ঞায়িত করে। পাসথ্রু এইচএলগুলি একই প্রক্রিয়াতে চালিত হয় যেখানে তারা ডাকা হয়, বেশিরভাগ ক্ষেত্রে পাসথ্রু পদ্ধতিগুলি সরাসরি ফাংশন কল (একই থ্রেড) দ্বারা ডাকা হয়। oneway
পদ্ধতিগুলি তাদের নিজস্ব থ্রেডে চালিত হয় কারণ এইচএএল তাদের প্রক্রিয়া করার জন্য অপেক্ষা করার উদ্দেশ্যে নয় (এর অর্থ পাসথ্রু মোডে oneway
পদ্ধতি ব্যবহার করে এমন কোনও এইচএল অবশ্যই থ্রেড-নিরাপদ হওয়া উচিত)।
একটি IFoo.hal
দেওয়া, BsFoo.h
এইচআইডিএল-উত্পন্ন পদ্ধতিগুলি অতিরিক্ত বৈশিষ্ট্যগুলি সরবরাহ করে (যেমন oneway
লেনদেনকে অন্য থ্রেডে চালিত করা) এই ফাইলটি BpFoo.h
অনুরূপ, তবে বাইন্ডার ব্যবহার করে কল আইপিসি পাস করার পরিবর্তে কাঙ্ক্ষিত ফাংশনগুলি সরাসরি অনুরোধ করা হয়। HALs এর ভবিষ্যত বাস্তবায়ন একাধিক বাস্তবায়ন প্রদান করতে পারে যেমন FooFast HAL এবং একটি FooActurate HAL। এই জাতীয় ক্ষেত্রে, প্রতিটি অতিরিক্ত বাস্তবায়নের জন্য একটি ফাইল তৈরি করা হবে (যেমন, PTFooFast.cpp
এবং PTFooAccurate.cpp
)।
প্যাসথ্রো এইচএলকে বাইন্ডাইজিং
আপনি এইচএএল বাস্তবায়নগুলিকে বাইন্ডাইজ করতে পারেন যা পাসথ্রু মোড সমর্থন করে। একটি HAL ইন্টারফেস abcd@MN::IFoo
, দুটি প্যাকেজ তৈরি করা হয়েছে:
-
abcd@MN::IFoo-impl
। এইচএল এর বাস্তবায়ন রয়েছে এবংIFoo* HIDL_FETCH_IFoo(const char* name)
ফাংশনটি প্রকাশ করে। লিগ্যাসি ডিভাইসগুলিতে, এই প্যাকেজটিdlopen
এড এবংHIDL_FETCH_IFoo
ব্যবহার করে বাস্তবায়ন ইনস্ট্যান্টেশন করাHIDL_FETCH_IFoo
। ব্যবহার করে আপনি বেস কোড জেনারেট করতেhidl-gen
এবং-Lc++-impl
এবং-Landroidbp-impl
। -
abcd@MN::IFoo-service
। পাসথ্রু এইচএল খুলুন এবং একটি বাইন্ডারাইজড পরিষেবা হিসাবে নিজেকে নিবন্ধিত করুন, একই এইচএএল বাস্তবায়নকে পাসথ্রু এবং বাইন্ডাইজড উভয় হিসাবে ব্যবহার করতে সক্ষম করে।
টাইপ দেওয়া IFoo
, আপনি কল করতে পারেন sp<IFoo> IFoo::getService(string name, bool getStub)
এর একটি দৃষ্টান্ত অ্যাক্সেস পেতে IFoo
। যদি getStub
সত্য হয় তবে getStub
getService
কেবলমাত্র পাসথ্রু মোডে এইচএল খোলার চেষ্টা করে। যদি getStub
মিথ্যা হয়, গেট সার্ভিস একটি বাইন্ডাইজড পরিষেবা getService
চেষ্টা করে; যদি এটি ব্যর্থ হয়, তবে এটি পাসথ্রু পরিষেবাটি সন্ধান করার চেষ্টা করে। getStub
পরামিতি ছাড়া কখনোই ব্যবহার করা উচিত defaultPassthroughServiceImplementation
। (অ্যান্ড্রয়েড ও এর সাথে প্রবর্তনকারী ডিভাইসগুলি সম্পূর্ণরূপে বাইন্ডারাইজড ডিভাইস, সুতরাং পাসস্ট্র্রু মোডে একটি পরিষেবা খোলার অনুমতি নেই))
এইচআইডিএল ব্যাকরণ
ডিজাইন অনুসারে, এইচআইডিএল ভাষা সি এর মতো (তবে সি প্রিপ্রসেসর ব্যবহার করে না)। নীচে বর্ণিত সমস্ত বিরামচিহ্ন ( =
এবং |
সুস্পষ্ট ব্যবহার বাদে) ব্যাকরণের অংশ।
দ্রষ্টব্য: এইচআইডিএল কোড শৈলীর বিষয়ে বিশদের জন্য কোড শৈলী গাইড দেখুন ।
-
/** */
একটি ডকুমেন্টেশন মন্তব্য নির্দেশ করে। এগুলি কেবল টাইপ, পদ্ধতি, ক্ষেত্র এবং এনাম মান ঘোষণার ক্ষেত্রে প্রয়োগ করা যেতে পারে। -
/* */
একটি বহুমুখী মন্তব্য নির্দেশ করে। -
//
লাইনের শেষের দিকে একটি মন্তব্য নির্দেশ করে।//
বাদে, নিউলাইনগুলি অন্য কোনও সাদা স্থানের মতো। - নীচের ব্যাকরণে,
//
থেকে লাইনের শেষ//
পাঠ্যটি ব্যাকরণের অংশ নয় তবে পরিবর্তে ব্যাকরণ সম্পর্কে একটি মন্তব্য। -
[empty]
অর্থ শব্দটি খালি থাকতে পারে। -
?
আক্ষরিক বা পদ অনুসরণ করার অর্থ এটি alচ্ছিক। -
...
নির্দেশিত হিসাবে পৃথক বিরামচিহ্নগুলির সাথে শূন্য বা আরও আইটেমযুক্ত ক্রম নির্দেশ করে। এইচআইডিএলে কোনও বৈকল্পিক যুক্তি নেই। - কমাগুলি পৃথক ক্রম উপাদান।
- সেমিকোলনগুলি প্রতিটি উপাদানকে শেষ উপাদান সহ শেষ করে।
- UPPERCASE একটি অযৌক্তিক।
-
italics
একটি টোকেন পরিবার যেমনinteger
বাidentifier
(স্ট্যান্ডার্ড সি পার্সিং বিধি)। -
constexpr
হ'ল সি স্টাইলের ধ্রুবক প্রকাশ (যেমন1 + 1
এবং1 + 1
1L << 3
)) -
import_name
নাম একটি প্যাকেজ বা ইন্টারফেসের নাম, এইচআইডিএল সংস্করণে বর্ণিত হিসাবে যোগ্য । - ছোট হাতের
words
আক্ষরিক টোকেন।
উদাহরণ:
ROOT = PACKAGE IMPORTS PREAMBLE { ITEM ITEM ... } // not for types.hal | PACKAGE IMPORTS ITEM ITEM... // only for types.hal; no method definitions ITEM = ANNOTATIONS? oneway? identifier(FIELD, FIELD ...) GENERATES?; | safe_union identifier { UFIELD; UFIELD; ...}; | struct identifier { SFIELD; SFIELD; ...}; // Note - no forward declarations | union identifier { UFIELD; UFIELD; ...}; | enum identifier: TYPE { ENUM_ENTRY, ENUM_ENTRY ... }; // TYPE = enum or scalar | typedef TYPE identifier; VERSION = integer.integer; PACKAGE = package android.hardware.identifier[.identifier[...]]@VERSION; PREAMBLE = interface identifier EXTENDS EXTENDS = <empty> | extends import_name // must be interface, not package GENERATES = generates (FIELD, FIELD ...) // allows the Binder interface to be used as a type // (similar to typedef'ing the final identifier) IMPORTS = [empty] | IMPORTS import import_name; TYPE = uint8_t | int8_t | uint16_t | int16_t | uint32_t | int32_t | uint64_t | int64_t | float | double | bool | string | identifier // must be defined as a typedef, struct, union, enum or import // including those defined later in the file | memory | pointer | vec<TYPE> | bitfield<TYPE> // TYPE is user-defined enum | fmq_sync<TYPE> | fmq_unsync<TYPE> | TYPE[SIZE] FIELD = TYPE identifier UFIELD = TYPE identifier | safe_union identifier { FIELD; FIELD; ...} identifier; | struct identifier { FIELD; FIELD; ...} identifier; | union identifier { FIELD; FIELD; ...} identifier; SFIELD = TYPE identifier | safe_union identifier { FIELD; FIELD; ...}; | struct identifier { FIELD; FIELD; ...}; | union identifier { FIELD; FIELD; ...}; | safe_union identifier { FIELD; FIELD; ...} identifier; | struct identifier { FIELD; FIELD; ...} identifier; | union identifier { FIELD; FIELD; ...} identifier; SIZE = // Must be greater than zero constexpr ANNOTATIONS = [empty] | ANNOTATIONS ANNOTATION ANNOTATION = | @identifier | @identifier(VALUE) | @identifier(ANNO_ENTRY, ANNO_ENTRY ...) ANNO_ENTRY = identifier=VALUE VALUE = "any text including \" and other escapes" | constexpr | {VALUE, VALUE ...} // only in annotations ENUM_ENTRY = identifier | identifier = constexpr
পরিভাষা
এই বিভাগটি নিম্নলিখিত এইচআইডিএল সম্পর্কিত শর্তাদি ব্যবহার করে:
বাইন্ডাইজড | নির্দেশ করে যে এইচআইডিএল একটি বাইন্ডার-জাতীয় প্রক্রিয়া প্রয়োগ করে প্রক্রিয়াগুলির মধ্যে দূরবর্তী প্রক্রিয়া কলগুলির জন্য ব্যবহৃত হচ্ছে। পাসথ্রুও দেখুন। |
---|---|
কলব্যাক, অ্যাসিনক্রোনাস | এইচএএল ব্যবহারকারী দ্বারা পরিবেশন করা ইন্টারফেস, এইচএএল (একটি এইচআইডিএল পদ্ধতির মাধ্যমে) পাস করেছে এবং যে কোনও সময় এইচএএল দ্বারা ডেটা ফিরিয়ে আনার জন্য ডেকে আনা হয়েছে। |
কলব্যাক, সিঙ্ক্রোনাস | কোনও সার্ভারের এইচআইডিএল পদ্ধতি প্রয়োগ থেকে ক্লায়েন্টকে ডেটা ফেরত দেয়। অকার্যকর বা একক আদিম মান ফেরানোর পদ্ধতিগুলির জন্য অব্যবহৃত। |
ক্লায়েন্ট | প্রক্রিয়া যা একটি নির্দিষ্ট ইন্টারফেসের পদ্ধতিগুলিকে কল করে। এইচএএল বা ফ্রেমওয়ার্ক প্রক্রিয়াটি একটি ইন্টারফেসের ক্লায়েন্ট এবং অন্যজনের একটি সার্ভার হতে পারে। পাসথ্রুও দেখুন। |
প্রসারিত | এমন একটি ইন্টারফেস নির্দেশ করে যা অন্য ইন্টারফেসে পদ্ধতি এবং / অথবা প্রকার যুক্ত করে। একটি ইন্টারফেস কেবল অন্য একটি ইন্টারফেস প্রসারিত করতে পারে। পুরানো প্যাকেজটি তৈরি করতে একই প্যাকেজের নামে একটি ছোটখাটো সংস্করণ ইনক্রিমেন্ট বা নতুন প্যাকেজ (যেমন বিক্রেতার এক্সটেনশান) এর জন্য ব্যবহার করা যেতে পারে। |
উত্পন্ন | একটি ইন্টারফেস পদ্ধতি ইঙ্গিত করে যা ক্লায়েন্টকে মান দেয়। একটি অ-আদিম মান, বা একাধিক মানের ফেরতের জন্য, একটি সিঙ্ক্রোনাস কলব্যাক ফাংশন উত্পন্ন হয়। |
ইন্টারফেস | পদ্ধতি এবং প্রকারের সংগ্রহ। সি ++ বা জাভাতে কোনও শ্রেণিতে অনুবাদিত। একটি ইন্টারফেসের সমস্ত পদ্ধতিকে একই দিকে ডাকা হয়: একটি ক্লায়েন্ট প্রক্রিয়া একটি সার্ভার প্রক্রিয়া দ্বারা প্রয়োগ পদ্ধতিগুলি আহ্বান করে। |
একমুখী | এইচআইডিএল পদ্ধতিতে প্রয়োগ করা হলে, পদ্ধতিটি কোনও মান দেয় না এবং অবরুদ্ধ করে না তা নির্দেশ করে। |
প্যাকেজ | কোনও সংস্করণ ভাগ করে নেওয়ার ইন্টারফেস এবং ডেটা ধরণের সংগ্রহ। |
পাসথ্রু | এইচআইডিএল এর মোড যেখানে সার্ভারটি একটি ভাগ করা লাইব্রেরি, ক্লায়েন্টের দ্বারা dlopen এড। পাসথ্রু মোডে, ক্লায়েন্ট এবং সার্ভার একই প্রক্রিয়া তবে পৃথক কোডবেস। শুধুমাত্র এইচআইডিএল মডেলটিতে লিগ্যাসি কোডবেস আনতে ব্যবহৃত হয়। বাইন্ডারাইজডও দেখুন। |
সার্ভার | প্রক্রিয়া যা কোনও ইন্টারফেসের পদ্ধতি প্রয়োগ করে। পাসথ্রুও দেখুন। |
পরিবহন | এইচআইডিএল অবকাঠামো যা সার্ভার এবং ক্লায়েন্টের মধ্যে ডেটা সরিয়ে দেয়। |
সংস্করণ | একটি প্যাকেজের সংস্করণ। বড় এবং অপ্রাপ্তবয়স্ক দুটি পূর্ণসংখ্যার সমন্বয়ে গঠিত। গৌণ সংস্করণ ইনক্রিমেন্টগুলি (তবে পরিবর্তিত নয়) প্রকার এবং পদ্ধতি যুক্ত করতে পারে। |