हॉटप्लग हैंडलिंग

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

यह पृष्ठ कंपोज़र एचएएल कार्यान्वयन में डिस्प्ले हॉटप्लग के प्रबंधन और डिस्प्ले क्षमताओं में बदलाव का वर्णन करता है। इसके अतिरिक्त यह चर्चा करता है कि संबंधित फ़्रेमबफ़र को कैसे प्रबंधित किया जाए और इन स्थितियों में दौड़ की स्थिति को कैसे रोका जाए।

प्रदर्शन क्षमताएँ अद्यतन करें

यह अनुभाग वर्णन करता है कि एंड्रॉइड फ्रेमवर्क संगीतकार एचएएल द्वारा शुरू किए गए प्रदर्शन क्षमताओं में परिवर्तनों को कैसे संभालता है।

इससे पहले कि एंड्रॉइड डिस्प्ले क्षमताओं में बदलावों को ठीक से संभाल सके, ओईएम को कंपोजर एचएएल को इस तरह लागू करना होगा कि वह डिस्प्ले क्षमताओं में किसी भी बदलाव के ढांचे को सूचित करने के लिए onHotplug(display, connection=CONNECTED) ​​का उपयोग करे। इसके लागू होने के बाद, एंड्रॉइड प्रदर्शन क्षमताओं में परिवर्तनों को निम्नानुसार संभालता है:

  1. डिस्प्ले क्षमताओं में बदलाव का पता चलने पर, फ्रेमवर्क को एक onHotplug(display, connection=CONNECTED) ​​अधिसूचना प्राप्त होती है।
  2. अधिसूचना प्राप्त होने पर, फ्रेमवर्क अपनी डिस्प्ले स्थिति को हटा देता है और getActiveConfig , getDisplayConfigs , getDisplayAttribute , getColorModes , getHdrCapabilities , और getDisplayCapabilities विधियों का उपयोग करके HAL की नई क्षमताओं के साथ इसे फिर से बनाता है।
  3. फ़्रेमवर्क एक नई डिस्प्ले स्थिति को फिर से बनाने के बाद, यह उन ऐप्स को onDisplayChanged कॉलबैक भेजता है जो ऐसी घटनाओं को सुन रहे हैं।

फ्रेमवर्क बाद के onHotplug(display, connection=CONNECTED) ​​इवेंट पर फ्रेमबफ़र्स को पुनः आवंटित करता है। नए फ़्रेमबफ़र्स के आवंटन के दौरान विफलताओं से बचने के लिए फ़्रेमबफ़र मेमोरी को ठीक से प्रबंधित करने के तरीके के बारे में अधिक जानकारी के लिए क्लाइंट फ़्रेमबफ़र प्रबंधन देखें।

सामान्य कनेक्शन परिदृश्यों को संभालें

यह अनुभाग बताता है कि प्राथमिक डिस्प्ले कनेक्ट और डिस्कनेक्ट होने पर आपके कार्यान्वयन में विभिन्न कनेक्शन परिदृश्यों को ठीक से कैसे प्रबंधित किया जाए।

मोबाइल उपकरणों के लिए निर्मित होने के कारण, एंड्रॉइड फ्रेमवर्क में डिस्कनेक्ट किए गए प्राथमिक डिस्प्ले के लिए अंतर्निहित समर्थन नहीं है। इसके बजाय एचएएल को प्राथमिक डिस्प्ले को भौतिक रूप से डिस्कनेक्ट होने की स्थिति में फ्रेमवर्क के साथ अपने इंटरैक्शन में प्लेसहोल्डर डिस्प्ले के साथ बदलना होगा।

निम्नलिखित परिदृश्य एसटीबी और टीवी डोंगल में हो सकते हैं जिनमें बाहरी रूप से कनेक्टेड डिस्प्ले होते हैं जिन्हें डिस्कनेक्ट किया जा सकता है। इन परिदृश्यों के लिए समर्थन लागू करने के लिए, नीचे दी गई तालिका में दी गई जानकारी का उपयोग करें:

परिदृश्य हैंडलिंग
बूट समय पर कोई कनेक्टेड डिस्प्ले नहीं
  • कंपोजर एचएएल से फ्रेमवर्क पर onHotplug(display, connection=CONNECTED) ​​सिग्नल भेजें।
  • कंपोज़र एचएएल के अंदर भौतिक डिस्प्ले स्थिति को प्लेसहोल्डर डिस्प्ले स्थिति से बदलें।
प्राथमिक डिस्प्ले भौतिक रूप से जुड़ा हुआ है
  • कंपोजर एचएएल से फ्रेमवर्क पर एक और onHotplug(display, connection=CONNECTED) ​​इवेंट भेजें।

    इसके कारण फ़्रेमवर्क सभी प्रदर्शन क्षमताओं को पुनः लोड करता है।

प्राथमिक डिस्प्ले भौतिक रूप से डिस्कनेक्ट हो गया है
  • कंपोजर एचएएल से फ्रेमवर्क पर एक और onHotplug(display, connection=CONNECTED) ​​इवेंट भेजें।
  • कंपोज़र एचएएल के अंदर भौतिक डिस्प्ले स्थिति को प्लेसहोल्डर डिस्प्ले स्थिति से बदलें। प्लेसहोल्डर डिस्प्ले में एक सिंगल डिस्प्ले मोड होना चाहिए, ताकि फ्रेमवर्क onDisplayChanged कॉलबैक को ऐप्स पर भेज सके (क्योंकि समर्थित मोड का सेट बदल गया है)। इस एकल डिस्प्ले मोड को डिस्कनेक्शन से पहले भौतिक डिस्प्ले के अंतिम सक्रिय मोड से मेल खाना चाहिए, ताकि ऐप्स को कॉन्फ़िगरेशन परिवर्तन ईवेंट प्राप्त न हों।

दौड़ की स्थिति को रोकने के लिए अनुक्रमिक कॉन्फ़िगरेशन आईडी का उपयोग करें

यदि कंपोजर एचएएल समर्थित डिस्प्ले कॉन्फ़िगरेशन को setActiveConfig या setActiveConfigWithConstraints कॉल करने वाले फ्रेमवर्क के साथ समवर्ती रूप से अपडेट करता है, तो रेस की स्थिति उत्पन्न हो सकती है। इसका समाधान अनुक्रमिक आईडी का उपयोग करने और इस समस्या को रोकने के लिए कंपोजर एचएएल को लागू करना है।

यह अनुभाग वर्णन करता है कि दौड़ की स्थितियाँ कैसे उत्पन्न हो सकती हैं, इसके बाद कंपोज़र एचएएल को कैसे लागू किया जाए, इस पर विवरण दिया गया है ताकि वह ऐसी स्थितियों को रोकने के लिए अनुक्रमिक आईडी का उपयोग कर सके।

घटनाओं के निम्नलिखित अनुक्रम पर विचार करें, जब नए, अनुक्रमिक आईडी को नए डिस्प्ले कॉन्फिगरेशन को नहीं सौंपा जाता है, जिससे दौड़ की स्थिति पैदा होती है:

  1. समर्थित डिस्प्ले कॉन्फ़िगरेशन आईडी हैं:

    • आईडी=1 , 1080x1920 60 हर्ट्ज़
    • आईडी=2 , 1080x1920 50 हर्ट्ज़
  2. फ्रेमवर्क setActiveConfig(display, config=1) कॉल करता है।

  3. समवर्ती रूप से, कंपोज़र एचएएल डिस्प्ले कॉन्फ़िगरेशन में बदलाव की प्रक्रिया करता है और अपनी आंतरिक स्थिति को डिस्प्ले कॉन्फ़िगरेशन के एक नए सेट में अपडेट करता है, जो निम्नानुसार दिखाया गया है:

    • आईडी=1 , 2160x3840 60 हर्ट्ज़
    • आईडी=2 , 2160x3840 50 हर्ट्ज़
    • आईडी=3 , 1080x1920 60 हर्ट्ज़
    • आईडी=4 , 1080x1920 50 हर्ट्ज़
  4. संगीतकार एचएएल फ्रेमवर्क पर एक onHotplug इवेंट भेजता है, यह सूचित करने के लिए कि समर्थित मोड का सेट बदल गया है।

  5. कंपोज़र HAL को setActiveConfig(display, config=1) (चरण 2 से) प्राप्त होता है।

  6. एचएएल का अर्थ है कि फ्रेमवर्क ने 2160x3840 60 हर्ट्ज पर कॉन्फ़िगरेशन परिवर्तन का अनुरोध किया है, हालांकि वास्तव में 1080x1920 60 हर्ट्ज वांछित था।

गैर-अनुक्रमिक आईडी असाइनमेंट का उपयोग करने की प्रक्रिया वांछित कॉन्फ़िगरेशन परिवर्तन की गलत व्याख्या के साथ यहां समाप्त होती है।

अनुक्रमिक आईडी का उपयोग करने के लिए कंपोज़र HAL को कॉन्फ़िगर करें

ऐसी दौड़ स्थितियों से बचने के लिए, OEM को कंपोज़र HAL को निम्नानुसार लागू करना होगा:

  • जब कंपोज़र एचएएल समर्थित डिस्प्ले कॉन्फ़िगरेशन को अपडेट करता है, तो यह नए डिस्प्ले कॉन्फ़िगरेशन के लिए नई, अनुक्रमिक आईडी निर्दिष्ट करता है।
  • जब फ़्रेमवर्क अमान्य कॉन्फ़िगरेशन आईडी के साथ setActiveConfig या setActiveConfigWithConstraints कॉल करता है, तो कंपोज़र HAL कॉल को अनदेखा कर देता है।

ये कदम दौड़ की स्थितियों को रोकने के लिए काम करते हैं जैसा कि निम्नलिखित चर्चा में दिखाया गया है।

घटनाओं के निम्नलिखित अनुक्रम पर विचार करें, जब नई, अनुक्रमिक आईडी नई डिस्प्ले कॉन्फ़िगरेशन को सौंपी जाती हैं:

  1. समर्थित डिस्प्ले कॉन्फ़िगरेशन आईडी हैं:

    • आईडी=1 , 1080x1920 60 हर्ट्ज़
    • आईडी=2 , 1080x1920 50 हर्ट्ज़
  2. फ्रेमवर्क setActiveConfig(display, config=1) कॉल करता है।

  3. जब डिस्प्ले कॉन्फ़िगरेशन में परिवर्तन संसाधित किया जाता है, तो कॉन्फ़िगरेशन आईडी का अगला सेट अगले अप्रयुक्त पूर्णांक से शुरू करके असाइन किया जाता है, जो निम्नानुसार दिखाया गया है:

    • आईडी=3 , 2160x3840 60 हर्ट्ज़

    • आईडी=4 , 2160x3840 50 हर्ट्ज़

    • आईडी=5 , 1080x1920 60 हर्ट्ज़

    • आईडी=6 , 1080x1920 50 हर्ट्ज़

  4. कंपोज़र एचएएल फ्रेमवर्क पर एक onHotplug इवेंट भेजता है, यह सूचित करने के लिए कि समर्थित मोड का सेट बदल गया है।

  5. कंपोज़र HAL को setActiveConfig(display, config=1) (चरण 2 से) प्राप्त होता है।

  6. कंपोज़र एचएएल कॉल को अनदेखा कर देता है क्योंकि आईडी अब मान्य नहीं है।

  7. फ्रेमवर्क चरण 4 से onHotplug इवेंट को प्राप्त करता है और संसाधित करता है। यह getDisplayConfigs और getDisplayAttribute फ़ंक्शंस का उपयोग करके कंपोज़र HAL में कॉल करता है। इन कार्यों के साथ फ्रेमवर्क 1080x1920 और 60 हर्ट्ज के वांछित रिज़ॉल्यूशन और ताज़ा दर के लिए नई आईडी (5) की पहचान करता है।

  8. फ़्रेमवर्क 5 की अद्यतन आईडी के साथ एक और setActiveConfig ईवेंट भेजता है।

  9. कंपोज़र HAL को चरण 5 से setActiveConfig(display, config=5) प्राप्त होता है।

  10. एचएएल ने सही ढंग से व्याख्या की है कि फ्रेमवर्क ने 1080x1920 60 हर्ट्ज पर कॉन्फ़िगरेशन परिवर्तन का अनुरोध किया है।

जैसा कि ऊपर दिए गए उदाहरण में दिखाया गया है, अनुक्रमिक आईडी असाइनमेंट का उपयोग करने वाली प्रक्रिया यह सुनिश्चित करती है कि दौड़ की स्थिति को रोका जाए और सही डिस्प्ले कॉन्फ़िगरेशन परिवर्तन अपडेट किया जाए।