יכולות התצוגה (כמו מצבי תצוגה וסוגי HDR נתמכים) יכולות להשתנות באופן דינמי במכשירים שמחוברים אליהם מסכים חיצוניים (עם HDMI או DisplayPort), כמו ממירים של Android TV ומכשירי OTT. השינוי הזה יכול לקרות כתוצאה מאות HDMI hotplug, למשל כשמשתמש עובר ממסך אחד למסך אחר או מפעיל את המכשיר בלי מסך מחובר. Android מגרסה 12 ואילך כולל שינויים במסגרת לטיפול בהחלפה חמה וביכולות תצוגה דינמיות.
בדף הזה מוסבר על הטיפול בהחלפה מהירה של צגים ושינויים ביכולות הצגה בהטמעה של Composer HAL. בנוסף, מוסבר בו איך לנהל את מאגר המסגרות המשויך ולמנוע מרוצי תהליכים במצבים האלה.
עדכון יכולות התצוגה
בקטע הזה מוסבר איך מסגרת Android מטפלת בשינויים ביכולות התצוגה שמופעלים על ידי Composer HAL.
כדי שמערכת Android תוכל לטפל בצורה נכונה בשינויים ביכולות התצוגה, יצרן הציוד המקורי צריך להטמיע את Composer HAL כך שישתמש ב-onHotplug(display, connection=CONNECTED) כדי להודיע למסגרת על שינויים ביכולות התצוגה. אחרי ההטמעה, מערכת Android מטפלת בשינויים ביכולות התצוגה באופן הבא:
- כשמזוהה שינוי ביכולות התצוגה, ה-framework מקבל התראה מסוג
onHotplug(display, connection=CONNECTED). - כשמתקבלת ההתראה, המסגרת משמיטה את מצב התצוגה שלה ויוצרת אותו מחדש עם היכולות החדשות מ-HAL באמצעות השיטות
getActiveConfig,getDisplayConfigs,getDisplayAttribute,getColorModes,getHdrCapabilitiesו-getDisplayCapabilities. - אחרי שהמסגרת יוצרת מחדש מצב תצוגה חדש, היא שולחת את הקריאה החוזרת (callback)
onDisplayChangedלאפליקציות שממתינות לאירועים כאלה.
המסגרת מקצה מחדש את מאגרי המסגרות באירועי onHotplug(display, connection=CONNECTED) הבאים. מידע נוסף על ניהול נכון של זיכרון מאגר המסגרות כדי למנוע כשלים במהלך הקצאה של מאגרי מסגרות חדשים זמין במאמר בנושא ניהול מאגר המסגרות של הלקוח.
טיפול בתרחישי חיבור נפוצים
בקטע הזה נסביר איך לטפל בצורה נכונה בתרחישי חיבור שונים בהטמעות שלכם, כשהמסך הראשי מחובר ומנותק.
מסגרת Android מיועדת למכשירים ניידים, ולכן אין בה תמיכה מובנית במסך ראשי מנותק. במקום זאת, ה-HAL צריך להחליף את התצוגה הראשית בתצוגה של placeholder באינטראקציות שלו עם המסגרת, במקרה של ניתוק פיזי של התצוגה הראשית.
התרחישים הבאים יכולים להתרחש בממירים ובמתאמים לטלוויזיה עם מסכים שמחוברים חיצונית וניתנים לניתוק. כדי להטמיע תמיכה בתרחישים האלה, אפשר להיעזר במידע שבטבלה הבאה:
| תרחיש | שימוש |
|---|---|
| אין מסך מחובר בזמן האתחול |
|
| המסך הראשי מחובר פיזית |
|
| המסך הראשי מנותק פיזית |
|
שיקולים לגבי חיבור שאינו HDMI
ב-Android TV קיימת תמיכה רק ברזולוציות הבאות:
- 720x1280
- 1080x1920
- 2160x3840
- 4320x7680
כשממיר או מתאם לטלוויזיה מנסים להציג רזולוציה שלא נתמכת, כמו 480i דרך חיבור CVBS, מוצגת למשתמש הודעת שגיאה.
אם לממיר או למתאם ה-TV יש חיבור HDMI וחיבור שאינו HDMI, חיבור ה-HDMI הוא התצוגה הראשית והחיבור שאינו HDMI לא פעיל. כתוצאה מכך, אם חיבור ה-HDMI מנותק בזמן שחיבור שאינו HDMI עדיין מחובר, אירוע נשלח אל SurfaceFlinger והיכולות של המסך שאינו HDMI צריכות להשתקף דרך getDisplayAttribute וממשקי API אחרים של IComposerClient (כמו getHdrCapabilities).
שימוש במזהי הגדרות עוקבים כדי למנוע מרוץ תהליכים
מצבי מירוץ יכולים להתרחש אם ה-HAL של Composer מעדכן את תצורות התצוגה הנתמכות במקביל למסגרת שקוראת ל-setActiveConfig או ל-setActiveConfigWithConstraints. כדי לפתור את הבעיה הזו, צריך להטמיע את Composer HAL כדי להשתמש במזהים עוקבים.
בקטע הזה מוסבר איך מרוץ תהליכים עלול להתרחש, ואחר כך מפורט איך מטמיעים את Composer HAL כך שהוא ישתמש במזהים עוקבים כדי למנוע מצבים כאלה.
כדאי לעיין ברצף האירועים הבא, שבו מזהים חדשים ורציפים לא מוקצים להגדרות התצוגה החדשות, מה שגורם למרוץ תהליכים:
מזהי התצורה הנתמכים לתצוגה הם:
- id=1, 1080x1920 60 Hz
- id=2, 1080x1920 50 Hz
המסגרת קוראת ל-
setActiveConfig(display, config=1).במקביל, ה-HAL של Composer מעבד שינוי בהגדרות התצוגה ומעדכן את המצב הפנימי שלו לקבוצה חדשה של הגדרות תצוגה, כפי שמוצג בהמשך:
- id=1, 2160x3840 60 Hz
- id=2, 2160x3840 50 Hz
- id=3, 1080x1920 60 Hz
- id=4, 1080x1920 50 Hz
Composer HAL שולח אירוע
onHotplugל-framework, כדי להודיע שקבוצת המצבים הנתמכים השתנתה.ה-HAL של Composer מקבל את
setActiveConfig(display, config=1)(משלב 2).ה-HAL מפרש שהמסגרת ביקשה שינוי בהגדרה ל-2160x3840 60 Hz, למרות שבפועל נבחרה ההגדרה 1080x1920 60 Hz.
התהליך שבו נעשה שימוש בהקצאות מזהים לא רציפות מסתיים כאן בפרשנות שגויה של שינוי ההגדרה שנבחר.
הגדרת Composer HAL לשימוש במזהים עוקבים
כדי להימנע ממצבי מירוץ כאלה, יצרן הציוד המקורי צריך להטמיע את Composer HAL באופן הבא:
- כש-Composer HAL מעדכן את תצורות התצוגה הנתמכות, הוא מקצה מזהים חדשים ורציפים לתצורות התצוגה החדשות.
- כשמסגרת קוראת ל-
setActiveConfigאו ל-setActiveConfigWithConstraintsעם מזהה הגדרה לא תקין, ה-HAL של Composer מתעלם מהקריאה.
השלבים האלה נועדו למנוע מצבי מירוץ, כפי שמוסבר בהמשך.
כדאי לעיין ברצף האירועים הבא, שמתרחש כשמוקצים מזהים חדשים עוקבים להגדרות התצוגה החדשות:
מזהי התצורה הנתמכים לתצוגה הם:
- id=1, 1080x1920 60 Hz
- id=2, 1080x1920 50 Hz
המסגרת קוראת ל-
setActiveConfig(display, config=1).כשמעבדים שינוי בהגדרות התצוגה, המערכת מקצה את קבוצת מזהי ההגדרות הבאה החל מהמספר השלם הבא שלא נמצא בשימוש, כמו שמוצג כאן:
id=3, 2160x3840 60 Hz
id=4, 2160x3840 50 Hz
id=5, 1080x1920 60 Hz
id=6, 1080x1920 50 Hz
Composer HAL שולח אירוע
onHotplugל-framework, כדי להודיע שהשתנה סט המצבים הנתמכים.ה-HAL של Composer מקבל את
setActiveConfig(display, config=1)(משלב 2).ה-HAL של Composer מתעלם מהשיחה כי המזהה כבר לא תקף.
המסגרת מקבלת את האירוע
onHotplugמשלב 4 ומעבדת אותו. היא קוראת ל-HAL של Composer באמצעות הפונקציותgetDisplayConfigsו-getDisplayAttribute. באמצעות הפונקציות האלה, המסגרת מזהה את המזהה החדש (5) של הרזולוציה וקצב הרענון שנבחרו, 1080x1920 ו-60 Hz.המסגרת שולחת אירוע
setActiveConfigנוסף עם מזהה מעודכן של 5.ה-HAL של Composer מקבל
setActiveConfig(display, config=5)משלב 5.שכבת ה-HAL מפרשת נכון את העובדה שה-framework ביקש שינוי בהגדרה ל-1080x1920 60 Hz.
כפי שמוצג בדוגמה הקודמת, התהליך שמשתמש בהקצאות רציפות של מזהים מוודא שמרוץ התהליכים נמנע ושהעדכון של שינוי הגדרת התצוגה מתבצע בצורה נכונה.