【Android】Android UI表示原理


一、window関連
WindowはAndroid Fraamewark層が提供する最も基本的なUIコンポーネント管理クラスであり、Phone Windowはその唯一の実現クラスであると言えます。WindowManagerServiceとのインタラクションを遮断し、UI設計を統一し、ユーザーインタラクティブイベント、例えば背景、title、ボタンイベントなどを統一的に受信する。
Activity/Dialog/ToastのUI表現はWindowに依存しています。UIの作成に対して、開発者はView関連だけを使用すればいいです。Viewは最終的にContentViewとしてWindowに設定されます。
Phone Window.java
  public void setContentView(int layoutResID) {
     
  }
DecorViewはPhone WindowのルートView Groupです。Windowはいくつかの列の構成項目を提供しています。異なる構成項目のDecorViewのUI構成は一定の違いがあります。
二、WindowManager
Windowの一つにWindowManagerがあります。WindowManagerといえばWindowManager Globalです。彼らの違いは:
WindowManager:Windowを管理して、Windowの設定を提供しています。WindowManager Global:これは一つの例です。すべてのWindowを管理します。そしてWindowManagerServiceと通信するBinderを含みます。WindowManagerが提供するAPIは、実はWindowManager GlobalのViewRootImplを操作するために使われています。例えばWindowManager.addViewは実際にWindowManager Globalの中でcontentViewに対応するView RootImplを作成しました。
三、VIew RootImpl
具体的なView Treeの管理を担当しています。例えば、DecorViewとそのすべてのサブビューです。具体的には次のような役割があります。
WindowManagerServiceと通信することにより、Surfaceを作成して管理するView Tree全体の測定、レイアウト、描画を表示します。具体的な方法は、performTraversalsがChororeographerを通じて、View Tree全体のUIリフレッシュ(測定、レイアウト、描画)をシステムと同期させることである。
四、Choroographer
Choroographerは、同期処理入力、アニメーション、描画(Draw)の3つのUI操作を制御するために使用される(UI表示時には各フレームで行うべきことはこの3つしかない)。その内部はQueueを維持しています。利用者はpostXXXを通じて、いくつかの列が実行されるUI操作をQueに置くことができます。これらのイベントは、Choroographerが表示システムの時間パルス(垂直同期信号−VSync信号)を受信した後に実行される。例えばView RootImplによるView Treeの更新イベント:
View Root Impl.java
void scheduleTraversals() {
     
    ...
     mChoreographer.postCallback(Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null);
}
五、Surface
View RootImplはSurfaceを含む。キャンバスとして認識できます。キャンバスを通じて絵を描くことができます。View RootImplのView Tree全体はSurfaceにdrawである。
これは実際にSurfaceFlingの中のLayerに対応しています。Surfaceで描いた内容は最終的にSurfaceFlinerによってレンダリングされます。
六、WindowManagerService
すべてのアプリケーションのWindowを管理しています。
すべてのWindowの状態を管理してSurfaceFlingと通信して、Windowのレンダリングを完成します。Window RootImplを通じてWindow Manager ServiceにWindowを追加できます。
View Root Impl.java
public void setView(View view, WindowManager.LayoutParams attrs, View panelParentView) {
     
    ...
    //mWindow   `Binder`
    res = mWindowSession.addToDisplay(mWindow, mSeq, mWindowAttributes,
                        getHostVisibility(), mDisplay.getDisplayId(), mWinFrame,
                        mAttachInfo.mContentInsets, mAttachInfo.mStableInsets,
                        mAttachInfo.mOutsets, mAttachInfo.mDisplayCutout, mInputChannel);
    ...
}
mWindowSessionは、Windows Sessionの一例であり、WindowManagerServiceと通信するBinderである。WindowManagerGlobalによって作成され、保守されているアプリケーションは一つしかありません。
七、WindowStateとWindowToken
WindowStateはWindowManagerServiceの中でWindowを表しています。これはウィンドウのすべての属性を含んでいます。ViewRootImplと対応しています。WindowManagerServiceのmWindowMap集合に保存されています。mWindowMapはシステム全体のウィンドウの一つです。
WindowTokenは同じアプリケーションコンポーネントのウィンドウに属しています。WindowManager Serviceでウィンドウ管理する過程で、WindowTokenでアプリケーションコンポーネントを表します。例えば、ウィンドウZ-Orderの並べ替えを行う場合、同じWindowTokenに属するウィンドウ(Window)が配置され、WindowをレンダリングするSurfaceのZ軸順としても理解できる。一つのtokenの下に複数のWindowState(Window)があります。
WindowManager Service.addWindow()
win.mToken.addWindow(win);//  token     win state
八、SurfaceFling er
SurfaceFling erはAndroidの最も重要なシステムサービスの一つであり、主にUIのレンダリングを担当しています。具体的にはLayerの合成とレンダリングとも言えます。以下に紹介するいくつかのオブジェクトは基本的にWindowManager Serviceに存在します。は、アプリケーションとSurfaceFlingerが相互作用するキーオブジェクトです。
九、SurfaceControl
簡単にSurfaceの管理者として理解できます。Surfaceとは一対一の関係です。SurfaceControlを構築すると同時にSurfaceを構築します。ViewRootImplのSurfaceは、実際には同じ対象を指しています。SurfaceComponeserCientを通じてSurfaceFlingerと通信することができます。例えばSurfaceFling erにSurface(Layer)の作成をお願いします。
十、SurfaceComponent Client
このオブジェクトもプロセスが唯一で、一つのアプリケーションは一つしかありません。SurfaceFling erとの接続を確立することで、SurfaceFlingerと通信することができます。具体的な通信の機能はCientオブジェクトによって完成されます。
十一、Client
これはBinderであり、SurfaceCompserCientはSurfaceFlingと通信することができます。例えば、SurfaceFling erをLayerを作成することができます。それはまた、すべてのLayerのアプリケーションを維持しています。
十二、Layer
SurfaceFlingerに管理されており、多種多様なタイプに分類されています。SurfaceFlingによってレンダリングできるユニットです。これはBufferQueueue Producerがあります。中にはたくさんのレンダリングされるGraphicBufferがあります。このブザーはレンダリングされたかもしれません。レンダリングされるかもしれません。