이번 주에 연달아 두 가지 중요한 버그 수정을 배포했습니다. 서로 완전히 다른 두 가지 문제였습니다. 첫 번째는 더 이상 제대로 적용되지 않던 내장 아이콘 팩 문제로, 여러 버전에 걸쳐 조용히 숨어 있던 꽤 성가신 버그였습니다. 두 번째는 왼쪽 페이지의 걸음 수 카운터가 하루의 첫 걸음을 놓칠 수 있었던 문제입니다.

1.0.8 — 아이콘 팩 복구

증상

몇 버전 전부터 Sola에 내장된 아이콘 팩(Pixelarticons, Lucide, Fluent Emoji, Bootstrap, Feather, Heroicons) 중 하나를 선택해도 의도대로 작동하지 않았습니다. 선택한 팩의 아이콘이 표시되는 대신, dock과 앱 서랍의 모든 아이콘이 Sola 자체 아이콘으로 표시되었습니다. 반면 Play 스토어에서 설치한 서드파티 아이콘 팩은 정상적으로 작동했습니다.

원인

범인은 Android의 resource shrinker였습니다. 릴리스 버전을 컴파일할 때 사용하지 않는다고 판단되는 그래픽 리소스를 APK에서 제거하는 도구입니다. 최종 앱 용량을 줄이는 데는 유용하지만, 취약한 부분이 있습니다. 만약 앱이 리소스를 동적으로 로드한다면(예를 들어 iconpack_google_chrome처럼 이름을 문자열 형태로 참조하는 경우), shrinker는 해당 리소스가 사용되고 있다는 것을 알아챌 방법이 없습니다. 그래서 조용히 삭제해버립니다.

정확히 이런 일이 Sola에 내장된 아이콘 팩을 구성하는 558개의 아이콘에 벌어졌습니다. 사용자가 팩을 선택하는 시점에 이름을 통해 동적으로 로드되다 보니, 빌드 시점의 shrinker 눈에는 보이지 않았던 것입니다.

수정 내용

해결책은 iconpack_로 시작하는 이름을 가진 모든 리소스를 무조건 유지하도록 shrinker에게 명시적으로 지시하는 res/raw/keep.xml 파일입니다.

이번 작업을 하면서 팩 선택 화면도 함께 개선했습니다. 이제 팩을 탭하면 즉시 미리보기가 적용되어(dock과 홈 화면이 바로 업데이트됩니다), 선택을 확정하기 위한 "적용" 플로팅 버튼이 나타납니다. 결과를 확인하려고 메뉴를 나갈 필요가 없어졌습니다. dock, 홈 화면, 앱 서랍은 팩을 변경한 뒤에도 항상 완벽하게 동기화됩니다.

비슷한 버그가 다시 발생하지 않도록 세 가지 자동화 테스트를 추가했습니다. 558개의 drawable이 모두 정상적으로 resolve되는지 확인하는 단위 테스트, 선택한 팩이 모든 컴포넌트에 제대로 전파되는지 확인하는 테스트, 그리고 A → B → 기본값 순환을 시뮬레이션하며 state 누수가 없는지 확인하는 테스트입니다.

1.0.9 — 더 견고해진 걸음 수 카운터

증상

왼쪽 페이지(대시보드)에 표시되는 걸음 수 카운터가 처음 열었을 때 0으로 표시된 뒤, 그 시점부터 카운트를 시작하는 문제가 있었습니다. 구체적으로 말하면, 왼쪽 페이지를 열지 않은 채 아침에 3,000걸음을 걸었다면 페이지를 연 후 첫 이벤트가 들어올 때까지 그 걸음 수가 표시되지 않았습니다.

원인

카운터 로직이 왼쪽 페이지의 컴포저블에 직접 통합되어 있었습니다. 그 결과, 걸음 수 센서는 이 페이지가 화면에 보일 때만 이벤트를 수신했습니다. 홈 화면이나 앱 서랍으로 스와이프하는 순간 카운터는 이벤트 수신을 멈췄습니다.

Android에서 걸음 수 하드웨어 센서(TYPE_STEP_COUNTER)는 마지막 재부팅 이후 누적됩니다. 하드웨어는 24시간 내내 카운트하기 때문에 걸음을 놓치는 일은 없습니다. 하지만 어떤 앱도 그 이벤트를 능동적으로 수신하고 있지 않다면 화면에 표시되는 값은 갱신되지 않습니다. 여기에 더해, 당일 걸음 수를 계산하는 기준선(baseline)이 첫 이벤트를 받은 시점, 즉 왼쪽 페이지를 처음 연 시점에만 설정된다는 문제도 있었습니다.

수정 내용

로직을 왼쪽 페이지와 독립적으로 존재하는 싱글턴 컴포넌트인 StepCounterManager로 분리했습니다. Activity Recognition 권한이 부여되는 즉시 활성화되며, 앱이 메모리에 로드되어 있는 한(기본 launcher의 경우 거의 항상 그렇습니다) 계속 활성 상태를 유지합니다. 그 결과 센서는 걸음 수 이벤트를 끊임없이 수신하고, 기준선은 그날의 첫 걸음에서(훨씬 이른 시점에) 설정되며, 페이지를 열 때 표시되는 값은 항상 최신 상태입니다.

추가로 마지막으로 알려진 값이 이제 세션 간에도 유지됩니다. 화면에 일시적으로 0이 표시되는 일도 사라졌습니다. 왼쪽 페이지를 다시 열면 마지막 이벤트 값이 즉시 복원되고, 센서가 새 이벤트를 보내는 즉시 실제 값이 기록됩니다.

제한이 심한 Android 기기에 대한 참고

메모리 관리 정책이 공격적인 일부 기기(중국의 일부 Xiaomi, Huawei, OnePlus 기기)에서는 Sola가 기본 launcher로 설정되어 있어도 프로세스가 강제 종료될 수 있습니다. 이런 드문 경우, 그날의 기준선이 다음 재부팅 시 다시 계산되면서 그 사이의 걸음 수가 유실될 가능성이 남아 있습니다. Sola와 무관하게 24시간 이력을 유지하는 Health Connect 기반 해결책을 향후 버전에서 검토 중입니다. 이 방식이 도입되면 이런 예외 상황이 완전히 사라지겠지만, Google Play에 대한 행정 절차가 필요해 이후 버전으로 미뤄둔 상태입니다.

업데이트 받는 방법

두 버전 모두 Play 스토어를 통해 순차적으로 배포되고 있습니다. 24~48시간 이내에 모든 사용자에게 제공될 예정입니다. Play 스토어 앱의 "앱 및 기기 관리" 섹션에서 직접 업데이트를 확인할 수도 있습니다.

Google Play에서 열기