주간 앱 빌드로그

안드로이드 홈 화면 위젯, 앱이랑 같은 화면을 두 번 짜고 색 값 하나에 앱이 죽었습니다

Minsu1999 2026. 11. 3. 22:50

지난 글은 11월 2일에 앱을 다섯 개 언어로 넓힌 이야기였는데, 이번 글은 그보다 사흘 앞선 10월 30일 이야기입니다. 오늘의 운세 앱의 홈 화면 위젯만 따로 다듬은 날인데, 앱 화면에 있는 그림을 위젯으로 옮기는 데 같은 걸 두 번 만들어야 했고, 색을 나타내는 숫자 하나 때문에 위젯을 홈에 올리는 순간 앱이 통째로 꺼지는 일도 있었습니다. 코드는 이번에도 제가 손대지 않았습니다.

밤하늘 배경 위에 금색 눈금 링이 들어간 홈 화면 위젯 카드 두 개를 그린 그림

이날 클로드 코드한테 시킨 건 이거였습니다. "오늘 작업은 위젯 디자인 변경 만 좀 다듬고 우리 앱에 모든 페이지 스샷찍어서 클로드페이지로 잘 정리해서 보내줘봐." 앞선 글에 쓴 것처럼 앱 화면은 밤하늘 느낌으로 한 번 뒤집어 놨는데, 홈 화면 위젯은 그 전 디자인에서 글꼴만 명조로 바꾼 상태로 남아 있었습니다. 폰 홈에 놓고 보니 앱을 열었을 때랑 위젯이 서로 다른 앱처럼 보였고, 4×2 크기는 글자가 위쪽에만 몰리고 아래가 비어 있었습니다.

10월 29일 위젯과 10월 30일 새 위젯을 나란히 놓고 비교한 이미지

그래서 앱 화면에 있는 천문 기구 모양의 금색 눈금 링과 오늘의 달을 위젯에도 넣기로 했는데, 여기서 안드로이드 위젯의 제약이 나왔습니다. 위젯 화면은 앱이 직접 그리는 게 아니라 런처라는 다른 앱이 대신 그려 주는 구조라서, 정해진 몇 가지 요소만 쓸 수 있고 앱에서 쓰던 그리기 코드나 글꼴 파일을 그대로 가져다 쓸 수가 없습니다. 결국 클로드는 앱 쪽에서 플러터로 그려 둔 링과 달을 코틀린 코드로 처음부터 다시 그렸습니다. 같은 디자인을 두 번 만든 셈인데, 숫자에 쓴 영문 서체만큼은 앱 안에 들어 있는 글꼴 파일을 직접 불러와서 두 화면의 숫자 모양이 어긋나지 않게 했습니다. 다만 그림으로 그린 건 링과 달과 숫자까지만이고, 운세 문장은 글자 그대로 두었습니다. 글까지 그림으로 만들면 용량을 줄이려고 덜어낸 글꼴에 없는 글자가 깨질 수 있고, 화면을 소리로 읽어 주는 기능에서도 읽히지 않기 때문입니다.

배경도 밤하늘로 바꿨는데, 앱처럼 매번 새로 그리지는 않았습니다. 위젯은 그린 결과를 런처에 통째로 넘기는 방식이라 큰 그림을 매번 만들면 한도에 걸릴 수 있어서, 먹색 바탕에 자두색과 남색, 청록색 빛을 겹치는 건 설정 파일로 처리하고 별은 12KB짜리 그림 한 장을 얹는 쪽으로 갔습니다. 처음 결과에는 운세 문장 옆에 별이 하나 떠 있어서 마침표처럼 보였는데, 글자가 놓이는 자리의 별만 어둡게 하고 반짝이는 별은 오른쪽 위로 모아서 정리했습니다.

새로 만든 4×2와 4×1 홈 화면 위젯 캡처

디자인이 거의 잡혔을 때 앱이 죽었습니다. 위젯을 홈 화면에 올리자마자 앱까지 강제 종료됐는데, 로그에 남은 건 java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer 한 줄이었습니다. 원인은 행운의 색이었습니다. 색을 나타내는 값이 4294166227이었는데 이 숫자가 32비트 정수로 담을 수 있는 범위를 넘어서, 플러터에서 위젯으로 값을 넘겨 주는 라이브러리가 더 큰 그릇에 저장해 버렸고 코틀린 쪽에서는 정수로 꺼내 읽으려다 터진 것입니다. 색을 숫자가 아니라 글자로 저장하고 읽을 때 변환하도록 바꿔서 해결했습니다. 그런데 고친 빌드를 올렸더니 이번에는 java.lang.Long cannot be cast to java.lang.String이 났습니다. 앞선 빌드가 저장해 둔 옛날 값이 에뮬레이터에 그대로 남아 있었기 때문인데, 이 값은 그날 개발 중에만 생긴 것이고 출시된 적이 없어서 저장값만 지우고 넘어갔습니다.

한글 줄바꿈도 손봤습니다. 위젯의 글자 칸은 한글을 글자 하나하나 단위로 끊어서, "하루의 운을 올립니다"가 "운"과 "을" 사이에서 줄이 바뀌고 있었습니다. 해결 방법은 눈에 보이지 않는 글자 하나였는데, 한 낱말 안의 글자 사이사이에 줄을 바꾸지 말라는 뜻의 문자(U+2060)를 끼워 넣으니 낱말 단위로만 줄이 바뀌었습니다. 문장이 끝나는 자리에서는 줄을 바꾸게 했고, 칸이 작아서 총운이 다 안 들어가면 첫 문장만 보여 주도록 했습니다. 위젯 크기를 사용자가 바꿨을 때 다시 그리는 처리도 이때 같이 들어갔습니다.

글자 단위로 끊기던 줄바꿈과 낱말 단위로 바뀐 줄바꿈을 비교한 그림
가장 긴 운세 문구로 시험한 위젯 캡처

위젯을 끝내고 나서 실제로 울리는 아침 알림을 찍으려는데 여기서 시간을 꽤 썼습니다. 알림 시간을 바꾸려고 에뮬레이터의 시간 선택 화면에 숫자를 넣는 작업이 다섯 번 어긋났는데, 명령으로 보낸 글자가 아예 들어가지 않거나, 키보드를 닫으려고 보낸 뒤로가기가 선택 창까지 닫아 버리거나, 칸에 이미 들어 있는 숫자 때문에 새 숫자가 안 들어가거나, 두 자리를 치는 순간 커서가 분 칸으로 넘어가서 엉뚱한 시각이 들어가는 식이었습니다. 결국 알림은 세 시간 뒤로 잡혔고, 클로드는 알림 시간을 다시 고치는 대신 에뮬레이터의 시계를 그 시각 직전으로 옮겨서 실제로 울리는 알림을 찍고 시계를 되돌렸습니다.

마지막으로 앱을 지웠다가 다시 설치해서 첫 실행부터 모든 화면을 한 장씩 찍었습니다. 찍는 동안 그때까지 못 보고 있던 문제가 여섯 개 나왔는데, 앱을 처음 켤 때 밤하늘 앱인데도 흰 화면이 잠깐 지나가는 것, 설정 화면을 스크롤하면 "설정" 제목과 아래 항목 글자가 겹치는 것, 앱 본문도 위젯처럼 글자 단위로 끊겨서 "옵니/다"로 잘리던 것, 알림에 뜨는 작은 아이콘이 달 모양이 아니라 속이 빈 동그라미로 나오는 것, 알림이 설정한 시각보다 늦게 올 수 있는데 스토어 설명에는 "원하는 시간"이라고 적어 둔 것, 시간 선택기의 선택 칸 색이 안드로이드 기본 보라색이라 금색 디자인과 따로 노는 것이었습니다. 화면을 하나씩 늘어놓고 보는 것만으로도 검수가 된 셈입니다.

설정 화면을 스크롤했을 때 제목과 항목 글자가 겹친 캡처

이날은 위젯만 다듬기로 한 날이어서 여섯 개는 기록만 해 두었고, 사흘 뒤 다섯 개 언어 작업을 하면서 함께 고쳤습니다. 남은 숙제도 하나 있는데, 위젯을 세로로 줄이면 4×1 모양으로 바뀌도록 짜 놓은 부분은 제가 쓰는 에뮬레이터 런처에서 아래쪽 손잡이를 끌어도 줄어들지 않아서 아직 확인하지 못했습니다. 실제 폰에 깔아 보는 날 같이 볼 생각입니다.

다음 글에서는 2주차 앱으로 무엇을 고를지 정한 이야기를 쓰겠습니다.