এইচআইডিএল

এইচএএল ইন্টারফেস সংজ্ঞা ভাষা বা এইচআইডিএল (উচ্চারিত "হাইড-এল") হল একটি এইচএএল এবং এর ব্যবহারকারীদের মধ্যে ইন্টারফেস নির্দিষ্ট করার জন্য একটি ইন্টারফেস বর্ণনা ভাষা (আইডিএল)। এটি ইন্টারফেস এবং প্যাকেজে সংগৃহীত প্রকার এবং পদ্ধতি কল নির্দিষ্ট করার অনুমতি দেয়। আরও বিস্তৃতভাবে, এইচআইডিএল হল কোডবেসের মধ্যে যোগাযোগের একটি ব্যবস্থা যা স্বাধীনভাবে সংকলিত হতে পারে। অ্যান্ড্রয়েড 10 এর হিসাবে, এইচআইডিএল অপ্রচলিত এবং অ্যান্ড্রয়েড সর্বত্র এআইডিএল ব্যবহার করতে চলেছে।

এইচআইডিএল ইন্টার-প্রসেস কমিউনিকেশনের (আইপিসি) জন্য ব্যবহার করার উদ্দেশ্যে। প্রক্রিয়াগুলির মধ্যে যোগাযোগের হিসাবে উল্লেখ করা হয় Binderized । লাইব্রেরি যে একটি প্রক্রিয়া সাথে যুক্ত করা প্রয়োজন, একটি পাসথ্রু মোড উপলব্ধ (জাভা সমর্থিত নয়) হয়।

HIDL ডেটা স্ট্রাকচার এবং পদ্ধতি স্বাক্ষর নির্দিষ্ট করে, ইন্টারফেসে সংগঠিত (একটি ক্লাসের অনুরূপ) যা প্যাকেজে সংগ্রহ করা হয়। HIDL এর সিনট্যাক্স C ++ এবং জাভা প্রোগ্রামারদের কাছে পরিচিত লাগবে, যদিও কীওয়ার্ডের একটি ভিন্ন সেট। এইচআইডিএল জাভা স্টাইলের টীকাগুলিও ব্যবহার করে।

HIDL ডিজাইন

এইচআইডিএলের লক্ষ্য হল এইচএএলগুলি পুনর্নির্মাণ না করেই কাঠামো প্রতিস্থাপন করা যেতে পারে। HALs বিক্রেতাদের বা SOC প্রস্তুতকারকদের দ্বারা নির্মিত এবং রাখা হবে /vendor HALs recompiling ছাড়া ডিভাইসে পার্টিশন, ফ্রেমওয়ার্ক সক্রিয়, তার নিজস্ব পার্টিশন, একটি ওটিএ দিয়ে প্রতিস্থাপিত হবে।

এইচআইডিএল নকশা নিম্নলিখিত উদ্বেগগুলির ভারসাম্য বজায় রাখে:

  • ইনটেরোপিরাবিলিটি। বিভিন্ন আর্কিটেকচার, টুলচেইন এবং বিল্ড কনফিগারেশনের সাথে সংকলিত হতে পারে এমন প্রক্রিয়াগুলির মধ্যে নির্ভরযোগ্যভাবে ইন্টারঅপারেবল ইন্টারফেস তৈরি করুন। HIDL ইন্টারফেসগুলি সংস্করণ করা হয় এবং সেগুলি প্রকাশিত হওয়ার পরে পরিবর্তন করা যায় না।
  • দক্ষতা। HIDL কপি অপারেশনের সংখ্যা কমানোর চেষ্টা করে। HIDL- সংজ্ঞায়িত ডেটা C ++ কোডে C ++ স্ট্যান্ডার্ড লেআউট ডেটা স্ট্রাকচারে বিতরণ করা হয় যা আনপ্যাকিং ছাড়াই ব্যবহার করা যায়। এইচআইডিএল শেয়ার্ড মেমরি ইন্টারফেসও প্রদান করে এবং, যেহেতু RPCs সহজাতভাবে কিছুটা ধীর, HIDL RPC কল ব্যবহার না করে ডেটা ট্রান্সফার করার দুটি উপায় সমর্থন করে: শেয়ার্ড মেমরি এবং একটি ফাস্ট মেসেজ কিউ (FMQ)।
  • স্বজ্ঞাত। HIDL এড়াতে কাঁটা শুধুমাত্র ব্যবহার করে মেমরি মালিকানার বিষয় in আরপিসি (দেখুন জন্য পরামিতি অ্যান্ড্রয়েড ইন্টারফেস সংজ্ঞা ভাষা (AIDL) ); যেসব মান পদ্ধতি থেকে দক্ষতার সাথে ফেরত আনা যায় না তা কলব্যাক ফাংশনের মাধ্যমে ফেরত দেওয়া হয়। ট্রান্সফারের জন্য HIDL- এ ডেটা পাস করা বা HIDL থেকে ডেটা গ্রহণ না করেই ডেটার মালিকানা পরিবর্তন হয় — মালিকানা সবসময় কলিং ফাংশনের সাথে থাকে। ডেটা শুধুমাত্র কল করা ফাংশনের সময়কালের জন্য স্থায়ী হওয়া প্রয়োজন এবং কল করা ফাংশন ফেরত আসার সাথে সাথেই ধ্বংস হয়ে যেতে পারে।

পাসথ্রু মোড ব্যবহার করা

অ্যান্ড্রয়েডের পূর্ববর্তী সংস্করণগুলি অ্যান্ড্রয়েড ও-তে আপডেট করার জন্য, আপনি একটি নতুন এইচআইডিএল ইন্টারফেসে প্রচলিত (এবং উত্তরাধিকার) উভয় এইচএএল মোড়ানো করতে পারেন যা এইচএএলকে বাইন্ডারাইজড এবং একই প্রক্রিয়া (পাসথ্রু) মোডে পরিবেশন করে। এই মোড়ক HAL এবং Android ফ্রেমওয়ার্ক উভয়ের জন্যই স্বচ্ছ।

পাসথ্রু মোড শুধুমাত্র C ++ ক্লায়েন্ট এবং বাস্তবায়নের জন্য উপলব্ধ। অ্যান্ড্রয়েডের আগের সংস্করণগুলো চালানো ডিভাইসগুলিতে জাভাতে HAL লেখা নেই, তাই জাভা HAL গুলি সহজাতভাবে বাইন্ডারাইজড।

যখন একটি .hal ফাইল কম্পাইল করা হয়, hidl-gen একটি অতিরিক্ত পাসথ্রু হেডার ফাইল উৎপন্ন BsFoo.h দপ্তরী যোগাযোগের জন্য ব্যবহৃত হেডার ছাড়াও; এই হেডার সংজ্ঞায়িত ফাংশন হতে dlopen ইডি। যেহেতু পাসথ্রু এইচএএলগুলি একই প্রক্রিয়ায় চালিত হয় যেখানে তাদের বলা হয়, বেশিরভাগ ক্ষেত্রে পাসথ্রু পদ্ধতিগুলি সরাসরি ফাংশন কল (একই থ্রেড) দ্বারা আহ্বান করা হয়। oneway পদ্ধতি তাদের নিজস্ব থ্রেড চালানো যেমন তারা তাদের (এই উপায়ে কোনো করতো HAL যে ব্যবহারসমূহ প্রক্রিয়া করতো HAL জন্য অপেক্ষা করতে উদ্দেশ্যে না হয় oneway পাসথ্রু মোডে পদ্ধতি থ্রেড-নিরাপদ হতে হবে)।

একটি প্রদত্ত IFoo.hal , BsFoo.h HIDL-জেনারেট পদ্ধতি গোপন (যেমন উপার্জন যেমন অতিরিক্ত বৈশিষ্ট্য প্রদান oneway অন্য থ্রেড চালানো লেনদেনের)। এই ফাইলটি অনুরূপ BpFoo.h তবে পরিবর্তে কল আইপিসি দপ্তরী ব্যবহার করে পাশ করার, পছন্দসই ফাংশন সরাসরি প্রার্থনা করছে। HALs ভবিষ্যত বাস্তবায়নের যেমন FooFast করতো HAL এবং FooAccurate করতো HAL হিসাবে একাধিক বাস্তবায়নের, প্রদান করতে পারে। এই ক্ষেত্রে, প্রতিটি অতিরিক্ত বাস্তবায়নের জন্য একটি ফাইল তৈরি করা হবে (যেমন, PTFooFast.cpp এবং PTFooAccurate.cpp )।

HALs দ্বারা বাইন্ডারাইজিং পাসথ্রু

আপনি HAL বাস্তবায়নগুলিকে বাঁধাই করতে পারেন যা পাসথ্রু মোড সমর্থন করে। প্রদত্ত করতো HAL ইন্টারফেস abcd@MN::IFoo , দুই প্যাকেজ তৈরি করা হয়:

  • abcd@MN::IFoo-impl । করতো HAL বাস্তবায়ন উল্লেখ থাকে এবং অনাবৃত কাজ IFoo* HIDL_FETCH_IFoo(const char* name) । উত্তরাধিকার ডিভাইসগুলিতে, এই প্যাকেজ dlopen ইডি এবং বাস্তবায়ন ব্যবহার instantiated হয় HIDL_FETCH_IFoo । ব্যবহার করে আপনি বেস কোড জেনারেট করতে hidl-gen এবং -Lc++-impl এবং -Landroidbp-impl
  • abcd@MN::IFoo-service । পাসথ্রু এইচএএল খোলে এবং নিজেকে একটি বাইন্ডারাইজড পরিষেবা হিসাবে নিবন্ধন করে, একই এইচএএল বাস্তবায়নকে পাসথ্রু এবং বাইন্ডারাইজড উভয় হিসাবে ব্যবহার করতে সক্ষম করে।

টাইপ দেওয়া IFoo , আপনি কল করতে পারেন sp<IFoo> IFoo::getService(string name, bool getStub) এর একটি দৃষ্টান্ত অ্যাক্সেস পেতে IFoo । তাহলে getStub সত্য, getService প্রচেষ্টা শুধুমাত্র পাসথ্রু মোডে করতো HAL খুলতে। তাহলে getStub মিথ্যা, getService প্রচেষ্টা একটি binderized সেবা খুঁজে পেতে; যদি এটি ব্যর্থ হয়, তাহলে এটি পাসথ্রু পরিষেবাটি খুঁজে বের করার চেষ্টা করে। getStub পরামিতি ছাড়া কখনোই ব্যবহার করা উচিত defaultPassthroughServiceImplementation । (অ্যান্ড্রয়েড ও দিয়ে চালু হওয়া ডিভাইসগুলি সম্পূর্ণ বাইন্ডারাইজড ডিভাইস, তাই পাসথ্রু মোডে একটি পরিষেবা খোলার অনুমতি নেই।)

HIDL ব্যাকরণ

নকশা দ্বারা, এইচআইডিএল ভাষা সি এর অনুরূপ (কিন্তু সি প্রিপ্রসেসর ব্যবহার করে না)। সমস্ত যতিচিহ্ন নীচে বর্ণিত নেই (সরাইয়া এর সুস্পষ্ট ব্যবহার থেকে = এবং | ) ব্যাকরণ অংশ।

নোট: HIDL কোড শৈলী বিস্তারিত জানার জন্য দেখুন কোড স্টাইল গাইড

  • /** */ একটি ডকুমেন্টেশন মন্তব্য নির্দেশ করে। এগুলি কেবল টাইপ, পদ্ধতি, ক্ষেত্র এবং এনাম মান ঘোষণার ক্ষেত্রে প্রয়োগ করা যেতে পারে।
  • /* */ একটি একাধিক লাইন মন্তব্য নির্দেশ করে।
  • // লাইনের শেষ পর্যন্ত একটি মন্তব্য নির্দেশ করে। সরাইয়া থেকে // , নতুন লাইন অন্য কোন হোয়াইটস্পেস মতই।
  • নীচের উদাহরণে ব্যাকরণ সালে থেকে টেক্সট // লাইন শেষে ব্যাকরণ অংশ নয় কিন্তু এর পরিবর্তে ব্যাকরণ উপর একটি মন্তব্য।
  • [empty] মানে যে শব্দ খালি হতে পারে।
  • ? একটি আক্ষরিক বা শব্দ অনুসরণ মানে এটা alচ্ছিক।
  • ... ইঙ্গিত ক্রম যতিচিহ্ন পৃথক হিসাবে উল্লিখিত সঙ্গে শূন্য বা তার বেশি আইটেম রয়েছে। এইচআইডিএলে কোন বৈচিত্র্যময় যুক্তি নেই।
  • কমা পৃথক ক্রম উপাদান।
  • সেমিকোলন শেষ উপাদান সহ প্রতিটি উপাদানকে শেষ করে।
  • UPPERCASE একটি nonterminal।
  • italics একটি টোকেন পরিবার যেমন হয় integer বা identifier (আদর্শ সি পার্সিং নিয়ম)।
  • constexpr একটি সি শৈলী ধ্রুবক অভিব্যক্তি (যেমন 1 + 1 এবং 1L << 3 )।
  • import_name একটি প্যাকেজ বা ইন্টারফেস নাম, যোগ্যতাসম্পন্ন বর্ণনা অনুযায়ী হয় HIDL ভারশনিং
  • ছোট হাতের 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

পরিভাষা

এই বিভাগটি নিম্নলিখিত HIDL- সম্পর্কিত পদ ব্যবহার করে:

বাঁধাই করা নির্দেশ করে যে HIDL প্রক্রিয়াগুলির মধ্যে দূরবর্তী পদ্ধতিতে কল করার জন্য ব্যবহার করা হচ্ছে, যা বাইন্ডারের মতো প্রক্রিয়া দ্বারা প্রয়োগ করা হয়। আরও দেখুন পাসথ্রু।
কলব্যাক, অ্যাসিঙ্ক্রোনাস এইচএএল ব্যবহারকারীর দেওয়া ইন্টারফেস, এইচএএল -এ (এইচআইডিএল পদ্ধতির মাধ্যমে) প্রেরণ করা হয় এবং এইচএএল যে কোনো সময় ডেটা ফেরত দেওয়ার জন্য ফোন করে।
কলব্যাক, সিঙ্ক্রোনাস সার্ভারের HIDL পদ্ধতি বাস্তবায়ন থেকে ক্লায়েন্টের কাছে ডেটা ফেরত দেয়। অকার্যকর পদ্ধতি বা একক আদিম মান ফেরত দেওয়ার জন্য অব্যবহৃত।
ক্লায়েন্ট প্রক্রিয়া যা একটি নির্দিষ্ট ইন্টারফেসের পদ্ধতিগুলিকে কল করে। একটি এইচএএল বা কাঠামো প্রক্রিয়া একটি ইন্টারফেসের ক্লায়েন্ট এবং অন্যের সার্ভার হতে পারে। আরও দেখুন পাসথ্রু।
প্রসারিত একটি ইন্টারফেস নির্দেশ করে যা অন্য ইন্টারফেসে পদ্ধতি এবং/অথবা প্রকার যোগ করে। একটি ইন্টারফেস শুধুমাত্র অন্য একটি ইন্টারফেস প্রসারিত করতে পারে। একই প্যাকেজের নামে একটি ছোট সংস্করণ বৃদ্ধির জন্য অথবা একটি নতুন প্যাকেজের জন্য (যেমন একটি বিক্রেতা এক্সটেনশন) পুরানো প্যাকেজ তৈরির জন্য ব্যবহার করা যেতে পারে।
উৎপন্ন করে একটি ইন্টারফেস পদ্ধতি নির্দেশ করে যা ক্লায়েন্টকে মান প্রদান করে। একটি অ-আদিম মান, বা একাধিক মান ফেরত দিতে, একটি সিঙ্ক্রোনাস কলব্যাক ফাংশন উৎপন্ন হয়।
ইন্টারফেস পদ্ধতি এবং প্রকার সংগ্রহ। C ++ বা জাভাতে একটি ক্লাসে অনুবাদ করা হয়েছে। একটি ইন্টারফেসের সমস্ত পদ্ধতি একই দিকে বলা হয়: একটি ক্লায়েন্ট প্রক্রিয়া একটি সার্ভার প্রক্রিয়া দ্বারা প্রয়োগ করা পদ্ধতিগুলিকে আমন্ত্রণ জানায়।
একমুখী যখন একটি HIDL পদ্ধতিতে প্রয়োগ করা হয়, নির্দেশ করে যে পদ্ধতিটি কোন মান দেয় না এবং ব্লক করে না।
প্যাকেজ একটি সংস্করণ ভাগ করা ইন্টারফেস এবং ডেটা প্রকারের সংগ্রহ।
পাসথ্রু HIDL মোড যা সার্ভারের একটি ভাগ গ্রন্থাগার, হয় dlopen ক্লায়েন্ট দ্বারা ইডি। পাসথ্রু মোডে, ক্লায়েন্ট এবং সার্ভার একই প্রক্রিয়া কিন্তু আলাদা কোডবেস। শুধুমাত্র HIDL মডেলে লিগ্যাসি কোডবেস আনতে ব্যবহার করা হয়। আরও দেখুন Binderized।
সার্ভার প্রক্রিয়া যা একটি ইন্টারফেসের পদ্ধতি প্রয়োগ করে। আরও দেখুন পাসথ্রু।
পরিবহন HIDL অবকাঠামো যা সার্ভার এবং ক্লায়েন্টের মধ্যে ডেটা স্থানান্তর করে।
সংস্করণ একটি প্যাকেজের সংস্করণ। দুটি পূর্ণসংখ্যা নিয়ে গঠিত, প্রধান এবং ছোট। গৌণ সংস্করণ বৃদ্ধি বৃদ্ধি এবং পরিবর্তন করতে পারে।