ב-Android 9 (וגרסאות קודמות), SurfaceFlinger ו-DisplayManagerService
הניחו שיש לכל היותר שני מסכים פיזיים עם מזהי 0 ו-1 שמוגדרים בקוד. כפי שמתואר בקטע מזהי תצוגה סטטיים, SurfaceFlinger משתמש עכשיו ב-API של Hardware Composer (HWC) כדי ליצור מזהי תצוגה יציבים, שמאפשרים לו לנהל מספר שרירותי של תצוגות פיזיות.
המסגרת יכולה לחפש את האסימון IBinder
של צג פיזי דרך SurfaceControl#getPhysicalDisplayToken
אחרי קבלת מזהה הצג בן 64 הביט מ-SurfaceControl#getPhysicalDisplayIds
או מאירוע DisplayEventReceiver
של חיבור חם.
ב-Android 10, המסך הפנימי הראשי הוא TYPE_BUILT_IN
וכל המסכים המשניים מסומנים בתור TYPE_HDMI
, ללא קשר לסוג החיבור. לכן, מסכים פנימיים נוספים נחשבים כרגע כמסכים חיצוניים. כפתרון עקיף, אפשר להשתמש בקוד ספציפי למכשיר כדי להניח ערכים ל-DisplayAddress.Physical#getPort
אם ה-HWC ידוע והלוגיקה של הקצאת השקעים צפויה.
הטמעה
בעבר, המסכים זוהו באמצעות מזהי 32 ביט, כאשר 0 הוא המסך הפנימי, 1 הוא המסך החיצוני, [2, INT32_MAX] הם מסכים וירטואליים של HWC ו--1 מייצג מסך לא חוקי או מסך וירטואלי שאינו של HWC. כדי ש-SurfaceFlinger ו-DisplayManagerService
יוכלו לעקוב אחרי יותר משני צגים ולזהות צגים שנצפו בעבר, צריך להקצות לצגים מזהי ייעודיים ועקביים.
אם ה-HWC תומך ב-IComposerClient.getDisplayIdentificationData
ומספק נתוני זיהוי של המסך, SurfaceFlinger מנתח את המבנה של EDID ומקצה מזהי מסך יציבים של 64 ביט למסכים פיזיים ולמסכים וירטואליים של HWC. המזהים מוצגים באמצעות סוג אפשרות, שבו הערך null מייצג תצוגה לא חוקית או תצוגה וירטואלית שאינה HWC. ללא תמיכה ב-HWC, SurfaceFlinger חוזרת לפעולה מהדור הקודם עם שני מסכים פיזיים לכל היותר.