Skip to content

[Add] :systembars — 화면 배경에 맞춰 상태바/내비바 아이콘 명암·색을 바꾸는 모듈 - #9

Merged
sonms merged 21 commits into
masterfrom
feat/systembars
Oct 25, 2026
Merged

sonms merged 21 commits into
masterfrom
feat/systembars

Conversation

@sonms

@sonms sonms commented Oct 23, 2026 •

Copy link
Copy Markdown
Owner

요약

:systembars 모듈 추가. edge-to-edge 앱에서 상태바 / 내비게이션바 아이콘 명암을 화면 배경에 맞춰 바꾸고, 필요하면 바 영역을 직접 칠한다. 배경색을 직접 지정하거나 실제로 그려진 픽셀을 샘플링해서 자동으로 고른다.

  • Modifier.systemBars(status, navigation, statusPaint, navigationPaint), SystemBarsHost, SystemBarsDialog, SystemBarsConfig / ScrimModel
  • BarContent: Auto · AutoWindow(PixelCopy) · Background(color) · Light · Dark · Inherit
  • BarPaint: None(기본, 투명) · Sampled · Solid(color) — 윈도우 색 속성이 아니라 노드가 바 영역에 칠한다
  • 스택형 레지스트리: 더 깊은 노드가 이기고, 같은 깊이면 나중에 붙은 쪽이 이긴다. Inherit 는 바마다 아래로 내려간다
  • 3버튼 내비: API 29+ 는 스크림 모델로 합성 대비를 계산, API 28 이하는 window.navigationBarColor 를 스크림으로 사용
  • 설계 문서 systembars/ARCHITECTURE.md, 사용 문서 systembars/README.md, 공개 API KDoc 한/영 병기 + Dokka
  • :app 에 SystemBars 데모 탭 (스크롤 / 비교 / 지정색 / Dialog / SurfaceView / 겹침 / 바 칠하기)

샘플링 방식

평소엔 drawContent() 만 한다. 샘플 시점에만 노드 캔버스를 16×160 소프트웨어 비트맵으로 잠깐 바꿔 한 번 더 그리고 바 아래 행만 읽는다(GPU read-back 없음). 결과는 Compose State 가 아니라 윈도우 컨트롤러에 직접 적용해서 리컴포지션을 일으키지 않는다.

테스트

  • JVM 단위 23개 (휘도 / 히스테리시스 / 스크림 / 레지스트리 / BarSlot)
  • 계측 15개: S8(API 28) 실패 0 · 스킵 2, 에뮬레이터(API 37, 3버튼) 실패 0 · 스킵 1 (API 별 스킵)
  • Compose 컴파일러 메트릭에서 공개 컴포저블 restartable skippable, 파라미터 stable, 계측 테스트로 샘플링 중 컴포지션 1회 확인
  • Dokka 경고 0건

성능 (S8 API 28, 스크롤, 4라운드 중앙값)

modifier 없음 간격 300ms 간격 100ms
debug p95 / p99 약 19 / 26ms 약 25 / 50ms 약 42 / 63ms
release p95 / p99 약 13 / 17.5ms 약 20 / 31ms 약 21 / 29ms

샘플 1회는 debug 약 4ms 지만 서브트리 재기록 비용이 더 커서 스크롤 중 프레임 꼬리가 늘어난다. 기본 간격은 300ms. jank 비율은 라운드 편차가 커서 지표로 쓰지 않았다. PixelCopy 를 Auto 기본으로 쓰는 안은 측정했지만 이득이 없어 채택하지 않았다(네이티브 대체도 병목이 픽셀 연산이 아니라 해당 없음). LeakCanary 로 Activity 30회 파괴 시 retained 객체 없음.

바 칠하기(BarPaint) 비용 (S8 release, 간격 300ms, 3라운드 중앙값)

설정 p50 p90 p95 p99
modifier 없음 6ms 13ms 17ms 23ms
Auto, 칠하기 없음 7ms 19ms 22ms 32ms
Auto + Sampled 7ms 19ms 22ms 38ms
Auto + Solid 5ms 17ms 18ms 21ms

Solid 는 Auto 와 같이 쓰면 샘플링을 건너뛰고 사각형 하나만 그려서 modifier 없음과 비슷하다. Sampled 는 Auto 샘플링 비용에 사각형 한 번이 더해지는 정도(p99 차이는 라운드 간 겹쳐 노이즈일 수 있음). 설정당 3회라 p99 는 흔들리고, 칠하기 사각형 자체의 순수 비용은 이 해상도에서는 확인되지 않았다.

알려진 한계 / 미확인

  • 스크롤 중 프레임 꼬리가 늘어난다 (release p95 약 +7ms)
  • 스크림 색은 근사값이라 기기마다 다를 수 있다. 에뮬레이터(API 37) 외 실제 3버튼 기기의 스크림 색은 미확인
  • Pager / NavHost 에서 화면 밖 페이지도 레지스트리에 등록된다(가시성 모름) → 후속 :systembars-navigation 어댑터 영역
  • 가로 모드 3버튼, 태블릿 태스크바는 미검증
  • Layout Inspector 리컴포지션 카운트는 수동 확인 필요
  • Maven Central 발행(io.github.sonms:systembars:0.0.1)은 아직 실제 업로드로 검증하지 않음

참고

  • 가려진 Auto 노드는 샘플링을 건너뛴다(별도 커밋). 프레임 지연에서는 이득이 측정되지 않았지만 바 칠하기의 "이기는 노드만 칠한다"에 필요해서 유지했다.
  • 커밋 19개를 그대로 올린다.

🤖 Generated with Claude Code

sonms and others added 21 commits October 23, 2026 09:24
…t, Dialog 헬퍼

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
- 부모 draw 는 자식만 다시 그려질 때 재실행되지 않아 스크롤 중 샘플이 거의 안 돌았음 → OnDrawListener 로 프레임 감지
- 자기 재그리기가 일으킨 프레임은 무시(무한 루프 방지)
- 상태바/내비바를 한 번의 콘텐츠 패스로 읽음, 캔버스 교체 후 size 를 쓰던 축척 버그 수정
- Trace 섹션 SystemBars.sample / SystemBars.apply 추가

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
config 가 바뀌면 컨트롤러가 새로 만들어지고 이전 것이 dispose 되어,
이미 붙어 있던 노드의 apply 가 무시되던 문제 수정. 회귀 계측 테스트 추가.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
프레임 지연 측정에서는 이득도 손해도 확인되지 않았다(S8 release, 노이즈 큼).
바 칠하기 기능이 '이기는 노드만 칠한다'를 필요로 해서 isWinner/변경 리스너를 유지한다.
데모에 STACKED 모드, 회귀 계측 테스트 추가.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…이하 스크림 보정

- Modifier.systemBars(statusPaint, navigationPaint): 노드가 바 영역을 직접 칠한다(윈도우 색 속성 미사용)
- 스택에서 이기는 노드만 칠하고, Solid 는 Auto 와 쓰면 샘플링 없이 아이콘 판정
- API 29 미만 3버튼 내비바는 window.navigationBarColor 를 스크림으로 사용
- JVM/계측 테스트, 데모 '바 칠하기' 모드, README/ARCHITECTURE 갱신

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@sonms
sonms merged commit 7b593e0 into master Oct 25, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant