Android WindowManager Serviceにおける表示領域階層の初期化プロセス

Androidのウィンドウ管理システムでは、起動時にRootWindowContainerが物理ディスプレイに対応する論理表示領域を構築します。この処理はsetWindowManager()メソッド内で実行され、各DisplayオブジェクトからDisplayContentインスタンスを生成し、ルートコンテナに追加します。

void setWindowManager(WindowManagerService wm) {
    final Display[] physicalDisplays = mDisplayManager.getDisplays();
    for (Display display : physicalDisplays) {
        DisplayContent area = new DisplayContent(display, this);
        addChild(area, POSITION_BOTTOM);
        if (display.getDisplayId() == Display.DEFAULT_DISPLAY) {
            mPrimaryDisplay = area;
        }
    }
}

DisplayContentのコンストラクタでは、内部サーフェスの準備と同時に、表示領域の階層構造(Display Area Hierarchy)の構築を開始します。ここで重要なのは、configureSurfaces()がトランザクションを用いてサーフェスの再親化(reparenting)を安全に行う点です。

DisplayContent(Display display, RootWindowContainer root) {
    super(root.mWindowManager, "DisplayContent", FEATURE_ROOT);
    // ...
    Transaction transaction = getPendingTransaction();
    configureSurfaces(transaction);
    // ...
}

階層構築の核心はconfigureSurfaces()内のDisplayAreaPolicy.Providerによるポリシー適用にあります。WMSはデフォルトでDefaultProviderを採用し、TaskDisplayAreaを中心とした階層を動的に生成します。このエリアはアプリケーションのActivityやウィンドウ状態(WindowState)を保持する主要なコンテナとなります。

private void configureSurfaces(Transaction transaction) {
    if (mDisplayAreaPolicy == null) {
        mDisplayAreaPolicy = mWmService.getDisplayAreaPolicyProvider()
                .instantiate(mWmService, this, this, mInputMethodArea);
    }
}

DefaultProviderinstantiate()実装では、HierarchyBuilderを用いて論理ディスプレイのルートから下位の表示領域を体系的に構成します。具体的には、TaskDisplayAreaがデフォルトのアプリケーションタスクコンテナとして作成され、RootDisplayAreaに登録されます。この構造により、ウィンドウのZ順序、可視性、入力ルーティングなどの制御が可能になります。

static final class DefaultProvider implements DisplayAreaPolicy.Provider {
    @Override
    public DisplayAreaPolicy instantiate(WindowManagerService service,
            DisplayContent content, RootDisplayArea root, DisplayArea.Tokens imeArea) {
        TaskDisplayArea mainArea = new TaskDisplayArea(
                content, service, "MainTaskArea", FEATURE_DEFAULT_TASK_CONTAINER);
        
        HierarchyBuilder builder = new HierarchyBuilder(root);
        builder.add(mainArea).build();
        return new DefaultDisplayAreaPolicy(builder.getBuiltHierarchy());
    }
}

タグ: Android WMS DisplayAreaPolicy TaskDisplayArea WindowManagerService

6月17日 21:44 投稿