675 단어
3 분
One UI용 Dynamic Island 모듈 아키텍처와 최적화 여정

개요#

삼성 갤럭시 기기의 One UI 환경에서 순정 시스템 UI와 자연스럽게 어우러지는 다이나믹 아일랜드를 구현하기 위해 진행한 dynamicisland 모듈의 설계 및 아키텍처 개선 과정에 대한 기록입니다.

기존 오픈소스 모듈들의 파편화된 코드베이스와 유지보수 중단 문제를 극복하고자, 프레임워크 레벨에서 완전히 새롭게 클린룸 재구현을 진행했습니다.

sampple-korea
/
dynamicisland
Waiting for api.github.com...
00K
0K
0K
Waiting...

1. 해결하고자 했던 과제#

One UI 환경에서 서드파티 알림 UI를 오버레이할 때 발생하는 대표적인 문제는 다음과 같습니다:

  1. 상태바 및 컷아웃(Punch-hole) 좌표 오차: 기기 모델마다 다른 카메라 홀의 물리적 위치와 패딩 계산.
  2. 시스템 통화 및 전화 팝업과의 레이아웃 충돌: One UI 순정 통화 팝업이 뜰 때 오버레이가 가려지거나 겹치는 현상.
  3. 가비지 컬렉션(GC) 및 프레임 드롭: 알림 수신 시 반복적인 뷰 인플레이션으로 인한 찰나의 버벅임.

2. 핵심 구현 아키텍처#

SystemUI 훅 구조#

LSPosed 프레임워크를 통해 com.android.systemui의 알림 리스너 및 윈도우 매니저 서비스 진입점을 후킹합니다. 순정 노티피케이션 파이프라인을 가로채지 않고, 이벤트 디스패처 단계에서 실시간 메타데이터만 추출하여 격리된 렌더링 뷰로 전달합니다.

// 알림 이벤트 디스패치 파이프라인 요약
fun onNotificationPosted(sbn: StatusBarNotification) {
    if (!shouldHandleNotification(sbn)) return
    
    val islandData = IslandPayload.from(sbn)
    IslandWindowManager.updateState(islandData)
}

코너 클리핑과 애니메이션#

One UI 고유의 부드러운 스퀘어클(Squircle) 곡률에 맞춰 커스텀 Path 클리핑을 적용했습니다. 하드웨어 가속 레이어를 활성화하여 120Hz 고주사율 디스플레이에서도 렌더링 지연 없이 0ms에 수렴하는 반응 속도를 유지합니다.


3. 글로벌 배포와 커뮤니티 피드백#

  • 글로벌 큐레이션 저장소인 awesome-android-root 알림 섹션에 One UI 전용 모듈로 단독 등재되었습니다.
  • 무설치 패키지 매니저인 Obtainium 딥링크 연동 파이프라인을 구축하여 전 세계 안드로이드 파워 유저들에게 자동 업데이트 환경을 제공하고 있습니다.

지속적인 커널/프레임워크 업데이트 속에서도 가볍고 직관적인 모듈로 발전시켜 나갈 계획입니다.

One UI용 Dynamic Island 모듈 아키텍처와 최적화 여정
https://fuwari.vercel.app/posts/dynamicisland-architecture/
저자
삼플 (Siro)
게시일
2026-11-05
라이선스
CC BY-NC-SA 4.0