Android/Framework

Android WindowManagerService 이해하기

임베디드 친구 2025. 4. 9. 20:58
728x90
반응형

Android WindowManagerService 이해하기

Android에서 화면을 구성하고 관리하는 핵심 서비스 중 하나가 WindowManagerService(WMS)입니다. 이 글에서는 WMS의 개념, 동작 방식, 주요 구성 요소 및 AOSP 코드를 통해 구체적으로 살펴보겠습니다.

1. WindowManagerService란?

WindowManagerService(WMS)는 Android 시스템의 화면 구성 및 관리를 담당하는 서비스로, 애플리케이션이 요청하는 Window를 적절한 위치에 배치하고, Z-Order를 조정하며, 화면 전환 효과를 제공하는 역할을 수행합니다. WMS는 System Server의 일부로 동작하며, 클라이언트(애플리케이션)와 상호 작용하여 UI를 제어합니다.

1.1 주요 기능

  • 윈도우 추가, 제거, 변경 관리: 애플리케이션 및 시스템에서 요청한 윈도우를 적절하게 배치하고 제어합니다.
  • Z-Order 관리: 여러 개의 윈도우가 존재할 경우 어떤 윈도우가 전면에 배치될지를 결정합니다.
  • 화면 회전 처리: 화면 방향이 변경될 때 적절하게 UI를 조정합니다.
  • 입력 이벤트 분배: 터치 및 키 입력 이벤트를 적절한 윈도우에 전달합니다.
  • 애니메이션 효과 제공: 윈도우 전환 시 애니메이션을 적용합니다.

2. WindowManagerService의 구조

WMS는 System Server의 일부로 실행되며, 내부적으로 여러 개의 주요 컴포넌트로 구성됩니다.

2.1 주요 컴포넌트

구성 요소 설명
WindowManagerService 시스템 전체의 윈도우를 관리하는 핵심 서비스
WindowState 각 개별 윈도우를 표현하는 객체
DisplayContent 여러 개의 윈도우를 포함하는 디스플레이 단위
InputMonitor 입력 이벤트를 감시하고 적절한 윈도우에 전달
SurfaceControl 윈도우의 그래픽 버퍼를 관리하는 인터페이스

2.2 WindowManagerService의 생명주기

WMS는 System Server의 일부로 초기화되며, SystemServer.java에서 시작됩니다. 핵심적인 초기화 과정은 다음과 같습니다.

// frameworks/base/services/java/com/android/server/SystemServer.java
private void startOtherServices() {
    WindowManagerService wm = WindowManagerService.main(context, displayManager, inputManager);
    ServiceManager.addService(Context.WINDOW_SERVICE, wm);
}

이 과정에서 WindowManagerService.main() 메서드가 호출되어 WMS가 초기화됩니다.

// frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java
public static WindowManagerService main(...) {
    WindowManagerService wm = new WindowManagerService(...);
    wm.init();
    return wm;
}

3. Window 추가 및 관리 과정

애플리케이션이 새로운 윈도우를 추가할 때, WMS와 클라이언트(Application) 간의 상호작용은 다음과 같이 이루어집니다.

  1. 애플리케이션이 WindowManager.addView() 를 호출하여 새로운 윈도우를 요청합니다.
  2. 요청은 WindowManagerGlobal을 거쳐 WMS로 전달됩니다.
  3. WMS는 새로운 WindowState 객체를 생성하고 이를 관리 리스트에 추가합니다.
  4. SurfaceFlinger를 통해 실제 화면에 반영됩니다.

3.1 AOSP 코드 분석

애플리케이션에서 윈도우를 추가하는 주요 코드 흐름은 아래와 같습니다.

// frameworks/base/core/java/android/view/WindowManagerImpl.java
@Override
public void addView(View view, ViewGroup.LayoutParams params) {
    mGlobal.addView(view, params, mContext.getDisplay());
}

이 코드는 WindowManagerGlobal을 통해 WMS로 전달됩니다.

// frameworks/base/core/java/android/view/WindowManagerGlobal.java
public void addView(View view, ViewGroup.LayoutParams params, Display display) {
    ViewRootImpl root = new ViewRootImpl(view.getContext(), display);
    root.setView(view, params, panelParentView);
}

마지막으로, ViewRootImpl이 WMS에 addWindow 요청을 보냅니다.

// frameworks/base/core/java/android/view/ViewRootImpl.java
private void requestLayout() {
    mWindowSession.addToDisplay(mWindow, ...);
}

WMS에서 이를 처리하는 코드는 다음과 같습니다.

// frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java
public int addWindow(Session session, IWindow client, int seq, LayoutParams attrs, ...) {
    WindowState win = new WindowState(this, session, client, attrs, ...);
    mRoot.addWindow(win);
}

4. 윈도우 Z-Order와 Layer 관리

WMS는 여러 개의 윈도우가 존재할 때 Z-Order(윈도우의 앞뒤 순서)를 결정해야 합니다. 이를 위해 각 윈도우에는 Layer 값이 할당되며, Layer 값이 클수록 앞쪽에 위치하게 됩니다.

WMS에서 Layer는 다음과 같이 설정됩니다.

// frameworks/base/services/core/java/com/android/server/wm/WindowState.java
int getLayer() {
    return mBaseLayer + mSubLayer;
}

일반적으로 다음과 같은 Layer 값이 존재합니다.

윈도우 타입 Layer 값
일반 애플리케이션 윈도우 10000
다이얼로그 윈도우 20000
상태바(Status Bar) 30000
시스템 경고 창 40000

5. 결론

WindowManagerService(WMS)는 Android 시스템에서 UI를 구성하는 핵심 서비스로, 윈도우의 배치, 크기 조정, 입력 이벤트 관리 등 다양한 기능을 수행합니다.

본 포스팅에서는 WMS의 주요 개념, 구조, AOSP 코드 분석을 통해 윈도우가 추가되고 관리되는 과정까지 설명하였습니다. WMS는 SurfaceFlinger, InputManager, ActivityManager 등과 긴밀하게 연동되며 동작합니다.

추후 포스팅에서는 SurfaceFlinger와의 연동, 입력 이벤트 처리 과정, 멀티 디스플레이 지원 등에 대해 다룰 예정입니다. WMS의 동작 방식과 역할을 이해하면 Android의 창 관리 시스템을 보다 깊이 있게 파악하는 데 도움이 될 것입니다.

반응형