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

안녕하세요, 새해 복 많이 받으세요!
제가 여가 시간에 작업해 온 오픈‑소스 프로젝트를 공유하고 싶습니다.
Adaptive Theme
Adaptive Theme는 고정된 일정이 아니라 주변 광 센서를 사용해 자동으로 라이트 모드와 다크 모드 사이를 전환합니다. 이를 통해 가독성, 눈의 편안함, 그리고 배터리 수명을 최적화할 수 있습니다. 무료, 광고 없음, 오픈‑소스입니다.
- Play Store:
- GitHub Repo:
Battery Efficiency
배터리 소모를 방지하기 위해 앱은 완전히 수동적으로 동작합니다. 화면이 켜진 직후 짧은 순간에만 광 센서를 확인하는 이벤트‑드리븐 아키텍처를 사용합니다. 백그라운드에서 지속적으로 폴링하지 않으며, 시스템 브로드캐스트에만 반응합니다.
Note: 이 이벤트‑드리븐 접근 방식은 Android 14 이상에서 작동합니다. 낮은 버전에서는 리시버에서 센서를 제대로 읽을 수 없습니다.
Setup & Permissions
가장 큰 난관은 시스템 테마를 변경하기 위해 WRITE_SECURE_SETTINGS 권한이 필요하다는 점입니다. 이 권한을 부여하는 것이 간단하지 않기 때문에, 여러 방법을 제공하는 마법사 기반 설정 흐름을 마련했습니다:
- Web Tool (Recommended) – 코드를 설치하거나 ADB(WebADB)를 사용하지 않고 다른 기기에서 브라우저 기반으로 설정할 수 있는 도구입니다. 방문하세요 .
- Shizuku – Shizuku를 설치하고 설정해 두었다면 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.): 프로프라이어터리 블롭이나 트래커가 전혀 없는 클린 빌드.
여러분의 생각과 의견이 궁금합니다! 버그를 발견하거나 새로운 기능 아이디어가 있다면 알려 주세요. 질문이 있으면 언제든 답변해 드리겠습니다.