Android 9 以前では、SurfaceFlinger と DisplayManagerService
はハードコードされた ID 0 と ID 1 を持つ物理ディスプレイが最大 2 台あることを前提としていました。静的ディスプレイ ID で説明されているように、現在は SurfaceFlinger が Hardware Composer(HWC)API を利用して固定ディスプレイ ID を生成し、任意の数の物理ディスプレイを管理できます。
フレームワークは SurfaceControl#getPhysicalDisplayIds
または DisplayEventReceiver
ホットプラグ イベントから 64 ビットのディスプレイ ID を取得した後、SurfaceControl#getPhysicalDisplayToken
によって物理ディスプレイの IBinder
トークンを検索できます。
Android 10 では、プライマリ内部ディスプレイは TYPE_BUILT_IN
で、セカンダリ ディスプレイは接続タイプに関係なくすべて TYPE_HDMI
で表されます。したがって、現時点では追加の内部ディスプレイは外部ディスプレイとして扱われます。回避策として、HWC がわかっていてポート割り当てロジックが予測可能な場合は、デバイス固有のコードで DisplayAddress.Physical#getPort
に関する仮定を作成できます。
実装
以前は、32 ビット ID によってディスプレイが識別されていました。0 は内部ディスプレイ、1 は外部ディスプレイ、[2, INT32_MAX] は HWC 仮想ディスプレイで、-1 は無効なディスプレイまたは HWC 以外の仮想ディスプレイを表します。SurfaceFlinger と DisplayManagerService
が 3 台以上のディスプレイを追跡し、以前に表示されたディスプレイを認識するには、ディスプレイに固定の永続 ID が指定されている必要があります。
HWC が IComposerClient.getDisplayIdentificationData
をサポートし、ディスプレイ識別データを提供する場合、SurfaceFlinger は EDID 構造を解析し、物理ディスプレイと HWC 仮想ディスプレイに 64 ビットの固定ディスプレイ ID を割り当てます。ID はオプション タイプを使用して表されます。null 値は、無効なディスプレイまたは HWC 以外の仮想ディスプレイを表します。HWC サポートがない場合、SurfaceFlinger は物理ディスプレイが 2 台までの従来の動作にフォールバックします。