이틀 사이 Samsung Galaxy A06을 겨냥한 두 번째 수정입니다. 어제 배포된 1.0.10은 이 기기에서 발생하던 시작 시 충돌을 수정했습니다. 1.0.10이 설치된 지 몇 시간 만에 Google Play Console을 통해 새로운 문제가 접수되었는데, 이번에는 ANR(앱이 몇 초간 멈춤)이었습니다. 상세한 리포트 덕분에 빠르게 수정할 수 있었고, 이번 버전은 드로어에서 아이콘 네온 효과가 표시되지 않던 문제도 함께 해결합니다.
1.0.11 — Samsung Galaxy A06 시작 ANR
증상
Samsung Galaxy A06(Android 16)에서 설치 후 Sola를 처음 실행하면, 앱이 5~6초 동안 멈췄다가 Android가 "Sola 응답 없음 — 대기 / 강제 종료" 대화 상자를 표시했습니다. 1.0.10의 충돌과 달리 앱이 갑자기 종료되지는 않았지만, 몇 초 동안 사용할 수 없는 상태로 남아 있었습니다.
기술적으로 Play Console이 보고한 트레이스는 "Input dispatching timed out" 유형의 ANR을 나타냈습니다. Android는 메인 스레드가 입력 이벤트(탭, 스와이프)를 5초 이내에 처리하는지 감시합니다. 이를 초과하면 시스템은 앱이 멈췄다고 판단하고 사용자에게 종료를 제안합니다.
원인
Samsung Galaxy A06은 보급형 프로세서(Unisoc T606, 1.6GHz 쿼드코어)와 성능이 낮은 GPU를 탑재하고 있습니다. Sola가 평소 테스트되는 기기(Pixel 8 Pro, Pixel Tablet)보다 몇 배는 느립니다.
홈 화면 시작 시, Sola는 그리드에 있는 모든 앱 아이콘(일반적으로 15~25개, 폴더 안에 정리된 것까지 포함)을 한 번의 패스로 로드합니다. 각 아이콘은 PackageManager.getApplicationIcon()을 거치는데, 이는 대상 APK를 열고 어댑티브 아이콘의 XML 정의를 읽은 다음 두 개의 비트맵 이미지(전경 레이어와 배경)를 디코딩하는 Android 메서드입니다.
Pixel 8 Pro에서는 각 디코딩에 약 10밀리초가 걸립니다 — 20개 아이콘이 300ms 미만에 표시되어 전혀 눈에 띄지 않습니다. A06에서는 동일한 디코딩에 아이콘당 200~500밀리초가 걸립니다. 20개 아이콘 × 300ms = 6초의 멈춤입니다. 게다가 이 로딩이 메인 스레드(사용자의 탭을 처리하는 스레드)에서 실행되고 있었기 때문에 ANR이 발생했습니다.
수정 내용
홈 그리드에 데이터를 공급하는 플로우는 이제 flowOn(Dispatchers.IO)를 통해 입출력 스레드 풀로 격리됩니다. 구체적으로, 모든 아이콘 디코딩이 이제 전용 스레드에서 병렬로 실행됩니다. 최종 목록(20개 아이콘이 모두 디코딩된 후)만 표시를 위해 메인 스레드에 도착합니다. 무거운 로딩 중에도 메인 스레드는 항상 반응성을 유지합니다.
동일한 문제를 겪고 있던, 폴더와 그 안의 앱 목록을 제공하는 플로우에도 같은 수정이 적용되었습니다.
Galaxy A06 사양(720×1600, 260dpi, Android 16, 느린 속도를 재현하기 위한 소프트웨어 GPU)을 재현한 에뮬레이터에서 검증한 결과: 홈 화면이 즉시 표시되며 ANR이 전혀 발생하지 않습니다.
드로어에서 빠진 아이콘 네온 효과
증상
내장 아이콘 팩(Pixelarticons, Lucide, Game-Icons 등)을 선택하고 "네온 효과" 옵션을 활성화하면, 홈 화면, 폴더, 독에서는 아이콘에 빛나는 후광이 잘 표시되었습니다. 그러나 앱 드로어에서는 후광이 사라지고 아이콘이 네온 효과 없이 평면적인 색상으로만 표시되었습니다.
원인
네온 효과는 렌더링 시점에 원본 아이콘을 감싸 후광을 추가하는 드로어블 래퍼(drawable-wrapper)로 구현되어 있습니다. 앱 아이콘을 로드하는 코드 경로는 두 가지로, 하나는 홈 화면과 폴더용이고 다른 하나는 (설치된 모든 앱을 한 번에 나열하는) 드로어용입니다.
홈 화면에서 사용하는 경로에는 이 래퍼를 보존하기 위한 예외 처리가 이미 존재했습니다. 드로어에서 사용하는 경로에는 이 예외 처리가 없어서, 항상 constantState.newDrawable()을 호출해 드로어블의 새 인스턴스를 생성했는데, 이는 네온 래퍼를 벗겨내는 부작용을 일으켜 그 아래의 평면 아이콘만 남게 되었습니다.
수정 내용
NeonDrawable 예외 처리를 드로어 경로로 이식했습니다. 로드된 아이콘이 네온 래퍼인 경우, 복제하지 않고 있는 그대로 유지합니다. 이제 다른 곳과 마찬가지로 드로어에서도 후광 효과가 보존됩니다.
두 경로(홈 화면과 드로어)와 그 반대 동작(팩 변경 시 부작용을 방지하기 위해 일반 드로어블은 반드시 복제되어야 함)을 고정하기 위해 세 개의 단위 테스트가 추가되었습니다. 앞으로 이런 유형의 회귀는 사전에 감지될 것입니다.
업데이트 받는 방법
1.0.11은 Play 스토어를 통해 단계적으로 배포됩니다(사용자 20%에서 시작해 24~48시간에 걸쳐 100%까지 점진적으로 확대). 이틀 안에 모든 사용자가 이용할 수 있을 것입니다. Play 스토어 앱의 "앱 및 기기 관리" 섹션에서 업데이트 확인을 강제로 실행할 수도 있습니다.
Google Play에서 열기