HAL इंटरफ़ेस बनाना

अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है

शर्त के साथ इस्तेमाल किए जाने वाले सभी बिल्ड फ़्लैग की जानकारी देने के लिए, आपको HIDL का इस्तेमाल करना होगा इकट्ठा करने की सुविधा मिलती है. काम के बिल्ड फ़्लैग को ग्रुप में रखना चाहिए. साथ ही, इन्हें सिंगल .hal फ़ाइल. कॉन्फ़िगरेशन आइटम तय करने के लिए HIDL का इस्तेमाल करना इसमें ये फ़ायदे शामिल हैं:

  • वर्शन-युक्त (नए कॉन्फ़िगरेशन आइटम जोड़ने के लिए, वेंडर/OEM को HAL)
  • दस्तावेज़ होने चाहिए
  • SELinux का इस्तेमाल करके ऐक्सेस कंट्रोल करना
  • इसके ज़रिए कॉन्फ़िगरेशन आइटम की जांच करें वेंडर टेस्ट सुइट (रेंज की जांच, आइटम के बीच इंटर-डिपेंडेंसी की जांच वगैरह)
  • C++ और Java, दोनों में अपने-आप जनरेट होने वाले एपीआई

फ़्रेमवर्क में इस्तेमाल किए गए बिल्ड फ़्लैग की पहचान करना

सबसे पहले उन बिल्ड कॉन्फ़िगरेशन की पहचान करें जिनका इस्तेमाल शर्तों के साथ कॉन्फ़िगरेशन के लिए किया जाता है. फ़्रेमवर्क चुनें, तो सेट को छोटा करने के लिए पुराने कॉन्फ़िगरेशन को छोड़ दें. उदाहरण के लिए, 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 वर्शन पर). उदाहरण के लिए, surfaceflinger के लिए HAL इंटरफ़ेस फ़ाइल बनाने के लिए, hardware/interfaces/configstore/1.0/ISurfaceFlingerConfigs.hal:

package android.hardware.configstore@1.0;

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

.hal फ़ाइल बनाने के बाद, चलाएं नई इमेज जोड़ने के लिए hardware/interfaces/update-makefiles.sh .hal फ़ाइल को Android.bp और Android.mk फ़ाइलें.

बिल्ड फ़्लैग के लिए फ़ंक्शन जोड़ें

हर बिल्ड फ़्लैग के लिए, इंटरफ़ेस में एक नया फ़ंक्शन जोड़ें. उदाहरण के लिए, 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 को रिटर्न टाइप के तौर पर इस्तेमाल करें. ऊपर दिए गए उदाहरण में, NumBuffers enum वैल्यू. ऐसे कस्टम डेटा टाइप तय करते समय, फ़ील्ड या ईनम वैल्यू जोड़ें ( उदाहरण, USE_DEFAULT) से पता चलता है कि वैल्यू दी गई है या नहीं एचएएल ने किया था.

किसी सिंगल बिल्ड फ़्लैग के लिए, एचडीएल. मॉड्यूल के मालिक, एक-दूसरे से जुड़े हुए बिल्ड फ़्लैग जोड़ सकते हैं. एक संरचना और एक ऐसा फ़ंक्शन हो जो उस संरचना को लौटाता है (ऐसा करने से वह कम हो सकता है फ़ंक्शन कॉल की संख्या).

उदाहरण के लिए, दो बिल्ड फ़्लैग को एक ही स्ट्रक्चर में एग्रीगेशन करने का विकल्प 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 पेयर को अलग-अलग फ़ाइलों और एचएएल सेवा में सेव किया जाता है उन फ़ाइलों को पढ़कर/पार्स करके वैल्यू देता है.

इस तरीके को समझना आसान है, लेकिन इसमें इसके फ़ायदे शामिल नहीं हैं HIDL की ओर से दिया गया (लागू होने वाला वर्शन, दस्तावेज़ में आसानी, ऐक्सेस कंट्रोल) इसलिए, इसका सुझाव नहीं दिया जाता है.

एक और कई इंटरफ़ेस

कॉन्फ़िगरेशन आइटम के लिए HAL इंटरफ़ेस के डिज़ाइन में दो तरह की सुविधाएं शामिल हैं विकल्प:

  • एक ऐसा इंटरफ़ेस जिसमें सभी कॉन्फ़िगरेशन आइटम शामिल होते हैं
  • कई इंटरफ़ेस, जिनमें से हर एक में मिलते-जुलते कॉन्फ़िगरेशन का सेट शामिल होता है आइटम

सिंगल इंटरफ़ेस ज़्यादा आसान है, लेकिन कई बार इसे मैनेज नहीं किया जा सकता कॉन्फ़िगरेशन आइटम एक ही फ़ाइल में जोड़े जाते हैं. इसके अलावा, ऐक्सेस कंट्रोल सटीक नहीं होता, इसलिए जिस प्रक्रिया को इंटरफ़ेस तक पहुंच दी जाती है, वह सभी कॉन्फ़िगरेशन आइटम (कॉन्फ़िगरेशन आइटम के आंशिक सेट का ऐक्सेस नहीं दिया जा सकता दी गई है). इसके अलावा, अगर ऐक्सेस नहीं दिया जाता है, तो कॉन्फ़िगरेशन आइटम पढ़ें.

इन समस्याओं की वजह से, Android एक ही एचएएल वाले कई इंटरफ़ेस इस्तेमाल करता है का इंटरफ़ेस भी इस्तेमाल किया जा सकता है. उदाहरण के लिए, surfaceflinger से संबंधित ISurfaceflingerConfigs कॉन्फ़िगरेशन आइटम, और ब्लूटूथ से जुड़े डिवाइसों के लिए IBluetoothConfigs कॉन्फ़िगरेशन आइटम.