나는 주변 빛에 따라 다크 모드를 전환하는 오픈소스 안드로이드 앱을 만들었습니다 – Adaptive Theme

발행: (2026년 1월 3일 오후 08:56 GMT+9)
4 min read
원문: Dev.to

Source: Dev.to

Cover image for I built an open-source Android app that switches dark mode based on ambient light – Adaptive Theme

안녕하세요, 새해 복 많이 받으세요!

제가 여가 시간에 작업해 온 오픈‑소스 프로젝트를 공유하고 싶습니다.

Adaptive Theme

Adaptive Theme는 고정된 일정이 아니라 주변 광 센서를 사용해 자동으로 라이트 모드와 다크 모드 사이를 전환합니다. 이를 통해 가독성, 눈의 편안함, 그리고 배터리 수명을 최적화할 수 있습니다. 무료, 광고 없음, 오픈‑소스입니다.

  • Play Store:
  • GitHub Repo:

Battery Efficiency

배터리 소모를 방지하기 위해 앱은 완전히 수동적으로 동작합니다. 화면이 켜진 직후 짧은 순간에만 광 센서를 확인하는 이벤트‑드리븐 아키텍처를 사용합니다. 백그라운드에서 지속적으로 폴링하지 않으며, 시스템 브로드캐스트에만 반응합니다.

Note: 이 이벤트‑드리븐 접근 방식은 Android 14 이상에서 작동합니다. 낮은 버전에서는 리시버에서 센서를 제대로 읽을 수 없습니다.

Setup & Permissions

가장 큰 난관은 시스템 테마를 변경하기 위해 WRITE_SECURE_SETTINGS 권한이 필요하다는 점입니다. 이 권한을 부여하는 것이 간단하지 않기 때문에, 여러 방법을 제공하는 마법사 기반 설정 흐름을 마련했습니다:

  • Web Tool (Recommended) – 코드를 설치하거나 ADB(WebADB)를 사용하지 않고 다른 기기에서 브라우저 기반으로 설정할 수 있는 도구입니다. 방문하세요 .
  • ShizukuShizuku를 설치하고 설정해 두었다면 Adaptive Theme 앱 내에서 직접 권한을 부여할 수 있습니다.
  • Root – 루팅된 기기에서는 앱 내부에서 한 번 탭하면 권한을 부여할 수 있습니다.
  • Manual ADB – 컴퓨터에 ADB가 설치되어 있다면 필요한 ADB 명령을 수동으로 실행할 수 있습니다.

Tech Stack & Architecture

  • UI: Jetpack Compose와 Material 3 / Material You를 사용해 시스템 설정 화면(스톡/Pixel)과 동일한 디자인을 구현했습니다.
  • Architecture: MVVM 기반 싱글‑액티비티 패턴.
  • Concurrency & Streams: Kotlin Coroutines와 Flows를 활용한 반응형 상태 관리.
  • Persistence: 타입‑안전 설정 저장을 위한 Jetpack DataStore.

Build Flavors

두 가지 별도 빌드 플레버가 핵심 앱을 FOSS‑준수 상태로 유지합니다:

  • Play Store: Firebase(프로프라이어터리 크래시 로그 등)를 포함합니다.
  • FOSS (GitHub Releases, etc.): 프로프라이어터리 블롭이나 트래커가 전혀 없는 클린 빌드.

여러분의 생각과 의견이 궁금합니다! 버그를 발견하거나 새로운 기능 아이디어가 있다면 알려 주세요. 질문이 있으면 언제든 답변해 드리겠습니다.

Back to Blog

관련 글

더 보기 »

Android 권한 완벽 가이드

markdown !dss99911https://media2.dev.to/dynamic/image/width=50,height=50,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuplo...