शर्त के साथ इस्तेमाल किए जाने वाले सभी बिल्ड फ़्लैग की जानकारी देने के लिए, आपको 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
कॉन्फ़िगरेशन आइटम.