원문 캡처 · natestraub.github.io
원문 캡처 · natestraub.github.io

TCL Google TV가 느려지자 한 이용자가 Claude를 활용해 앱과 시작 프로그램을 정리하고, 메모리 사용량이 적은 자체 런처를 만들었다. 런처를 Android의 어시스턴트 역할에 등록해 리모컨의 마이크 버튼으로 Meta의 Muse를 호출하도록 바꾼 경험을 소개했다.

항목변경 전변경 후
런처 메모리356 MB (FLauncher)23–27 MB
부팅 2분 후 여유 메모리1.23 GB1.57 GB
부팅 2분 후 저장소로 스왑된 용량약 414 MB약 156 MB
완전히 표시된 홈 화면까지 걸리는 시간FLauncher는 프레임마다 최대 약 5초약 365~400 ms
앱에서 홈으로 돌아가는 시간버튼을 여러 번 눌러야 함약 150~220 ms
스크롤 중 끊기는 프레임너무 많음0~3%

2021년 12월 TCL Google TV를 산 뒤 기기가 계속 느려졌다. 2024년쯤 개발자 모드에서 불필요한 앱과 광고를 없애고 다른 런처를 써 봤지만, FLauncher를 사용해도 며칠마다 TV를 완전히 재시작해야 할 만큼 느려지곤 했다. X에서 사람들이 Claude로 TV 문제를 해결한다는 글을 보고 다시 시도했다.

먼저 FLauncher와 함께 설치해 둔 Projectivy를 제거하지 않았다는 점을 확인했다. FLauncher 자체도 메모리 356 MB를 사용했고, 재부팅 2분 뒤에는 느린 내부 저장소에 약 414 MB가 스왑돼 리모컨 반응이 늦었다. 부팅 때 실행되는 앱도 여럿 있었다.

ADB(안드로이드 디버깅 도구)를 네트워크로 연결해 사용하지 않는 앱을 정리했다. TCL Channel, Alexa 연동, eSticker, 광고 메시지 상자, 홈 콘텐츠 피드와 설명서 같은 TCL 앱을 비롯해 사용하지 않는 Google 앱과 개인적으로 설치했던 앱을 제거했다. Spotify를 제외한 스트리밍 앱 12개가 백그라운드에서 실행되지 않도록 하고, 시스템 애니메이션을 끄고 Android가 메모리에 캐시하는 앱 수를 제한했다. 앱은 해당 사용자 계정에서만 제거했기 때문에 명령어 하나나 공장 초기화로 복구할 수 있다. 이 작업만으로 부팅 직후 스왑되는 메모리가 약 414 MB에서 약 139 MB로 3분의 1 수준이 됐다.

이후 Arc Launcher를 참고해 새 런처를 만들기 시작했지만, 바이너리 크기와 메모리 사용량을 줄이기 위해 Flutter 대신 네이티브 Kotlin을 택했다. 앱은 약 75 KB이고 의존성이 없다. 런처에는 가로로 움직이는 채널 행, 검색·YouTube·Spotify·Xbox 바로가기, LAN을 통해 제공하는 개인 사진 배경화면, 날씨와 시간, 일부 스트리밍 앱의 이어보기 목록이 포함됐다. OK 버튼을 길게 눌러 앱을 이동하거나 숨길 수 있고, Google TV 홈 화면을 비활성화한 뒤 작동하지 않던 설정 버튼도 다시 사용할 수 있게 했다.

앱 타일은 각각 한 번만 이미지로 그려 캐시하고, 사진은 최종 표시 크기로 그래픽 메모리에 바로 디코딩하도록 했다. 스크롤할 때는 화면을 다시 그리는 대신 요소를 이동시킨다. 이 방식으로 콜드 스타트 약 365 ms 만에 홈 화면 전체를 표시했다.

리모컨의 마이크 버튼이 Google Assistant 대신 Muse를 열도록 런처를 Android의 ‘assistant’ 역할에 등록했다. 다만 Android 11에서는 앱끼리 서로를 찾기 어려워 런처가 ‘내 리모컨 찾기’를 처리하는 것처럼 동작하게 해야 했다. TCL은 재부팅 뒤 앱의 백그라운드 실행을 막아 자체 자동 시작 권한을 찾아 적용했고, Google이 아닌 어시스턴트에는 마이크가 앱의 녹음 시작 뒤에야 켜지는 리모컨의 ‘legacy’ 모드가 적용됐다.

현재 마이크 버튼을 누르면 화면 위쪽에 Muse의 ‘M’ 표시와 상태 및 답변 말풍선이 나타난다. Muse는 앱 열기, Xbox로 전환, 재생·일시정지, 음량 조절을 할 수 있고, 화면을 캡처해 TV에 표시된 내용을 볼 수도 있다. DRM 때문에 스트리밍 앱 화면은 검게 나오지만 메뉴는 표시된다. 답변은 현재 텍스트로 제공되며, Muse의 음성 답변 기능은 플래그 뒤에 있다.

음성 인식에는 변경이 있었다. 처음에는 Google의 음성 인식기가 작동했지만 하루 뒤 중단됐다. Claude를 이용해 원인을 추적한 결과, Google 앱이 시작 10초 뒤 기존 어시스턴트 서비스를 다시 실행했고 Android가 이후 마이크 사용을 차단했다. 이 TV에서는 루트 권한 없이 이를 끌 방법이 없어 Meta의 음성 인식으로 바꿨다. Meta의 Model API 개발자 키를 발급받아 말하는 동안 리모컨 오디오를 Muse Voice Transcribe로 전송하며, 버튼을 누른 뒤 약 2초면 변환된 문장이 표시된다. 오디오 1시간당 비용은 0.18달러다. Meta에 연결할 수 없을 때는 녹음의 무음을 잘라 Muse에 음성 클립으로 보내며, 이 방식은 현재 더 느리지만 무료다.

런처와 설정 안내는 GitHub 저장소에서 확인할 수 있다. 시작점으로 참고한 Arc Launcher도 공개돼 있다.