HIDL

एचएएल इंटरफ़ेस परिभाषा भाषा या एचआईडीएल (उच्चारण "छिपाना-एल") एक एचएएल और उसके उपयोगकर्ताओं के बीच इंटरफ़ेस निर्दिष्ट करने के लिए एक इंटरफ़ेस विवरण भाषा (आईडीएल) है। यह इंटरफेस और पैकेज में एकत्रित प्रकार और विधि कॉल निर्दिष्ट करने की अनुमति देता है। मोटे तौर पर, एचआईडीएल कोडबेस के बीच संचार के लिए एक प्रणाली है जिसे स्वतंत्र रूप से संकलित किया जा सकता है। Android 10 के अनुसार, HIDL को हटा दिया गया है और Android हर जगह AIDL का उपयोग करने के लिए माइग्रेट कर रहा है।

HIDL का उपयोग इंटर-प्रोसेस कम्युनिकेशन (IPC) के लिए किया जाना है। प्रक्रियाओं के बीच संचार के रूप में जाना जाता है Binderized । पुस्तकालयों है कि एक प्रक्रिया से जोड़ा जाना चाहिए के लिए, एक पासथ्रू मोड भी उपलब्ध है (जावा में समर्थित नहीं) है।

HIDL डेटा संरचनाओं और विधि हस्ताक्षरों को निर्दिष्ट करता है, जो इंटरफेस में व्यवस्थित होते हैं (एक वर्ग के समान) जो पैकेज में एकत्र किए जाते हैं। एचआईडीएल का सिंटैक्स सी ++ और जावा प्रोग्रामर के लिए परिचित लगेगा, हालांकि कीवर्ड के एक अलग सेट के साथ। HIDL जावा-शैली एनोटेशन का भी उपयोग करता है।

एचआईडीएल डिजाइन

एचआईडीएल का लक्ष्य यह है कि एचएएल के पुनर्निर्माण के बिना ढांचे को बदला जा सकता है। HALs विक्रेताओं या एसओसी निर्माताओं द्वारा बनाया गया है और एक में रखा जाएगा /vendor HALs recompiling के बिना डिवाइस पर विभाजन, ढांचे को सक्षम करने, अपने स्वयं के विभाजन में, एक ओटीए के साथ बदला जाएगा।

एचआईडीएल डिजाइन निम्नलिखित चिंताओं को संतुलित करता है:

  • इंटरोऑपरेबिलिटी। विभिन्न आर्किटेक्चर, टूलचेन और बिल्ड कॉन्फ़िगरेशन के साथ संकलित की जा सकने वाली प्रक्रियाओं के बीच मज़बूती से इंटरऑपरेबल इंटरफेस बनाएं। HIDL इंटरफेस संस्करणबद्ध हैं और प्रकाशित होने के बाद इन्हें बदला नहीं जा सकता है।
  • क्षमता। HIDL प्रतिलिपि संचालन की संख्या को कम करने का प्रयास करता है। HIDL- परिभाषित डेटा C++ कोड को C++ मानक लेआउट डेटा संरचनाओं में वितरित किया जाता है जिसका उपयोग बिना पैकिंग के किया जा सकता है। एचआईडीएल साझा मेमोरी इंटरफेस भी प्रदान करता है और, चूंकि आरपीसी स्वाभाविक रूप से कुछ हद तक धीमा है, एचआईडीएल आरपीसी कॉल का उपयोग किए बिना डेटा स्थानांतरित करने के दो तरीकों का समर्थन करता है: साझा स्मृति और एक तेज संदेश कतार (एफएमक्यू)।
  • सहज। HIDL टाल कांटेदार केवल का उपयोग करके स्मृति स्वामित्व के मुद्दों in आरपीसी (देखें के लिए मानकों एंड्रॉयड इंटरफ़ेस परिभाषा भाषा (AIDL) ); वे मान जिन्हें विधियों से कुशलता से वापस नहीं किया जा सकता है, कॉलबैक फ़ंक्शंस के माध्यम से वापस कर दिए जाते हैं। ट्रांसफर के लिए न तो डेटा को HIDL में पास करना और न ही HIDL से डेटा प्राप्त करना डेटा के स्वामित्व को बदलता है-स्वामित्व हमेशा कॉलिंग फ़ंक्शन के पास रहता है। डेटा को केवल कॉल किए गए फ़ंक्शन की अवधि के लिए बने रहने की आवश्यकता होती है और कॉल किए गए फ़ंक्शन के वापस आने के तुरंत बाद नष्ट हो सकता है।

पासथ्रू मोड का उपयोग करना

Android के पुराने संस्करणों को चलाने वाले उपकरणों को Android O में अपडेट करने के लिए, आप पारंपरिक (और विरासत) दोनों HALs को एक नए HIDL इंटरफ़ेस में लपेट सकते हैं जो HAL को बाइंडराइज़्ड और समान-प्रक्रिया (पासथ्रू) मोड में कार्य करता है। यह रैपिंग एचएएल और एंड्रॉइड फ्रेमवर्क दोनों के लिए पारदर्शी है।

पासथ्रू मोड केवल C++ क्लाइंट और कार्यान्वयन के लिए उपलब्ध है। Android के पुराने संस्करणों को चलाने वाले उपकरणों में जावा में HAL नहीं लिखा होता है, इसलिए Java HALs स्वाभाविक रूप से बाइंडराइज़्ड होते हैं।

जब एक .hal फ़ाइल संकलित किया गया है, hidl-gen एक अतिरिक्त पासथ्रू हेडर फाइल का उत्पादन BsFoo.h बांधने की मशीन संचार के लिए इस्तेमाल हेडर के अलावा; इस हेडर परिभाषित कार्यों होने के लिए dlopen एड। चूंकि पासथ्रू एचएएल उसी प्रक्रिया में चलते हैं जिसमें उन्हें बुलाया जाता है, ज्यादातर मामलों में प्रत्यक्ष फ़ंक्शन कॉल (एक ही थ्रेड) द्वारा पासथ्रू विधियों को लागू किया जाता है। oneway तरीकों को अपने स्वयं के सूत्र में चलाने के रूप में वे उन्हें (इस का मतलब है किसी भी एचएएल कि का उपयोग करता है कार्रवाई करने के लिए एचएएल के लिए प्रतीक्षा करने का इरादा नहीं है oneway पासथ्रू मोड में तरीकों धागा सुरक्षित होना चाहिए)।

एक को देखते हुए IFoo.hal , BsFoo.h HIDL-उत्पन्न तरीकों लपेटता (जैसे बनाने के रूप में अतिरिक्त सुविधाओं को प्रदान करने के oneway एक और धागा में चलाने के लेन-देन)। इस फ़ाइल के समान है BpFoo.h लेकिन बजाय कॉल आईपीसी बांधने की मशीन का उपयोग करने पर पास करने का,, वांछित कार्यों सीधे लागू कर रहे हैं। HALs का भविष्य कार्यान्वयन ऐसे FooFast एचएएल और एक FooAccurate एचएएल के रूप में कई कार्यान्वयन, प्रदान कर सकता है। ऐसे मामलों में, प्रत्येक अतिरिक्त कार्यान्वयन के लिए एक फ़ाइल बनाई किया जाएगा (जैसे, PTFooFast.cpp और PTFooAccurate.cpp )।

पासथ्रू HALs को बांधना

आप एचएएल कार्यान्वयन को बाँध सकते हैं जो पासथ्रू मोड का समर्थन करते हैं। यह देखते हुए एक एचएएल इंटरफ़ेस abcd@MN::IFoo , दो संकुल बनाई गई हैं:

  • abcd@MN::IFoo-impl । एचएएल के कार्यान्वयन शामिल है और उजागर ढंग से काम 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 प्रयास केवल पासथ्रू मोड में एचएएल को खोलने के लिए। यदि getStub गलत है, getService प्रयास binderized सेवा खोजने के लिए; यदि वह विफल रहता है, तो वह पासथ्रू सेवा खोजने का प्रयास करता है। getStub पैरामीटर को छोड़कर कभी नहीं इस्तेमाल किया जाना चाहिए defaultPassthroughServiceImplementation । (एंड्रॉइड ओ के साथ लॉन्च होने वाले डिवाइस पूरी तरह से बाइंडर किए गए डिवाइस हैं, इसलिए पासथ्रू मोड में किसी सेवा को खोलने की अनुमति नहीं है।)

एचआईडीएल व्याकरण

डिज़ाइन के अनुसार, HIDL भाषा C के समान है (लेकिन C प्रीप्रोसेसर का उपयोग नहीं करती है)। सभी विराम चिह्न के नीचे वर्णित नहीं (एक तरफ का स्पष्ट उपयोग से = और | ) व्याकरण का हिस्सा है।

नोट: HIDL कोड शैली पर जानकारी के लिए, कोड स्टाइल गाइड

  • /** */ एक प्रलेखन टिप्पणी इंगित करता है। इन्हें केवल टाइप, मेथड, फील्ड और एनम वैल्यू डिक्लेरेशन पर लागू किया जा सकता है।
  • /* */ एक बहु टिप्पणी इंगित करता है।
  • // पंक्ति के अंत के लिए एक टिप्पणी इंगित करता है। एक तरफ से // , नई पंक्तियां किसी अन्य खाली स्थान के रूप में एक ही कर रहे हैं।
  • नीचे दिए गए उदाहरण व्याकरण में, से पाठ // पंक्ति के अंत में व्याकरण का हिस्सा नहीं है, लेकिन इसके बजाय व्याकरण पर एक टिप्पणी है।
  • [empty] का मतलब है कि अवधि खाली हो सकता है।
  • ? शाब्दिक या शब्द का अनुसरण करने का अर्थ है कि यह वैकल्पिक है।
  • ... इंगित करता है अनुक्रम विराम चिह्न को अलग करने के रूप में इंगित साथ शून्य या अधिक आइटम हैं। HIDL में कोई भिन्न तर्क नहीं हैं।
  • अल्पविराम अलग अनुक्रम तत्व।
  • अर्धविराम अंतिम तत्व सहित प्रत्येक तत्व को समाप्त करता है।
  • अपरकेस एक नॉनटर्मिनल है।
  • 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 विधि कार्यान्वयन से डेटा लौटाता है। उन तरीकों के लिए उपयोग नहीं किया जाता है जो शून्य या एकल आदिम मान लौटाते हैं।
ग्राहक प्रक्रिया जो किसी विशेष इंटरफ़ेस के तरीकों को कॉल करती है। एक HAL या फ्रेमवर्क प्रक्रिया एक इंटरफ़ेस का क्लाइंट और दूसरे का सर्वर हो सकता है। यह भी देखें पासथ्रू।
फैली एक इंटरफ़ेस इंगित करता है जो किसी अन्य इंटरफ़ेस में विधियों और/या प्रकारों को जोड़ता है। एक इंटरफ़ेस केवल एक अन्य इंटरफ़ेस का विस्तार कर सकता है। एक ही पैकेज नाम में मामूली संस्करण वृद्धि के लिए या पुराने पैकेज पर निर्माण के लिए एक नए पैकेज (उदाहरण के लिए एक विक्रेता एक्सटेंशन) के लिए उपयोग किया जा सकता है।
उत्पन्न करता है एक इंटरफ़ेस विधि इंगित करता है जो क्लाइंट को मान लौटाता है। एक गैर-आदिम मान, या एक से अधिक मान वापस करने के लिए, एक सिंक्रोनस कॉलबैक फ़ंक्शन उत्पन्न होता है।
इंटरफेस विधियों और प्रकारों का संग्रह। सी ++ या जावा में कक्षा में अनुवादित। इंटरफ़ेस में सभी विधियों को एक ही दिशा में बुलाया जाता है: क्लाइंट प्रक्रिया सर्वर प्रक्रिया द्वारा कार्यान्वित विधियों को आमंत्रित करती है।
एक तरफ़ा रास्ता जब एक HIDL पद्धति पर लागू किया जाता है, तो यह इंगित करता है कि विधि कोई मान नहीं लौटाती है और अवरुद्ध नहीं करती है।
पैकेज एक संस्करण साझा करने वाले इंटरफेस और डेटा प्रकारों का संग्रह।
निकासी HIDL की विधि है, जिसमें सर्वर एक साझा पुस्तकालय, है dlopen ग्राहक द्वारा एड। पासथ्रू मोड में, क्लाइंट और सर्वर एक ही प्रक्रिया हैं लेकिन अलग-अलग कोडबेस हैं। केवल HIDL मॉडल में लीगेसी कोडबेस लाने के लिए उपयोग किया जाता है। इन्हें भी देखें Binderized।
सर्वर प्रक्रिया जो एक इंटरफ़ेस के तरीकों को लागू करती है। यह भी देखें पासथ्रू।
परिवहन HIDL इन्फ्रास्ट्रक्चर जो सर्वर और क्लाइंट के बीच डेटा ले जाता है।
संस्करण पैकेज का संस्करण। दो पूर्णांकों से मिलकर बनता है, प्रमुख और लघु। मामूली संस्करण वृद्धि प्रकार और विधियों को जोड़ (लेकिन परिवर्तित नहीं) कर सकती है।